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

typedef int ElemType; typedef int status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList;
這里的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; }
感謝感謝,看到這里也不容易,如果大家發現我哪里有錯,可以在評論區里面直接說哦,我會很虛心,超級虛心的接受的。
本次分享到此結束,之后會不定期更新哦,謝謝大家!!!