鏈表的建立、插入和刪除(二)

字號:

7.4.2 單鏈表的插入與刪除
    在鏈表這種特殊的數(shù)據(jù)結(jié)構(gòu)中,鏈表的長短需要根據(jù)具體情況來設(shè)定,當(dāng)需要保存數(shù)據(jù)時向系統(tǒng)申請存儲空間,并將數(shù)據(jù)接入鏈表中。對鏈表而言,表中的數(shù)據(jù)可以依此接到表尾或連結(jié)到表頭,也可以視情況插入表中;對不再需要的數(shù)據(jù),將其從表中刪除并釋放其所占空間,但不能破壞鏈表的結(jié)構(gòu)。這就是下面將介紹的鏈表的插入與刪除。
    1. 鏈表的刪除
    在鏈表中刪除一個節(jié)點,用圖7 - 4描述如下:
    [例7-6] 創(chuàng)建一個學(xué)生學(xué)號及姓名的單鏈表,即節(jié)點包括學(xué)生學(xué)號、姓名及指向下一個節(jié)點的指針,鏈表按學(xué)生的學(xué)號排列。再從鍵盤輸入某一學(xué)生姓名,將其從鏈表中刪除。
    首先定義鏈表的結(jié)構(gòu):
    struct
    從圖7 - 4中看到,從鏈表中刪除一個節(jié)點有三種情況,即刪除鏈表頭節(jié)點、刪除鏈表的中
    間節(jié)點、刪除鏈表的尾節(jié)點。題目給出的是學(xué)生姓名,則應(yīng)在鏈表中從頭到尾依此查找各節(jié)
    點,并與各節(jié)點的學(xué)生姓名比較,若相同,則查找成功,否則,找不到節(jié)點。由于刪除的節(jié)
    點可能在鏈表的頭,會對鏈表的頭指針造成丟失,所以定義刪除節(jié)點的函數(shù)的返回值定義為
    返回結(jié)構(gòu)體類型的指針。
    struct node *delet(head,pstr)以/*he a d 為頭指針,刪除ps t r 所在節(jié)點*/
    struct node *head;
    char *pstr;
    {
    struct node *temp,*p;
    t e m p = h e a d ; / * 鏈表的頭指針* /
    if (head==NULL) / *鏈表為空* /
    printf("\nList is null!\n");
    else /*非空表* /
    {
    t e m p = h e a d ;
    while (strcmp(temp->str,pstr)!=0&&temp->next!=NULL)
    / * 若節(jié)點的字符串與輸入字符串不同,并且未到鏈表尾* /
    {
    p = t e m p ;
    t e m p = t e m p - > n e x t ; / * 跟蹤鏈表的增長,即指針后移* /
    }
    if(strcmp(temp->str,pstr)==0 ) / *找到字符串* /
    {
    if(temp==head) { / * 表頭節(jié)點* /
    printf("delete string :%s\n",temp->str);
    h e a d = h e a d - > n e x t ;
    f r e e ( t e m p ) ; / *釋放被刪節(jié)點* /
    }
    e l s e
    {
    p->next=temp->next; /表*中節(jié)點*/
    printf("delete string :%s\n",temp->str);
    f r e e ( t e m p ) ;
    }
    }
    else printf("\nno find string!\n");沒/找* 到要刪除的字符串*/
    }
    r e t u r n ( h e a d ) ; / *返回表頭指針* /
    }