从链表中删除结点:
有以下三种情形。
①q所指向的是链表的第一个结点。
②q所指向的结点的前驱结点的指针已知。
void delLink(LinkList *list,LinkList r,LinkList q) { if(q == *list) //删除链表结点的第一种情况 { *list = q->next; } else //删除链表结点的第二种情况 r->next = q->next; free(q); //释放掉q所指向的空间 }
③q所指向的结点的前驱结点的指针未知。
void delLink(LinkList *list,LinkList q) { LinkList r; if( q == *list) { *list = q->next; free(q); } else for(r = *list;r->next!=q;r=r->next) //遍历链表,找到q的前驱结点的指针 { if(r->next!=NULL) { r->next=q->next; //从链表中删除q指向的结点 free(q); //释放掉q所指向的空间 } } }
当q所指向的是链表的第一个结点时,只需将q所指结点的指针域next的值赋值给头指针list,让list指向第二个结点,再释放掉q所指结点即可。
当q所指向的结点的前驱结点的指针已知时(假设为r),只需将q所指结点的指针域next的值赋值给r的指针域next,再释放掉q所指结点即可。
链表的销毁:
void destoryLinkList(LinkList *list) { LinkList p,q; p = *list; while(p) { q = p->next; free(p); p = q; } *list = NULL; }
步骤:
(1)首先将*list的内容赋值给p,这样p也指向链表的第一个结点,成为了链表的表头。
(2)然后判断只要p不为空(NULL),就将p指向下一个结点的指针(地址)赋值给q,并调用函数free()释放掉p所指向的结点,再进行p = q的操作,也就是p再指向下一个结点。如此循环,直到链表为空为止。
(3)最后将*list的内容置为NULL,这样主函数中的链表list就为空了,防止了list变为野指针,而且链表在内存中也被完全地释放掉了。