資料結構學習(三)——單鏈表的操作之尋找、刪除、插入。

來源:互聯網
上載者:User

建立鏈表的方法採用尾插法,且是改進版的尾插法,即添加了一個輔助前端節點。

下面的代碼是對插入、刪除、尋找的一個整體操作。其中尋找分為按值和按位置尋找。刪除和插入都是按給定位置操作。

#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");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.