下面算法是數據結構單鏈表的創建函數。在學習鏈表時,曾對節點的創建感到非常迷惑,經過多番查找資料,再加上不放過任何一個問題的心態,終於找出了困惑自己的原因所在。po出次文以便有需要的人。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int Elemtype; 5 typedef struct linklist 6 { 7 Elemtype data; 8 struct linklist *next; 9 10 }list,*link_list; 11 12 link_list create_linklist(link_list l, int n)//創建單鏈表 13 { 14 link_list p,q; 15 int x; 16 l=(list*)malloc(sizeof(list));//創建單鏈表頭結點 17 l->next=NULL; 18 //l->data=10;//test 19 20 q=l; 21 //printf("%d,%d",l->data,q->data);//test 22 printf("please input %dx:\n",n); 23 for(int i=1;i<=n;i++) 24 { 25 p=(list*)malloc(sizeof(list));//產生一個新結點 26 scanf("%d",&x); 27 p->data=x; 28 29 p->next=NULL; 30 q->next=p; 31 q=q->next; 32 } 33 return l; 34 } 35 36 void display(link_list l)//顯示鏈表 37 { 38 link_list p; 39 p=l->next; 40 while (p) 41 { 42 printf("%d->",p->data); 43 p=p->next; 44 } 45 printf("\n"); 46 } 47 48 int main() 49 { 50 link_list x,y; 51 int a=4; 52 y=create_linklist(x, a); 53 printf("please output linklist :\n"); 54 display(y); 55 return 0; 56 }
剛學鏈表的我一直想不明白q=l;的含義,幾番在草稿上畫圖也出現很多矛盾。最后才發現原來是我理解錯了q,l以及p的含義。
之前一直以為q,l是創建出來的節點,認為q=l意思是創建一個q節點而且和讓它和 l 是一模一樣的,但錯了。
其實l,q都是指向節點的指針類型,而q=l就是讓q指向l所指的節點(暫且稱作節點1),即他們都指向節點1。
這樣的話q->next=p和l->next=p是一樣的作用(可以用printf打印出來驗證),都是讓節點1的指針域指向指針類型p所指的節點(暫且稱作節點2)。有人把代碼中的q->next=p改成l->next=p卻出了錯。原因是改動了q->next=p語句在while循環中,當循環執行到第二次的時候,由於第二個節點的指針域是NULL,所以q=q->next;這句自然就出錯了。在這里要說的是,雖然某些不同的表達含義相同,但在實際上在算法的實現中,他們又能發揮不同的作用,以上就是例子;
q相當於是一個游標,是為了形成鏈表而設。for()循環每執行一次,他就后移一次,即q=q->next,意思是指針類型q指向下一個指針類型(在這里是p)所指的節點。總是保證q指向最后一個節點,就能在循環中創建新節點時,讓新節點能和前面一個節點形成鏈的關系。
思維容易出錯的地方:不能夠充分理解或者一時之間沒能正確看待指針類型這個特殊的類型,直接把l,q,p當成了節點,而事實上他們是指向節點的指針,他們是指針而非節點。
總結:在學習新知識時所遇到的問題往往是因為基礎薄弱,往前翻一番以前學過的相關內容,也許對解決問題有很大啟發。
