算法分析:
(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);
};