建立鏈表的方法採用尾插法,且是改進版的尾插法,即添加了一個輔助頭節點。code
下面的代碼是對插入、刪除、查找的一個總體操做。其中查找分爲按值和按位置查找。刪除和插入都是按給定位置操做。get
#include <stdio.h> #include <stdlib.h> typedef struct list { char data; struct list *next; }linklist; linklist *CreateLinklist_End(); //尾插法建立鏈表 linklist *Linklist_FindPos(linklist *h, int pos); //經過位置查找節點 linklist *Linklist_FindDat(linklist *h, char dat, int *i); //按值查找節點 int Linklist_Insert(linklist *h, int pos, char dat); //按位置插入節點 int Linklist_Delete(linklist *h, int pos); //按位置刪除節點 void ShowLinklist(linklist *h); //輸出顯示鏈表 int main(void) { linklist *head, *p; int choice, pos, ans; char dat; printf("單鏈表的相關操做練習\n"); printf("尾插法建立一個鏈表,請依次輸入節點字符數據,空格隔開('#'表示輸入結束):\n"); head = CreateLinklist_End(); while(1) { printf(" 選擇將要進行的操做\n"); printf("1.按位置查找節點\n"); printf("2,按值查找節點\n"); printf("3.按位置插入節點\n"); printf("4.按位置刪除節點\n"); printf("5.輸出顯示鏈表\n"); printf("6.退出程序\n"); printf("作出選擇:"); scanf("%d", &choice); getchar(); //消除回車鍵對後面輸入帶來的影響. switch(choice) { case 1: printf("輸入想要查找節點的位置:"); scanf("%d", &pos); p = Linklist_FindPos(head, pos); if(p) printf("第%d個節點數據爲:%c\n", pos, p->data); else printf("查找的節點不存在\n"); break; case 2: printf("輸入想要查找的節點的字符數據:"); scanf("%c", &dat); p = Linklist_FindDat(head, dat, &pos); if(p) { printf("你查找的節點所在數據爲:%c\n", p->data); printf("節點所在的位置爲:%d\n", pos); } else { printf("你查找的節點不存在!\n"); } break; case 3: printf("請輸入你想插入的節點字符數據及位置(空格隔開):"); scanf("%c %d", &dat, &pos); ans = Linklist_Insert(head, pos, dat); if(ans) printf("插入節點成功!\n"); else printf("插入節點失敗\n"); break; case 4: printf("請輸入你想刪除節點所在的位置:"); scanf("%d", &pos); ans = Linklist_Delete(head, pos); if(ans) printf("刪除節點成功!\n"); else printf("刪除節點失敗!\n"); break; case 5: printf("節點數據依次爲:"); ShowLinklist(head); break; case 6: return 0; break; default: printf("輸入的選擇無效!\n"); break; } } } //尾插法建立鏈表 linklist *CreateLinklist_End() { linklist *head, *p, *e; char ch; head = (linklist*)malloc(sizeof(linklist)); e = head; ch = getchar(); getchar(); //消除空格帶來的影響 while(ch != '#') { p = (linklist*)malloc(sizeof(linklist)); p->data = ch; e->next = p; e = p; ch = getchar(); getchar(); //消除空格帶來的影響 } e->next = NULL; return head; } //經過位置查找節點 linklist *Linklist_FindPos(linklist *h, int pos) { linklist *p; int i = 1; p = h->next; while(i<pos && p != NULL) { p = p->next; i++; } if(i == pos) //找到指定位置 return p; else return NULL; } //經過數據查找節點 linklist *Linklist_FindDat(linklist *h, char dat, int *i) { linklist *p; p = h->next; *i = 1; while(p != NULL) { if(p->data != dat) { *i = *i + 1; p = p->next; } else break; //找到數據則跳出 } return p; } //在指定位置插入節點 int Linklist_Insert(linklist *h, int pos, char dat) { linklist *p, *l; int i=0; p = h; while(i<pos-1 && p->next != NULL) //找到位置前一個節點 { i++; p = p->next; } if(i == pos-1) //找到指定位置 { l = (linklist*)malloc(sizeof(linklist)); l->data = dat; l->next = p->next; p->next = l; } else return 0; return 1; } //刪除指定位置節點 int Linklist_Delete(linklist *h, int pos) { linklist *p, *s; int i = 0; p = h; while(i<pos-1 && p->next != NULL) //搜索指定位置前一個節點 { i++; p = p->next; } if(i != pos-1 || p->next == NULL) //查找位置非法 return 0; s = p->next; p->next = s->next; free(s); return 1; } //輸出顯示節點 void ShowLinklist(linklist *h) { linklist *p; p = h->next; while(p != NULL) { printf("%c ", p->data); p = p->next; } printf("\n"); }