C言语教程第七章:机关与团结(6)



  creat函数用于创立一个有n个结点的链表,它是一个指针函数,它前往的指针指向stu机关。在creat函数内界说了三个stu机关的指针变量。head为头指针,pf 为指向两相邻结点的前一结点的指针变量。pb为后一结点的指针变量。在for语句内,用malloc函数创立长度与stu长度相等的空间作为一结点,首地址赋予pb。然后输入结点数据。倘使以后结点为第一结点(i==0),则把pb值 (该结点指针)赋予head和pf。如非第一结点,则把pb值赋予pf 所指结点的指针域成员next。而pb所指结点为以后的最初结点,其指针域赋NULL。 再把pb值赋予pf以作下一次循环筹办。
  creat函数的形参n,表示所建链表的结点数,作为for语句的循环次数。图7.4表示了creat函数的实验历程。

[例7.11]写一个函数,在链表中按学号查找该结点。
TYPE * search (TYPE *head,int n)
{
TYPE *p;
int i;
p=head;
while (p->num!=n && p->next!=NULL)
p=p->next; /* 不是要找的结点后移一步*/
if (p->num==n) return (p);
if (p->num!=n&& p->next==NULL)
printf ("Node %d has not been found!\n",n
}
  本函数中垄断的标记常量TYPE与例7.10的宏界说相同,便是struct stu。函数有两个形参,head是指向链表的指针变量,n为要查找的学号。进入while语句,逐个反省结点的num成员能否便是n,倘使未便是n且指针域未便是NULL(不是最初结点)则后移一个结点,继续循环。如找到该结点则前往结点指针。 如循环中断仍未找到该结点则输入“未找到”的提醒信息。

[例7.12]写一个函数,删除链表中的指定结点。删除一个结点有两种情况:
1. 被删除结点是第一个结点。这种情况只需使head指向第二个结点即可。即head=pb->next。其历程如图7.5所示。
2. 被删结点不是第一个结点,这种情况使被删结点的前一结点指向被删结点的后一结点即可。即pf->next=pb->next。其历程如图7.6所示。
函数编程如下:
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。即:
pb->next=pi;
pi->next=NULL; TYPE * insert(TYPE * head,TYPE *pi)
{
TYPE *pf,*pb;
pb=head;
if(head==NULL) /*空表拔出*/
(head=pi;
pi->next=NULL;}
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{pf=pb;
pb=pb->next; }/*找拔出地位*/
if(pi->num<=pb->num)
{if(head==pb)head=pi;/*在第一结点之前拔出*/
else pf->next=pi;/*在其它地位拔出*/
pi->next=pb; }
else
{pb->next=pi;
pi->next=NULL;} /*在表末拔出*/
}
return head;}
  本函数有两个形参均为指针变量,head指向链表,pi 指向被插结点。函数中首先鉴定链表能否为空,为空则使head指向被插结点。表若不空,则用while语句循环查找拔出地位。找到之后再鉴定能否在第一结点之前拔出,倘使则使head 指向被插结点被插结点指针域指向原第一结点,否则在其它地位拔出, 若拔出的结点除夜于表中全部结点,则在表末拔出。本函数前往一个指针, 是链表的头指针。 当拔出的地位在第一个结点之前时, 拔出的新结点成为链表的第一个结点,是以head的值也有了改动, 故需求把这个指针前往主调函数。



版权声明: 原创作品,承诺转载,转载时请务必以超链接方式标明文章 原始出处 、作者信息和本声明。否则将清查司法责任。

posted @ 2011-03-07 18:42  蓝色的天空III  阅读(181)  评论(0编辑  收藏  举报