Re:从零开始的算法学习【8】链表(3)

从链表中删除结点:

有以下三种情形。

①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变为野指针,而且链表在内存中也被完全地释放掉了。

猜你喜欢

转载自blog.csdn.net/vincemar/article/details/80325411