今天學習了鏈表內的創建和添加,先總結一下我犯的錯誤 先上代碼 代碼註釋: 思路分析: 本次練習首先是數據結構中簡單鏈表中單個結點的創建,經過分析可得,若是想要在程式運行的過程當中進行創建添加操作: 鏈表簡單的添加,此處的添加分為兩種情況: 程式中原先若是有鏈表已經出現,那麼頭指針是指向第一個結點可以 ...
今天學習了鏈表內的創建和添加,先總結一下我犯的錯誤
- 二級指針理解不深刻,導致傳參之後,實參的值並沒有變化;
- 符號優先順序沒有記熟練,導致寫完之後會出現很多語法問題;
先上代碼
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct NODE 5 { 6 int id; 7 char *name; 8 char *tel; 9 struct NODE *next; 10 }Node; 11 Node *GetNode(int id,char *name,char *tel); 12 void addNode(Node **ppHead,Node **ppEnd,Node *pNode); 13 int main() 14 { 15 Node *pHead = NULL; //1 16 Node *pEnd = NULL; 17 18 addNode(&pHead,&pEnd,GetNode(1,"cyc","164864613521")); 19 addNode(&pHead,&pEnd,GetNode(2,"xmx","164864613521")); 20 addNode(&pHead,&pEnd,GetNode(3,"wdh","164864613521")); 21 addNode(&pHead,&pEnd,GetNode(4,"yk","164864613521")); 22 23 while(pHead != NULL) 24 { 25 printf("%d %s %s\n",pHead->id,pHead->name,pHead->tel); 26 pHead = pHead->next; 27 } 28 29 30 31 return 0; 32 } 33 Node *GetNode(int id,char *name,char *tel) 34 { 35 Node *pTemp = (Node *)malloc(sizeof(Node)); 36 pTemp->id = id; 37 pTemp->name = name; 38 pTemp->tel = tel; 39 pTemp->next = NULL; 40 41 return pTemp; 42 } 43 void addNode(Node **ppHead,Node **ppEnd,Node *pNode) // 2 44 { 45 if(*ppHead == NULL) 46 { 47 *ppHead = pNode; 48 *ppEnd = pNode; 49 } 50 else 51 { 52 (*ppEnd)->next = pNode; 53 *ppEnd = pNode; 54 } 55 return; 56 57 }
代碼註釋:
- 此處設置的頭指針和尾指針是便於添加結點;
- 函數傳參,若想對傳入參數的值進行改變的話,應該使用地址傳遞,反之,使用值傳遞(在這個練習當中,我想改變指針的值,所以採用地址傳遞,而二級指針正好是用來存儲指針的地址)
思路分析:
本次練習首先是數據結構中簡單鏈表中單個結點的創建,經過分析可得,若是想要在程式運行的過程當中進行創建添加操作:
- 應該在堆區申請空間,因為棧區在程式運行後大小不可變化,並且會隨著自定義函數的結束而消亡,造成信息的損失;
- 傳入參數有多種形式,我採用的是直接傳入,也可以採用scanf()即時輸入的方式。
鏈表簡單的添加,此處的添加分為兩種情況:
- 程式中並未有鏈表出現,那麼遍歷後 頭指針pHead = 0就可以判斷,那麼頭指針指向添加的結點,尾指針也指向添加的結點即可;
程式中原先若是有鏈表已經出現,那麼頭指針是指向第一個結點可以不變,此時尾指針所指向結點內所存儲的 pnext 就可以指向添加的結點,然後繼續把尾指針指向最後一個結點。
2019-04-18 22:37:16 編程小菜鳥反思,大佬勿噴 謝謝!