建立鏈表的方法採用尾插法,且是改進版的尾插法,即添加了一個輔助前端節點。
下面的代碼是對插入、刪除、尋找的一個整體操作。其中尋找分為按值和按位置尋找。刪除和插入都是按給定位置操作。
#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);elseprintf("尋找的節點不存在\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");elseprintf("插入節點失敗\n");break;case 4:printf("請輸入你想刪除節點所在的位置:");scanf("%d", &pos);ans = Linklist_Delete(head, pos);if(ans)printf("刪除節點成功!\n");elseprintf("刪除節點失敗!\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;elsereturn 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;}elsebreak;//找到資料則跳出}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;}elsereturn 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");}