資料結構學習(二)——單鏈表的操作之頭插法和尾插法建立鏈表

來源:互聯網
上載者:User

鏈表也是線性表的一種,與順序表不同的是,它在記憶體中不是連續存放的。在C語言中,鏈表是通過指標相關實現的。而單鏈表是鏈表的其中一種,關於單鏈表就是其節點中有資料域和只有一個指向下個節點的指標域。建立單鏈表的方法有兩種,分別是頭插法和尾插法。

所謂頭插法,就是按節點的逆序方法逐漸將結點插入到鏈表的頭部。反之尾插法就是按節點的順序逐漸將節點插入到鏈表的尾部。相對來說,頭插法要比尾插法演算法簡單,但是最後產生的鏈表是逆序的,即第一個輸入的節點實際是鏈表的最後一個節點。而為了習慣,通常用尾插法來建立鏈表。下面的代碼就是實現了頭插法和尾插法。代碼在Linux下調試通過。

#include <stdio.h>#include <stdlib.h>typedef struct link{char data;struct link *next;}linklist;linklist *CreateList_Front();//頭插法建立單鏈表linklist *CreateList_End();//尾插法建立單鏈表void ShowLinklist(linklist *h); //輸出顯示鏈表int main(void){int choice;linklist *head;//head = (linklist*)malloc(sizeof(linklist));while(1){printf("單鏈表的建立\n");printf("1.使用頭插法建立單鏈表\n");printf("2.使用尾插法建立單鏈表\n");printf("3.鏈表輸出顯示\n");printf("4.退出\n");printf("做出選擇:\n");scanf("%d",&choice);switch(choice){//頭插法case 1:head = CreateList_Front();break;//尾插法case 2:head = CreateList_End();break;//輸出鏈表case 3:ShowLinklist(head);break;//退出程式case 4:return 0;break;default:break;}}return 1;}linklist *CreateList_Front(){linklist *head, *p;char ch;head = NULL;printf("依次輸入字元資料(‘#’表示輸入結束):\n");ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch;p->next = head;head = p;ch = getchar();//頭插法演算法簡單 核心就兩句p->next = head;head = p;}return head;}linklist *CreateList_End(){linklist *head, *p, *e;char ch;head = NULL;e = NULL;printf("請依次輸入字元資料('#'表示輸入結束):\n");ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch;if(head == NULL)//先判斷輸入的是不是第一個節點{head = p;}else{e->next = p;//e始終指向輸入的最後一個節點}e = p;ch = getchar();}if(e != NULL)//如果鏈表不為空白,則最後節點的下一個節點為空白{e->next = NULL;}return head;//尾插法比頭插法複雜一些,程式中要做兩次判斷,分別是判斷第一個節點和最後一個節點的判斷。且消耗多一個指標變數e。}void ShowLinklist(linklist *h){linklist *p;p = h;while(p != NULL){printf("%c ", p->data);p = p->next;}printf("\n");}

通過上述代碼可以看出,尾插法確實比頭插法複雜點,多了兩個判斷。但是這是可以解決的,通過添加一個前端節點,此節點不存放資料域,只是存放指向下個節點的指標域就是了。這樣就可以免除掉兩次判斷。整體也要清晰點了。下面是增加一個前端節點後尾插法的實現代碼:

#include <stdio.h>#include <stdlib.h>typedef struct list{char data;struct list *next;}linklist;linklist *CreateList_End();//尾插法建立鏈表void ShowLinklist(linklist *h);//輸出顯示鏈表int main(void){linklist *head;printf("使用尾插法建立鏈表(改進版)\n");printf("請依次輸入字元資料(‘#’表示輸入結束):\n");head = CreateList_End();//建立鏈表ShowLinklist(head);//輸出鏈表}linklist *CreateList_End(){linklist *head, *p, *e;char ch;head = (linklist*)malloc(sizeof(linklist));e = head;//讓e指向前端節點ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch; e->next = p;//把新節點添加到表尾e = p;//把指標指向新節點ch = getchar();}e->next = NULL;//尾節點的指標域置空return head;}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.