• 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的值也有了改动, 故需求把这个指针前往主调函数。



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

  • 相关阅读:
    android studio 汉化 个性化 美化 快速操作项目 目录
    Where should we fork this repository?
    剑指offer-链表中环的入口节点
    剑指offer-两个链表的第一个公共节点
    剑指offer-链表中倒数第k个结点
    算法导论-快速排序
    剑指offer-旋转数组的最小数字
    剑指offer-数组中出现次数超过一半的数字
    PAT1048. Find Coins(01背包问题动态规划解法)
    17网易-优雅的点
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975581.html
Copyright © 2020-2023  润新知