久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      C語(yǔ)言入門之結(jié)構(gòu)(3)

         結(jié)構(gòu)指針變量作函數(shù)參數(shù)

         在ANSI C標(biāo)準(zhǔn)中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。 但是這種傳送要將全部成員逐個(gè)傳送, 特別是成員為數(shù)組時(shí)將會(huì)使傳送的時(shí)間和空間開(kāi)銷很大,嚴(yán)重地降低了程序的效率。 因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。 這時(shí)由實(shí)參傳向形參的只是地址,從而減少了時(shí)間和空間的開(kāi)銷。

         [例7.8]題目與例7.4相同,計(jì)算一組學(xué)生的平均成績(jī)和不及格人數(shù)。

         用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。

      struct stu
      {
        int num;
        char *name;
        char sex;
        float score;}boy[5]={
         {101,”Li ping”,’M’,45},
         {102,”Zhang ping”,’M’,62.5},
         {103,”He fang”,’F’,92.5},
         {104,”Cheng ling”,’F’,87},
         {105,”Wang ming”,’M’,58},
        };
      main()
      {
        struct stu *ps;
        void ave(struct stu *ps);
        ps=boy;
        ave(ps);
      }
      void ave(struct stu *ps)
      {
        int c=0,i;
        float ave,s=0;
        for(i=0;i<5;i++,ps++)
        {
         s+=ps->score;
         if(ps->score<60) c+=1;
        }
        printf(“s=%fn”,s);
        ave=s/5;
        printf(“average=%fncount=%dn”,ave,c);
      }

         本程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變量ps。boy 被定義為外部結(jié)構(gòu)數(shù)組,因此在整個(gè)源程序中有效。在main 函數(shù)中定義說(shuō)明了結(jié)構(gòu)指針變量ps,并把boy的首地址賦予它,使ps指向boy 數(shù)組。然后以ps作實(shí)參調(diào)用函數(shù)ave。在函數(shù)ave 中完成計(jì)算平均成績(jī)和統(tǒng)計(jì)不及格人數(shù)的工作并輸出結(jié)果。與例7.4程序相比,由于本程序全部采用指針變量作運(yùn)算和處理,故速度更快,程序效率更高。.

         topoic=動(dòng)態(tài)存儲(chǔ)分配

         在數(shù)組一章中,曾介紹過(guò)數(shù)組的長(zhǎng)度是預(yù)先定義好的, 在整個(gè)程序中固定不變。C語(yǔ)言中不允許動(dòng)態(tài)數(shù)組類型。例如: int n;scanf(“%d”,&n);int a[n]; 用變量表示長(zhǎng)度,想對(duì)數(shù)組的大小作動(dòng)態(tài)說(shuō)明, 這是錯(cuò)誤的。但是在實(shí)際的編程中,往往會(huì)發(fā)生這種情況, 即所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),而無(wú)法預(yù)先確定。對(duì)于這種問(wèn)題, 用數(shù)組的辦法很難解決。為了解決上述問(wèn)題,C語(yǔ)言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要?jiǎng)討B(tài)地分配內(nèi)存空間, 也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。 常用的內(nèi)存管理函數(shù)有以下三個(gè):

         1.分配內(nèi)存空間函數(shù)malloc

         調(diào)用形式: (類型說(shuō)明符*) malloc (size) 功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長(zhǎng)度為”size” 字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 “類型說(shuō)明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。(類型說(shuō)明符*)表示把返回值強(qiáng)制轉(zhuǎn)換為該類型指針?!皊ize”是一個(gè)無(wú)符號(hào)數(shù)。例如: pc=(char *) malloc (100); 表示分配100個(gè)字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為字符數(shù)組類型, 函數(shù)的返回值為指向該字符數(shù)組的指針, 把該指針賦予指針變量pc。

         2.分配內(nèi)存空間函數(shù) calloc

         calloc 也用于分配內(nèi)存空間。調(diào)用形式: (類型說(shuō)明符*)calloc(n,size) 功能:在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說(shuō)明符*)用于強(qiáng)制類型轉(zhuǎn)換。calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結(jié)構(gòu)長(zhǎng)度。因此該語(yǔ)句的意思是:按stu的長(zhǎng)度分配2塊連續(xù)區(qū)域,強(qiáng)制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。

         3.釋放內(nèi)存空間函數(shù)free

         調(diào)用形式: free(void*ptr); 功能:釋放ptr所指向的一塊內(nèi)存空間,ptr 是一個(gè)任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域:[例7.9]分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)。

      main()
      {
        struct stu
        {
         int num;
         char *name;
         char sex;
         float score;
        } *ps;
        ps=(struct stu*)malloc(sizeof(struct stu));
        ps->num=102;
        ps->name=”Zhang ping”;
        ps->sex=’M’;
        ps->score=62.5;
        printf(“Number=%dnName=%sn”,ps->num,ps->name);
        printf(“Sex=%cnScore=%fn”,ps->sex,ps->score);
        free(ps);
      }

         本例中,定義了結(jié)構(gòu)stu,定義了stu類型指針變量ps。 然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)的指針變量對(duì)各成員賦值,并用printf 輸出各成員值。最后用free函數(shù)釋放ps指向的內(nèi)存空間。 整個(gè)程序包含了申請(qǐng)內(nèi)存空間、使用內(nèi)存空間、釋放內(nèi)存空間三個(gè)步驟, 實(shí)現(xiàn)存儲(chǔ)空間的動(dòng)態(tài)分配。鏈表的概念在例7.9中采用了動(dòng)態(tài)分配的辦法為一個(gè)結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來(lái)存放一個(gè)學(xué)生的數(shù)據(jù), 我們可稱之為一個(gè)結(jié)點(diǎn)。有多少個(gè)學(xué)生就應(yīng)該申請(qǐng)分配多少塊內(nèi)存空間, 也就是說(shuō)要建立多少個(gè)結(jié)點(diǎn)。當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作, 但如果預(yù)先不能準(zhǔn)確把握學(xué)生人數(shù),也就無(wú)法確定數(shù)組大小。 而且當(dāng)學(xué)生留級(jí)、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來(lái)。 用動(dòng)態(tài)存儲(chǔ)的方法可以很好地解決這些問(wèn)題。 有一個(gè)學(xué)生就分配一個(gè)結(jié)點(diǎn),無(wú)須預(yù)先確定學(xué)生的準(zhǔn)確人數(shù),某學(xué)生退學(xué), 可刪去該結(jié)點(diǎn),并釋放該結(jié)點(diǎn)占用的存儲(chǔ)空間。從而節(jié)約了寶貴的內(nèi)存資源。 另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。 而使用動(dòng)態(tài)分配時(shí),每個(gè)結(jié)點(diǎn)之間可以是不連續(xù)的(結(jié)點(diǎn)內(nèi)是連續(xù)的)。 結(jié)點(diǎn)之間的聯(lián)系可以用指針實(shí)現(xiàn)。 即在結(jié)點(diǎn)結(jié)構(gòu)中定義一個(gè)成員項(xiàng)用來(lái)存放下一結(jié)點(diǎn)的首地址,這個(gè)用于存放地址的成員,常把它稱為指針域??稍诘谝粋€(gè)結(jié)點(diǎn)的指針域內(nèi)存入第二個(gè)結(jié)點(diǎn)的首地址, 在第二個(gè)結(jié)點(diǎn)的指針域內(nèi)又存放第三個(gè)結(jié)點(diǎn)的首地址, 如此串連下去直到最后一個(gè)結(jié)點(diǎn)。最后一個(gè)結(jié)點(diǎn)因無(wú)后續(xù)結(jié)點(diǎn)連接,其指針域可賦為0。這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為“鏈表”。

         在鏈表中,第0個(gè)結(jié)點(diǎn)稱為頭結(jié)點(diǎn), 它存放有第一個(gè)結(jié)點(diǎn)的首地址,它沒(méi)有數(shù)據(jù),只是一個(gè)指針變量。 以下的每個(gè)結(jié)點(diǎn)都分為兩個(gè)域,一個(gè)是數(shù)據(jù)域,存放各種實(shí)際的數(shù)據(jù),如學(xué)號(hào)num,姓名name,性別sex和成績(jī)score等。另一個(gè)域?yàn)橹羔樣颍?存放下一結(jié)點(diǎn)的首地址。鏈表中的每一個(gè)結(jié)點(diǎn)都是同一種結(jié)構(gòu)類型。例如, 一個(gè)存放學(xué)生學(xué)號(hào)和成績(jī)的結(jié)點(diǎn)應(yīng)為以下結(jié)構(gòu):

      struct stu
      {
        int num;
        int score;
        struct stu *next;
      }

         前兩個(gè)成員項(xiàng)組成數(shù)據(jù)域,后一個(gè)成員項(xiàng)next構(gòu)成指針域, 它是一個(gè)指向stu類型結(jié)構(gòu)的指針變量。鏈表的基本操作對(duì)鏈表的主要操作有以下幾種:

         1.建立鏈表;

         2.結(jié)構(gòu)的查找與輸出;

         3.插入一個(gè)結(jié)點(diǎn);

         4.刪除一個(gè)結(jié)點(diǎn);

         下面通過(guò)例題來(lái)說(shuō)明這些操作。

         [例7.10]建立一個(gè)三個(gè)結(jié)點(diǎn)的鏈表,存放學(xué)生數(shù)據(jù)。 為簡(jiǎn)單起見(jiàn), 我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號(hào)和年齡兩項(xiàng)。

         可編寫(xiě)一個(gè)建立鏈表的函數(shù)creat。程序如下:

      #define NULL 0
      #define TYPE struct stu
      #define LEN sizeof (struct stu)
      struct stu
      {
        int num;
        int age;
        struct stu *next;
      };
      TYPE *creat(int n)
      {
        struct stu *head,*pf,*pb;
        int i;
        for(i=0;i<n;i++)
        {
         pb=(TYPE*) malloc(LEN);
         printf(“input Number and Agen”);
         scanf(“%d%d”,&pb->num,&pb->age);
         if(i==0)
          pf=head=pb;
         else pf->next=pb;
         pb->next=NULL;
         pf=pb;
        }
        return(head);
      }

         在函數(shù)外首先用宏定義對(duì)三個(gè)符號(hào)常量作了定義。這里用TYPE表示struct stu,用LEN表示sizeof(struct stu)主要的目的是為了在以下程序內(nèi)減少書(shū)寫(xiě)并使閱讀更加方便。結(jié)構(gòu)stu定義為外部類型,程序中的各個(gè)函數(shù)均可使用該定義。

         creat函數(shù)用于建立一個(gè)有n個(gè)結(jié)點(diǎn)的鏈表,它是一個(gè)指針函數(shù),它返回的指針指向stu結(jié)構(gòu)。在creat函數(shù)內(nèi)定義了三個(gè)stu結(jié)構(gòu)的指針變量。head為頭指針,pf 為指向兩相鄰結(jié)點(diǎn)的前一結(jié)點(diǎn)的指針變量。pb為后一結(jié)點(diǎn)的指針變量。在for語(yǔ)句內(nèi),用malloc函數(shù)建立長(zhǎng)度與stu長(zhǎng)度相等的空間作為一結(jié)點(diǎn),首地址賦予pb。然后輸入結(jié)點(diǎn)數(shù)據(jù)。如果當(dāng)前結(jié)點(diǎn)為第一結(jié)點(diǎn)(i==0),則把pb值 (該結(jié)點(diǎn)指針)賦予head和pf。如非第一結(jié)點(diǎn),則把pb值賦予pf 所指結(jié)點(diǎn)的指針域成員next。而pb所指結(jié)點(diǎn)為當(dāng)前的最后結(jié)點(diǎn),其指針域賦NULL。 再把pb值賦予pf以作下一次循環(huán)準(zhǔn)備。

         creat函數(shù)的形參n,表示所建鏈表的結(jié)點(diǎn)數(shù),作為for語(yǔ)句的循環(huán)次數(shù)。圖7.4表示了creat函數(shù)的執(zhí)行過(guò)程。

         [例7.11]寫(xiě)一個(gè)函數(shù),在鏈表中按學(xué)號(hào)查找該結(jié)點(diǎn)。

      TYPE * search (TYPE *head,int n)
      {
        TYPE *p;
        int i;
        p=head;
        while (p->num!=n && p->next!=NULL)
         p=p->next; /* 不是要找的結(jié)點(diǎn)后移一步*/
         if (p->num==n) return (p);
         if (p->num!=n&& p->next==NULL)
         printf (“Node %d has not been found!n”,n
      }

         本函數(shù)中使用的符號(hào)常量TYPE與例7.10的宏定義相同,等于struct stu。函數(shù)有兩個(gè)形參,head是指向鏈表的指針變量,n為要查找的學(xué)號(hào)。進(jìn)入while語(yǔ)句,逐個(gè)檢查結(jié)點(diǎn)的num成員是否等于n,如果不等于n且指針域不等于NULL(不是最后結(jié)點(diǎn))則后移一個(gè)結(jié)點(diǎn),繼續(xù)循環(huán)。如找到該結(jié)點(diǎn)則返回結(jié)點(diǎn)指針。 如循環(huán)結(jié)束仍未找到該結(jié)點(diǎn)則輸出“未找到”的提示信息。

         [例7.12]寫(xiě)一個(gè)函數(shù),刪除鏈表中的指定結(jié)點(diǎn)。刪除一個(gè)結(jié)點(diǎn)有兩種情況:

         1. 被刪除結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn)。這種情況只需使head指向第二個(gè)結(jié)點(diǎn)即可。即head=pb->next。其過(guò)程如圖7.5所示。

         2. 被刪結(jié)點(diǎn)不是第一個(gè)結(jié)點(diǎn),這種情況使被刪結(jié)點(diǎn)的前一結(jié)點(diǎn)指向被刪結(jié)點(diǎn)的后一結(jié)點(diǎn)即可。即pf->next=pb->next。

         函數(shù)編程如下:

      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)
         /*當(dāng)不是要?jiǎng)h除的結(jié)點(diǎn),而且也不是最后一個(gè)結(jié)點(diǎn)時(shí),繼續(xù)循環(huán)*/
        {
         pf=pb;pb=pb->next;}/*pf指向當(dāng)前結(jié)點(diǎn),pb指向下一結(jié)點(diǎn)*/
         if(pb->num==num)
         {
          if(pb==head) head=pb->next;
           /*如找到被刪結(jié)點(diǎn),且為第一結(jié)點(diǎn),則使head指向第二個(gè)結(jié)點(diǎn),
            否則使pf所指結(jié)點(diǎn)的指針指向下一結(jié)點(diǎn)*/
          else pf->next=pb->next;
          free(pb);
          printf(“The node is deletedn”);}
         else
          printf(“The node not been foud!n”);
          end:
         return head;
        }

         函數(shù)有兩個(gè)形參,head為指向鏈表第一結(jié)點(diǎn)的指針變量,num刪結(jié)點(diǎn)的學(xué)號(hào)。 首先判斷鏈表是否為空,為空則不可能有被刪結(jié)點(diǎn)。若不為空,則使pb指針指向鏈表的第一個(gè)結(jié)點(diǎn)。進(jìn)入while語(yǔ)句后逐個(gè)查找被刪結(jié)點(diǎn)。找到被刪結(jié)點(diǎn)之后再看是否為第一結(jié)點(diǎn),若是則使head指向第二結(jié)點(diǎn)(即把第一結(jié)點(diǎn)從鏈中刪去),否則使被刪結(jié)點(diǎn)的前一結(jié)點(diǎn)(pf所指)指向被刪結(jié)點(diǎn)的后一結(jié)點(diǎn)(被刪結(jié)點(diǎn)的指針域所指)。如若循環(huán)結(jié)束未找到要?jiǎng)h的結(jié)點(diǎn), 則輸出“末找到”的提示信息。最后返回head值。

         [例7.13]寫(xiě)一個(gè)函數(shù),在鏈表中指定位置插入一個(gè)結(jié)點(diǎn)。在一個(gè)鏈表的指定位置插入結(jié)點(diǎn), 要求鏈表本身必須是已按某種規(guī)律排好序的。例如,在學(xué)生數(shù)據(jù)鏈表中, 要求學(xué)號(hào)順序插入一個(gè)結(jié)點(diǎn)。設(shè)被插結(jié)點(diǎn)的指針為pi。 可在三種不同情況下插入。

         1. 原表是空表,只需使head指向被插結(jié)點(diǎn)即可。

         2. 被插結(jié)點(diǎn)值最小,應(yīng)插入第一結(jié)點(diǎn)之前。這種情況下使head指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)的指針域指向原來(lái)的第一結(jié)點(diǎn)則可。即:

      pi->next=pb;
      head=pi;

         3. 在其它位置插入。這種情況下,使插入位置的前一結(jié)點(diǎn)的指針域指向被插結(jié)點(diǎn),使被插結(jié)點(diǎn)的指針域指向插入位置的后一結(jié)點(diǎn)。即為:pi->next=pb;pf->next=pi;

         4. 在表末插入。這種情況下使原表末結(jié)點(diǎn)指針域指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)指針域置為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;/*在第一結(jié)點(diǎn)之前插入*/
          else pf->next=pi;/*在其它位置插入*/
          pi->next=pb; }
         else
         {
          pb->next=pi;
          pi->next=NULL;
         } /*在表末插入*/
        }
        return head;
      }

         本函數(shù)有兩個(gè)形參均為指針變量,head指向鏈表,pi 指向被插結(jié)點(diǎn)。函數(shù)中首先判斷鏈表是否為空,為空則使head指向被插結(jié)點(diǎn)。表若不空,則用while語(yǔ)句循環(huán)查找插入位置。找到之后再判斷是否在第一結(jié)點(diǎn)之前插入,若是則使head 指向被插結(jié)點(diǎn)被插結(jié)點(diǎn)指針域指向原第一結(jié)點(diǎn),否則在其它位置插入, 若插入的結(jié)點(diǎn)大于表中所有結(jié)點(diǎn),則在表末插入。本函數(shù)返回一個(gè)指針, 是鏈表的頭指針。 當(dāng)插入的位置在第一個(gè)結(jié)點(diǎn)之前時(shí), 插入的新結(jié)點(diǎn)成為鏈表的第一個(gè)結(jié)點(diǎn),因此head的值也有了改變, 故需要把這個(gè)指針?lè)祷刂髡{(diào)函數(shù)。

         [例7.14]將以上建立鏈表,刪除結(jié)點(diǎn),插入結(jié)點(diǎn)的函數(shù)組織在一起,再建一個(gè)輸出全部結(jié)點(diǎn)的函數(shù),然后用main函數(shù)調(diào)用它們。

      #define NULL 0
      #define TYPE struct stu
      #define LEN sizeof(struct stu)
      struct stu
      {
        int num;
        int age;
        struct stu *next;
      };
      TYPE * creat(int n)
      {
        struct stu *head,*pf,*pb;
        int i;
        for(i=0;i<n;i++)
        {
         pb=(TYPE *)malloc(LEN);
         printf(“input Number and Agen”);
         scanf(“%d%d”,&pb->num,&pb->age);
         if(i==0)
          pf=head=pb;
         else pf->next=pb;
         pb->next=NULL;
         pf=pb;
        }
        return(head);
      }
      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;
        }
        if(pb->num==num)
        {
         if(pb==head) head=pb->next;
         else pf->next=pb->next;
         printf(“The node is deletedn”);
        }
        else
         free(pb);
         printf(“The node not been found!n”);
        end:
        return head;
      }
      TYPE * insert(TYPE * head,TYPE * pi)
      {
        TYPE *pb ,*pf;
        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;
      }
      void print(TYPE * head)
      {
        printf(“NumberttAgen”);
        while(head!=NULL)
        {
         printf(“%dtt%dn”,head->num,head->age);
         head=head->next;
        }
      }
      main()
      {
        TYPE * head,*pnum;
        int n,num;
        printf(“input number of node: “);
        scanf(“%d”,&n);
        head=creat(n);
        print(head);
        printf(“Input the deleted number: “);
        scanf(“%d”,&num);
        head=delete(head,num);
        print(head);
        printf(“Input the inserted number and age: “);
        pnum=(TYPE *)malloc(LEN);
        scanf(“%d%d”,&pnum->num,&pnum->age);
        head=insert(head,pnum);
        print(head);
      }

         本例中,print函數(shù)用于輸出鏈表中各個(gè)結(jié)點(diǎn)數(shù)據(jù)域值。函數(shù)的形參head的初值指向鏈表第一個(gè)結(jié)點(diǎn)。在while語(yǔ)句中,輸出結(jié)點(diǎn)值后,head值被改變,指向下一結(jié)點(diǎn)。若保留頭指針head, 則應(yīng)另設(shè)一個(gè)指針變量,把head值賦予它,再用它來(lái)替代head。在main函數(shù)中,n為建立結(jié)點(diǎn)的數(shù)目, num為待刪結(jié)點(diǎn)的數(shù)據(jù)域值;head為指向鏈表的頭指針,pnum為指向待插結(jié)點(diǎn)的指針。 main函數(shù)中各行的意義是:

         第六行輸入所建鏈表的結(jié)點(diǎn)數(shù);

         第七行調(diào)creat函數(shù)建立鏈表并把頭指針?lè)祷亟ohead;

         第八行調(diào)print函數(shù)輸出鏈表;

         第十行輸入待刪結(jié)點(diǎn)的學(xué)號(hào);

         第十一行調(diào)delete函數(shù)刪除一個(gè)結(jié)點(diǎn);

         第十二行調(diào)print函數(shù)輸出鏈表;

         第十四行調(diào)malloc函數(shù)分配一個(gè)結(jié)點(diǎn)的內(nèi)存空間, 并把其地址賦予pnum;

         第十五行輸入待插入結(jié)點(diǎn)的數(shù)據(jù)域值;

         第十六行調(diào)insert函數(shù)插入pnum所指的結(jié)點(diǎn);

         第十七行再次調(diào)print函數(shù)輸出鏈表。

         從運(yùn)行結(jié)果看,首先建立起3個(gè)結(jié)點(diǎn)的鏈表,并輸出其值;再刪103號(hào)結(jié)點(diǎn),只剩下105,108號(hào)結(jié)點(diǎn);又輸入106號(hào)結(jié)點(diǎn)數(shù)據(jù), 插入后鏈表中的結(jié)點(diǎn)為105,106,108。聯(lián)合“聯(lián)合”也是一種構(gòu)造類型的數(shù)據(jù)結(jié)構(gòu)。 在一個(gè)“聯(lián)合”內(nèi)可以定義多種不同的數(shù)據(jù)類型, 一個(gè)被說(shuō)明為該“聯(lián)合”類型的變量中,允許裝入該“聯(lián)合”所定義的任何一種數(shù)據(jù)。 這在前面的各種數(shù)據(jù)類型中都是辦不到的。例如, 定義為整型的變量只能裝入整型數(shù)據(jù),定義為實(shí)型的變量只能賦予實(shí)型數(shù)據(jù)。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)