删除链表结点
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (pCur == head){ //删除第一个结点
head = pCur->next;
}else{
//删除当前结点
pPre->next = pCur->next;
}
free(pCur); //释放当前结点内存
}else{
printf("学号 %d 不存在!\n",num);
}
return head; }
pPre->next = pCur->next; free(pCur);
具体过程参见图9-2(b)和图9-2(c)。
0x3d2540 数据 1
0x3d2580
0x3d256ቤተ መጻሕፍቲ ባይዱ 数据 2
0x3d2580
0x3d2540 前驱结点 指针 pPre
0x3d2560 当前删除结 点指针 pCur
(a) 删除链表结点:初始状态
4. 删除链表结点
从一个动态链表中删去一个结点的算法描述如下: 1)从第一个结点开始,根据特定的数据域,查找指定值的结点; 2)如果找到就将该结点删除;如未找到,就将后移一个结点,如此进行下去,直到遇 到表尾为止。 删除结点实际是修改链表中该结点的前驱结点与后继结点之间的链接关系,把要删除的 当前结点从链表中分离出来,完成删除,并保证链表不会断开。 以图9-2(a)所示链表为例,假设通过查找已经确定要删除的结点为由指针pCur所指向的 结点,指针pPre指向其前驱结点。实现删除结点的具体步骤很简单,就是修改前驱结点指针 域指向当前结点的后继结点,然后释放当前结点。代码如下:
*/ struct student *deleteNode(struct student *head, int num){
//pCur 为当前结点地址,pPre 为前驱结点地址 struct student *pCur,*pPre; //指向第一个结点 pCur = head; if ( pCur == NULL ){ //空链表
0x3d25a800
(c) 删除链表结点:释放当前结点后 图 9-2 删除链表结点过程
【例9-6】为在链表中删除指定学号的学生结点的函数实现。函数的参数为链表头指针 和指定的学号;返回删除结点后的链表头指针。
例 9-6: useLinkedList.c(节选)
/* 删除结点; deleteNode() 删除链表中学号为参数 num 的结点 返回删除指定结点后的链表
printf("空链表!\n"); return NULL; }
//查找指定学号的结点 while (pCur != NULL && num != pCur->num) {
pPre = pCur; pCur = pCur->next; }
if(pCur != NULL){ //找到结点
printf("删除:%d\n", num);
0x3d2540
数据 1 0x3d2580
0x3d2560 数据 2
0x3d2580
0x3d2540 前驱结点 指针 pPre
0x3d2560 当前删除结 点指针 pCur
(b) 删除链表结点:修改前驱结点指针域
0x3d2540 数据 1
0x3d2580
0x3d2580
0x3d2540 前驱结点 指针 pPre