單鏈表的插入和刪除


近期,數據結構課上布置了運用單鏈表進行簡單的插入和刪除工作,今天,就在這里跟大家講一下單鏈表的插入和刪除是怎么弄的

1.結點的定義

typedef int ElemType;

typedef int status;

 

typedef struct LNode{

    ElemType data;

    struct LNode *next;

}LNode, *LinkList;
View Code

這里的data就是我們鏈表里的數據元素了,next就是結點了也就是我們經常看到的p->next了。

2,創建鏈表

接下來我們講講創建鏈表,一個好的鏈表結構離不開創建函數的作用,其中,創建鏈表又分為頭插法和尾插法,頭插法:也就是每次放入元素的時候又把指針指向頭指針,也稱為尾插法,因為這樣創建的鏈表輸入的元素其實是逆序排列的,尾插法:首先需要設置一個尾結點,然后每次插入完了之后把指針指向尾結點,這樣就能保證是順序輸入的了。

頭插法(倒插法):

status CreateList_List(LNode*L,int n){
    int i,j;
    LNode *p;                                          //以同樣的格式定義一個p指針,用它來進行元素的輸入//
    L=(LinkList) malloc(sizeof(LNode));                //這里就是給我們的鏈表分配存儲空間了//
    L->next = NULL;                                    //首先讓L指向頭指針//
    for(i=n;i>0;i--){
        p=(LinkList) malloc(sizeof(LNode));            //每輸入一個數,就分配一個空間,這樣可以有效的提高空間的利用率//
        printf("請輸入該表的第%d個元素   :",i);
        scanf("%d",&j);
        p->data=j;                                     //這里就是我們的元素啦//
        p->next=L->next;                               //讓我們的p指針指向頭結點//
        L->next=p;                             //這里還不是太懂,就不誤導大家了//
    }
    printf("\n");
    return L;                                         //相信有同學注意到了我的這里和書上是不一樣的,沒錯,是真的//
}

 

因為考慮到指針返回的問題,單鏈表想要返回地址的話是要用到二級指針的,二級指針太過麻煩了(其實是我不會啦),我在這里就用到了一個外部指針來接受我return的L,嘻嘻,是不是很聰明(反正我覺着還行),具體的大家會在我下面的主函數里面看到。。。

尾插法,我還不熟練,就不拿非成品來忽悠大家了,之后我再補上。

 

3.插入函數

鏈表創建完成了,接下來就是它的插入功能了。

status ListInsert_L(LNode*L,int i,int e){
    int j;
    LNode *p,*q,*s;                             //這里跟上面是一樣的,就不多說了//
    p=L;                                        //地址傳遞//
    j=0;
    while (p&&j<i-1){p=p->next;++j;}            //這里用一個while循環,來找到我們的 i ,也就是插入的位置//
    if(!p||j>i-1) return ERROR;                 //然后如果輸入的位置已經超過了鏈表的長度了,怎么辦,這里會用一個if語句來判斷,如果大於了鏈表的長度,那我們就直接退出插入程序了//
    s=(LinkList)malloc(sizeof(LNode));          //一樣的哦//
    s->data=e;
    s->next=p->next;
    p->next=s;
    printf("插入后的線性表為:");               //這里考慮到都插入了,那怎么知道有沒有成功呢,所以我們就輸出來看一下//
    LNode *a=L->next;                     //定義一個節點讓它等於頭結點//
    while(a){
    printf("%d ",a->data);                //只有a指向的值不是NULL,也就是沒有值,我們就持續輸出//
    a=a->next;                               //輸出完了一個元素,通過這個就可以讓他指向下一個啦//
    }
    return L;                         //大家看到這里也是返回L哦,沒錯,這里也用到了外部指針哦//
}

4.刪除函數

加油加油,只差一個刪除了

status ListDelete_L(LNode*L,int i,ElemType *e){           

    int j;
    LNode *p,*q;
    p=L;
    j=0;
    while(p->next&&j<i-1){                                      //這里同樣是用while循環來找到我們要刪除的位置//
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1) return ERROR;                        //same again//
    q=p->next;                                        //怎么刪除呢?//
    p->next=q->next;                                           //把你要刪除的那個位置的節點刪掉就好了,但是刪掉之前,得把它的遺產解決了//
    e=q->data;                                      //也就是要把節點的指向改了,這樣我們的鏈表就還是連在一起的哦,然后把刪掉的元素賦值給e,留作紀念咯//
    free(q);                                                   //怎么刪掉節點呢,沒錯,就是free掉它//
    printf("刪除后的線性表為:");
    LNode *a=L->next;
    while(a){
    printf("%d ",a->data);
    a=a->next;
    }
} 

 

好啦,所有函數就搞定了,讓我們下回再見.....呸呸呸,還有我們的核心,主函數呢

5.主函數

主函數作為調用子函數的一個集合體,怎么寫就看大家心情了,但要提醒大家的是,必要的文字說明不能少,不然鬼知道你輸的是什么

int main()

{
    int a,b,c,d,x,y;
    ElemType *z;                               //為什么這里冒出來這么一個玩意,你是不是這么想的,回頭看看刪除函數吧,第三個參數是怎么定義的//
    LNode *L,*s;                                          //沒錯,這里的s就是我們朝思墓想的外部指針了//
    printf("請輸入鏈表的初始元素個數  :");                    //必要的文字說明哦//
    scanf("%d",&d);
    s=(CreateList_List(L,d));                              //就是這里,我們用s接收了創建函數的腦電波,,可以看到接下來的插入啊,刪除啊,都變成s了//
    printf("初始線性表為  :");
    LNode *q=s->next;
    while(q){
    printf("%d ",q->data);
    q=q->next;
    }
    printf("\n是否要插入  1.是 2.否\n");
    scanf("%d",&a);
    if(a==1){
        printf("請輸入插入的元素  :\n");
        scanf("%d",&c);
        printf("請輸入插入的位置  :\n");
        scanf("%d",&b);
        s=(ListInsert_L(s,b,c));                         //再次接收我們插入過了的信號//
        printf("\n插入成功,退出插入系統中....\n");
    }
    else
        printf("\n退出插入系統中.....\n");
    printf("\n是否要刪除 1.是 2.否\n");
    scanf("%d",&x);
    if(x==1){
        printf("請輸入刪除元素的位置  :");
        scanf("%d",&y);
        ListDelete_L(s,y,z);
        printf("刪除成功,退出刪除系統中....\n");
    }
    else
        printf("退出刪除系統中.....\n");
    return 0;
}

感謝感謝,看到這里也不容易,如果大家發現我哪里有錯,可以在評論區里面直接說哦,我會很虛心,超級虛心的接受的。

本次分享到此結束,之后會不定期更新哦,謝謝大家!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM