下面是详细的攻略。
C语言实现单链表算法示例分享
什么是单链表
单链表是一种数据结构,它由一个个节点组成,每个节点包含两个部分:一个是数据部分,另一个是指针部分,指针部分指向下一个节点的位置。单链表的节点是动态分配的,可以随时插入、删除,是一种非常灵活的数据结构。
为什么要使用单链表
在进行一些操作时,数组或者普通的指针会遇到很多麻烦。比如在删除数组元素时,在删除元素后需要将后面的元素全部向前移动,这个操作的时间复杂度是O(n),效率很低。而单链表的删除,则只需要改变指针,时间复杂度是O(1),效率很高。因此,单链表是一种非常实用的数据结构。
单链表的基本操作
单链表的基本操作包括:创建、插入、删除、遍历共四个操作。
创建操作
创建操作是指创建一个新的单链表。在C语言中,我们可以这样定义一个单链表:
typedef struct ListNode{
int data; // 数据部分
struct ListNode *next; // 指针部分,指向下一个节点
}ListNode, *LinkList;
这里,我们定义了一个名为ListNode的结构体,包含数据部分和指针部分,此后便可通过LinkList类型来创建新的链表。
创建操作实现代码如下:
LinkList createList(int data[], int n){
ListNode *head, *p, *q; // head作为链表头部,p、q作为链表的中间节点
int i; // i用于循环
head = (ListNode *)malloc(sizeof(ListNode)); // 申请链表头部内存空间
q = head; // q作为中间节点
for(i=0;i<n;i++){
p = (ListNode *)malloc(sizeof(ListNode)); // 申请内存节点空间
p->data = data[i]; // 赋值data
q->next = p; // 连接前节点和后节点
q = p; // 中间节点前移
}
q->next = NULL; // 将最后一个节点如当前节点,尾节点的指针指向 NULL,即 NULL 是链表的标志。
return head; // 返回单链表的头指针
}
以上代码实现了一个简单的创建链表的操作,创建了一个长度为n的链表。
插入操作
插入操作是指在链表中插入新的节点。当我们需要在链表中插入一个新的节点时,需要找到插入节点的位置。假设我们要在第i个节点后插入一个新的节点j,那么新的节点j应该先指向节点i的下一个节点,再让节点i指向节点j。插入操作的实现代码如下:
LinkList insertNode(LinkList head, int i, int e){
ListNode *p, *q, *newNode; // p是节点i的前驱节点,q是节点i的后继节点,newNode是新的节点
p = head;
for(int j=1;j<i;j++){
if(p==NULL) // 未找到第i-1个节点
return head;
p = p->next;
}
q = p->next;
newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = e;
p->next = newNode;
newNode->next = q;
return head;
}
以上代码实现了在链表中插入节点的功能,需要注意的是,在插入一个节点时,我们需要先寻找到要插入节点的位置,再进行插入操作。
删除操作
删除操作是指在链表中删除一个节点。假设我们要删除第i个节点,我们需要先找到节点i的前一个节点p,再将p的指针指向节点i的后一个节点q,最后再将节点i删除即可。删除操作的实现代码如下:
LinkList deleteNode(LinkList head, int i){
ListNode *p, *q; // p是节点i的前驱节点,q是节点i的后继节点
p = head;
for(int j=1;j<i;j++){
if(p == NULL) // 未找到第i个节点
return head;
p = p->next;
}
q = p->next; // q是节点i的后继节点
p->next = q->next; // 将p的指针指向q的后继节点
free(q); // 删除节点q
return head;
}
以上代码实现了在链表中删除节点的功能,同样需要注意的是,我们需要先找到要删除节点的位置,再进行删除操作。
遍历操作
遍历操作是指遍历整个链表,并输出每个节点的值。遍历操作的实现代码如下:
void traverse(LinkList head){
ListNode *p = head->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
以上代码实现了遍历链表的操作,可以通过遍历链表来输出节点的值。
示例说明
示例1:创建链表
假设有如下数组:
int data[] = {3,4,1,7,5,6,9,0,2,8};
我们可以使用下面的代码将其转化为一个链表:
LinkList list = createList(data, 10);
以上代码实现了创建一个长度为10的链表,其中包含数组data[]中的元素。
示例2:删除节点
假设我们创建的链表如下:
3 -> 4 -> 1 -> 7 -> 5 -> 6 -> 9 -> 0 -> 2 -> 8
我们可以使用下面的代码删除第4个节点:
list = deleteNode(list, 4);
以上代码实现了删除链表中的第4个节点,从而得到以下链表:
3 -> 4 -> 1 -> 5 -> 6 -> 9 -> 0 -> 2 -> 8
总结
通过本文,我们了解了单链表的基本操作及其原理,同时通过实例也更加直观地了解了如何在C语言中实现单链表算法。作为一种非常实用灵活的数据结构,单链表在计算机科学中有着非常重要的应用,值得我们深入学习和应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现单链表算法示例分享 - Python技术站