回覆列表
  • 1 # 如同素質取消

    你看看吧,我不知道你想問什麼,程式碼後面都有解釋的,挑點看就行。[例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");}elseprintf("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->numnum){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的值也有了改變, 故需要把這個指標返回主調函式。[例7.14]將以上建立連結串列,刪除結點,插入結點的函式組織在一起,再建一個輸出全部結點的函式,然後用main函式呼叫它們。#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

  • 2 # 使用者3136867717565

    /*

    線性表的運用

    (1)建立順序表

    (2)獲取第i個元素

    (3)查詢元素x

    (4)在某一位置插入資料

    在主函式中呼叫上述操作。

    */

    #include

    #include

    #define maxsize 50

    typedef struct

    {

    int data[maxsize];

    int last;

    }Sequenlist;

    Sequenlist * InitList () //建立順序表

    {

    Sequenlist * L ;

    L= (Sequenlist *) malloc( sizeof(Sequenlist) );

    L->last =0;

    return(L);

    }

    Sequenlist * creat() //建立一個有具體內容的順序表

    {

    Sequenlist * L; int i=1,n;

    L=InitList( );

    printf("請插入資料,以0結束\n");

    scanf("%d",&n);

    while(n!=0 && L->last

  • 中秋節和大豐收的關聯?
  • 跑鞋分類?