函数编程如下:
TYPE * delete(TYPE * head,int num)
{
TYPE *pf,*pb;
if(head==NULL) /*如为空表, 输出提示信息*/
{ printf("\nempty list!\n");
goto end;}
pb=head;
while (pb->num!=num && pb->next!=NULL)
/*当不是要删除的结点,而且也不是最后一个结点时,继续循环*/
{pf=pb;pb=pb->next;}/*pf指向当前结点,pb指向下一结点*/
if(pb->num==num)
{if(pb==head) head=pb->next;
/*如找到被删结点,且为第一结点,则使head指向第二个结点,
否则使pf所指结点的指针指向下一结点*/
else pf->next=pb->next;
free(pb);
printf("The node is deleted\n");}
else
printf("The node not been foud!\n");
end:
return head;
}
函数有两个形参,head为指向链表第一结点的指针变量,num删结点的学号。 首先判断链表是否为空,为空则不可能有被删结点。若不为空,则使pb指针指向链表的第一个结点。进入while语句后逐个查找被删结点。找到被删结点之后再看是否为第一结点,若是则使head指向第二结点(即把第一结点从链中删去),否则使被删结点的前一结点(pf所指)指向被删结点的后一结点(被删结点的指针域所指)。如若循环结束未找到要删的结点, 则输出“末找到”的提示信息。最后返回head值。
[例7.13]写一个函数,在链表中指定位置插入一个结点。在一个链表的指定位置插入结点, 要求链表本身必须是已按某种规律排好序的。例如,在学生数据链表中, 要求学号顺序插入一个结点。设被插结点的指针为pi。 可在三种不同情况下插入。
1. 原表是空表,只需使head指向被插结点即可。见图7.7(a)
2. 被插结点值最小,应插入第一结点之前。这种情况下使head指向被插结点,被插结点的指针域指向原来的第一结点则可。即:pi->next=pb;
head=pi; 见图7.7(b)
3. 在其它位置插入,见图7.7(c)。这种情况下,使插入位置的前一结点的指针域指向被插结点,使被插结点的指针域指向插入位置的后一结点。即为:pi->next=pb;pf->next=pi;
4. 在表末插入,见图7.7(d)。这种情况下使原表末结点指针域指向被插结点,被插结点指针域置为NULL。即:
该博客讨论了如何在链表中实现节点的删除和插入操作。删除操作通过遍历链表找到目标节点并更新指针来完成,而插入操作则需要根据节点值在已排序链表中的位置进行,考虑了四种不同的插入情况:空表、值最小、中间位置和表尾插入。这些操作对于理解和实现链表数据结构至关重要。
1425

被折叠的 条评论
为什么被折叠?



