C语言练习:链表03——删除链表

算法分析:

(1)首先必须找到准备删除的节点。从头指针head开始,依次比较输入的学号和每个节点中的学号是否相等。设一个指针变量p1,依次指向每个节点,即p1每次后移一个节点。

(2)找到节点后,修改节点的链接关系。即将该节点前一个节点指针域中的指针由指向该节点改为指向下一个节点即可。还要删除节点的前一个节点,因此应再设一个指针变量p2,始终指向p1所指的前一个节点。

(3)删除该节点后,释放该节点所占内存空间。

此外还有以下几种特殊情况需要考虑。

(1)若删除的节点是第一个节点,则直接讲头指针head该为指向第二个节点。

(2)若找不到删除的节点,则应该输出提示信息。

(3)若链表为空,则应输出提示信息。

删除链表的函数如下:

struct student* del(struct student *head,int num)  //形参num为要删除节点数据域中的一个值
{
	struct student* p1, * p2;
	if (head==NULL)
	{
		printf("\nThe List is NULL!\n");
		return(head);
	}
	p1 = head;  //p1指向第一个节点
	while (p1->num!=num&&p1->next!=NULL)    //p1所指的节点不是要删除的节点,也不是尾节点
	{
		p2 = p1;   //p2移到p1的位置
		p1 = p1->next;  //p1后移一个节点
	}
	if (p1->num == num)   //找到了要删除的节点
	{
		if (p1 == head)   
			head = p1->next;   //若p1所指为第一个节点,则直接令head指向其后一个节点
		else
		{
			p2->next = p1->next;  //否则令其前一个节点的next指向其后一个节点
		}
		free(p1);  //释放p1所指节点的空间
		prinf("Delete:%d\n", num);  //输出删除的数据
		n = n - 1;   //节点数减一
	}
	else
	{
		prinf("%d is not been found!\n", num);    //找不到该节点,则输出提示信息
	}
	return(head);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值