【C】利用單鏈表資料結構實現通訊錄,連結串列的增刪改查
阿新 • • 發佈:2019-02-11
C語言中實現連結串列,是需要利用到C語言中比較難的結構體與指標才能實現。
結構體中放一個指向後接節點的指標與每一個結點應該存放的資訊。
下面做一個命令列的通訊錄來說明連結串列的增刪改查這個問題。
一開始讓使用者輸入連結串列,按1可以輸出,按3可以刪除。
可以修改:
可以插入。
按0則可以退出:
程式碼如下:
#include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];//存放電話號碼 struct Linklist *next; }Linklist,*LNode; //建立連結串列 void create(Linklist *L){ char flag='y'; Linklist *p,*s; p=L; puts("建立一個通訊錄:"); while(flag=='Y'||flag=='y'){ //初始化生成塊 s=(LNode)malloc(sizeof(Linklist)); printf("姓名:"); scanf("%s",s->name); printf("號碼:"); scanf("%s",s->num); //尾插法核心語句開始 s->next=NULL;//注意封口 p->next=s; p=s; //尾插法核心語句結束 //吃換行符 getchar(); printf("繼續輸入?(y/n)"); scanf("%c",&flag); } } //輸出連結串列 void output(Linklist *L){ Linklist *p; p=L->next; puts("編號\t姓名\t號碼");//表頭 puts("====\t====\t====");//華麗的分割線 int count=1; while(p){ printf("%d\t%s\t%s\n",count,p->name,p->num); p=p->next; count++; } } //修改連結串列中的某一項 void update(Linklist *L){ Linklist *p; p=L; int n; puts("需要修改哪一項?"); scanf("%d",&n); for(int i=1;i<n+1;i++){ p=p->next;//把指標移位到需要修改的一項 } if(p==NULL){ puts("沒有這項!"); } else{ printf("姓名:"); scanf("%s",p->name); printf("號碼:"); scanf("%s",p->name); } } //在連結串列尾部插入一項 void insert(Linklist *L){ Linklist *p,*s; p=L; while(p->next){//尾插法,直接把指標移位到尾部 p=p->next; } //初始化生成塊 s=(LNode)malloc(sizeof(Linklist)); printf("姓名:"); scanf("%s",s->name); printf("號碼:"); scanf("%s",s->num); //尾插法核心語句開始 s->next=NULL;//注意封口 p->next=s; //只插入一項,無須p=s //尾插法核心語句結束 } //在連結串列中刪除一項 void del(Linklist *L){//不寫delete是因為delete是C語言的關鍵字 Linklist *p,*q; p=L; int n; puts("需要刪除哪一項?"); scanf("%d",&n); //這裡的指標定位不同於修改,我們需要把指標定位到要刪除的前一項,進行刪除 for(int i=1;i<n;i++){ p=p->next; } if(p==NULL){ puts("沒有這項!"); } else{//刪除的核心語句 q=p->next; p->next=q->next; free(q); } } void main(){ Linklist *L; int i=255; L=(LNode)malloc(sizeof(Linklist));//熟記malloc的用法,詞句為開創一個長為Linklist的空間,而後被L所指向 L->next=NULL;//此處頭結點的尾指標必須封口,否則不同的編譯器會編譯出不同的成分。 create(L); while(i!=0){ puts("\n功能:\n1.輸出\t2.修改\t3.刪除\t4.插入\t0.退出"); scanf("%d",&i); switch(i){ case 1: output(L); break; case 2: update(L); break; case 3: del(L); break; case 4: insert(L); break; } } }
連結串列的各類增刪改查操作寫在各個函數了。
其實也不難,
連結串列的增加採用尾插法,先開闢一個結點空間,用一個指標所指,把操作的指標移到結點的最後,連線新開闢的結點
刪除一項先把指標移到要刪除的項之前,再用一個指標移到要刪除的項,刪除完畢,把前一項的後接指標移到下兩項
查詢、修改最簡單,只是一個單純的指標移動過程。