![]() |
【求助】TC的指標問題 #include <stdio.h> #include <stdlib.h> struct list { int data; struct list *next; }; typedef struct list node ; typedef node *link; void printf_list(link pointer) { while(pointer) { printf("%d\n",pointer->data); pointer=pointer->next; } } link create_list(int array[],int num) { link tmp1,tmp2,pointer; int i; pointer=(link)malloc(sizeof(node)); pointer->data=array[0]; tmp1=pointer; for(i=1;i<num;i++) { tmp2=(link)malloc(sizeof(node)); tmp2->next=NULL; tmp2->data=array[i]; tmp1->next=tmp2; tmp1=tmp1->next; } return pointer; } void main() { int arr[]={3,12,8,6,10}; link ptr; ptr=create_list(arr,5); printf_list(ptr); } -------- tmp1->next=tmp2; tmp1=tmp1->next; 請問執行這兩行後,不就會變成tmp1=tmp2了嗎? 謝謝回答 |
是啊!如果你把變數名稱 tmp1 換成 startNode, tmp2 換成 endNode,看起來應該會比較清楚: [CODE] link create_list(int array[],int num) { link startNode, endNode, newNode; int i; newNode = (link)malloc(sizeof(node)); newNode->data = array[0]; startNode = newNode; for(i=1; i<num; ++i) { endNode = (link)malloc(sizeof(node)); endNode->next = NULL; endNode->data = array[i]; startNode->next = endNode; startNode = startNode->next; } return newNode; } [/CODE] 每次都由最後一個 node 去加,所以 startNode 會在每次進入 for 的最後變成 endNone。 |
我的想法是.... for(i=1;i<num;i++) { tmp2=(link)malloc(sizeof(node)); tmp2->next=NULL; tmp2->data=array[i]; tmp1->next=tmp2; tmp1=tmp1->next; } 是如何將tmp2指向tmp2->next呢? step: 1.將tmp2指向一個結構位址 2.tmp2.next=NULL 3.tmp2.data=array[i] 4.將tmp1->next指向tmp2,使其連接 5.將tmp1指向tmp1.next 6.再次 將tmp2指向一個結構位址.故請問這時的tmp2不是應指向tmp2->next了嗎? ...... 謝謝回答 |
[QUOTE] 1.將tmp2指向一個結構位址 2.tmp2.next=NULL 3.tmp2.data=array[i] 4.將tmp1->next指向tmp2,使其連接 5.將tmp1指向tmp1.next 6.再次 將tmp2指向一個結構位址.故請問這時的tmp2不是應指向tmp2->next了嗎? [/QUOTE] 第 6 點我不明白,再次將 tmp2 指向一個位址(表示你又向 OS 多要了一塊 node 大小的記憶體),這時 tmp2 是指向這塊 "將要新增的 node" 的位址才對啊!這時候 tmp2->next 可能是指向任意地方(按照你定義 node 的方法來看),因為 tmp2 是整個 list 的最後一個 node,所以要把 tmp2->next 設為 NULL! 你可以畫一個圖(或是,用 debug 模式追踪一下你的 code),看一下 tmp1, tmp1->next, tmp2, tmp2->next 4 個值的變化,應該會比較瞭解了。 |
我的問題是程式是如何新增資料的...一直想不出來,不是連續新增node來加入資料嗎 |
[QUOTE][i]最初由 金田一 發表[/i] [B]我的問題是程式是如何新增資料的...一直想不出來,不是連續新增node來加入資料嗎 [/B][/QUOTE] 是啊! tmp2=(link)malloc(sizeof(node)); 這一行就是向 OS 要一塊 node 大小的記憶體, malloc 會傳回這塊記憶體的位址,將它轉型成 link 後存到 tmp2,所以 tmp2 這時已經指向一個新的 node 啦!! |
嗯...我本以為tmp2會和前的tmp2重疊. 謝謝回答. |
| 所有時間均為 +8。現在的時間是 07:24 PM。 |
| XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。