帶頭結點和不帶頭結點的尾插法建立雙鏈表

來源:互聯網
上載者:User

 

帶頭結點和不帶頭結點的尾插法建立雙鏈表

一.帶頭結點的

先介紹儲存資料類型為字元型的

//編程建立雙鏈表(data為字元型資料)13-2-1ex3.cpp//帶頭結點的雙鏈表#include<stdio.h>#include<stdlib.h>//#include<string.h>//#include<conio.h>//#define E_DEBUG#ifdef E_DEBUG#define    PRINT      printf#else#define    PRINT(...)                  do{}while(0)    #endif typedef char datatype;typedef struct student{         datatype data;         struct student *next;         struct student *pre;}DNode; DNode *create(){         DNode *head, *p, *s;         datatype x, cycle=1;         head=(DNode *)malloc(sizeof(DNode));         p=head; //如果換成帶前端節點的鏈表。這裡也不能變,切記,不能變成p=head->next;那就錯了         printf("\nplease input the data:\n");         while(cycle)         {                  scanf("%c",&x); //見後面注意2)if(x!='#')                  {                          s=(DNode *)malloc(sizeof(DNode));                          s->data=x;                          PRINT("\n %c", s->data);                          p->next=s;                          s->pre=p;                          p=s;                  }                  else                  {                          cycle=0;                  }         }         p->next=NULL;         ///head=head->next;//注意,這兩句是不帶頭結點的雙鏈表必須做的,因為按照演算法。輸入的第一個數實際上是賦值給了head->next         //head->pre=NULL;//所以,這就相當於頭結點(head)裡面沒有值,所以要用這兩步將head向後移一位,之前那個head就不要了。         PRINT("\nhead->data:%c\n",head->data);         return head;} int main(){         DNode *p;         p=create();         p=p->next; //如果是帶前端節點的雙鏈表建立,除了少了上面那個函數的末尾的步之外,多了這一步,保證從head的下一個節點輸出鏈表data。         printf("\nnow out put the double linklist:\n");         while(p!=NULL)         {                  printf("%3c", p->data);                  p=p->next;         }         printf("\n");                           system("pause");         return 0;}

 

結果:

圖1

 

圖2

 

注意:1)圖1的輸入的時候是輸入一個字母加一個空格。所以輸出就是正常輸出了,鏈表裡面的內容就是a b c d e。但是圖2不一樣,圖2輸入的時候就是輸入一個字母加一個斷行符號,因為是%c輸入,scanf把斷行符號也當成一個字元了,所以鏈表裡就無形的多了5個元素,也即是5個斷行符號。所以輸出的時候就是a斷行符號b斷行符號c斷行符號…..了。

2)資料要為字元型的,全部都要字元型輸入,包括這裡的scanf的參數要為%c,還有上面的datatype data,還有datatype x, datatype 要為char,不然就問題大了。千萬不可在scanf中的參數是%d,結果輸入了一個字元型的(比如a),那麼可就慘了,scanf並沒有成功讀入,x是個不確定的負的大數,所以會繼續跳入while迴圈,而且一直在不停的執行。如果你在scanf之後加一個printf(“x:%d\n”,x);就回傳現程式會一直不停的列印一個大數(見圖3),應該是scanf緩衝區裡面的東西有關。還沒有具體分析scanf的源碼。

3)當程式執行的時候,你輸入的內容是數字時,列印出來的是數字,這時候的數字和字母是一樣的都是被當成一個字元處理。

 

圖3

 

下面介紹一下資料為整形的雙鏈表

其實和字元型的是一樣的。只不過改了幾個地方。

1.      datatype 改為int。也就是結構體裡面的data和create函數一開始的x都要改為int。

2.      scanf參數格式變為%c,即scanf(“%c”,&x);。

3.      其他的printf輸出data的printf中的參數格式改為%c就行了。不然會輸出ASCII碼。其餘的都沒變。代碼就不貼出了,貼一下結果吧,見圖4.

注意:

1)輸入的時候因為是%d輸入的(只要你輸入的是數字而不是字母),即使輸入一個加一個斷行符號,輸出的時候也是一樣,鏈表中依舊是5 4 3 2 1.見圖5。

圖4

 

圖5

 

二.不帶頭結點的

不帶頭結點的相對於帶頭結點的就改了幾個地方。一個是main函數中要改一下其實輸出地址,還有一個就是要將建立好的鏈表的head指標右移。其實不帶頭結點的鏈表(單鏈表也好,雙鏈表也好),只要是尾插法,建立的時候本來就是帶頭的,因為第一個輸入的資料是存在head的下一個節點裡的,而不是head裡的。所以後面要改成不帶頭的有點多此一舉,不過如果題目要求,那就改唄。改動部分均用加高亮顯示。

代碼如下:

//編程建立雙鏈表//不帶頭結點的雙鏈表#include<stdio.h>#include<stdlib.h>//#include<string.h>//#include<conio.h>typedef struct student{ int data; struct student *next; struct student *pre;}DNode;DNode *create(){ DNode *head, *p, *s; int x, cycle=1; head=(DNode *)malloc(sizeof(DNode)); p=head; //如果換成帶前端節點的鏈表。這裡也不能變,切記,不能變成p=head->next;那就錯了 while(cycle) {  printf("\nplease input the data:\n");  scanf("%d",&x);  if(x!=0)  {   s=(DNode *)malloc(sizeof(DNode));   s->data=x;   printf("\n %d", s->data);   p->next=s;   s->pre=p;   p=s;  }  else  {   cycle=0;  } } p->next=NULL; head=head->next;//注意,這兩句是不帶頭結點的雙鏈表必須做的,因為按照演算法。輸入的第一個數實際上是賦值給了head->next head->pre=NULL;//所以,這就相當於頭結點(head)裡面沒有值,所以要用這兩步將head向後移一位,之前那個head就不要了。 return head;}int main(){ DNode *p; p=create(); //如果是帶前端節點鏈表,需要在這句話之後加一句p=p->next;保證從head的下一個節點輸出資料,因為資料本身就是head的下一個      //節點開始儲存的,見13-2-1ex1.cpp或者13-2-1ex3.cpp printf("\nnow out put the double linklist:\n"); while(p!=NULL) {  printf("%3d", p->data);  p=p->next; } printf("\n");   system("pause"); return 0;}

 

就不貼了,一樣的。

其實雙鏈表和單鏈表基本是一模一樣的,只不過改了一兩個小小的地方,也就是單鏈表不用管前驅的事情。單鏈表的事情會在別的文章裡面說。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.