PCZONE 討論區

PCZONE 討論區 (https://www.pczone.com.tw/vbb3/)
-   -- 其 他 軟 體 討 論 版 (https://www.pczone.com.tw/vbb3/forum/8/)
-   -   【求助】TC的指標問題 (https://www.pczone.com.tw/vbb3/thread/8/100899/)

金田一 2004-08-16 05:49 PM

【求助】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了嗎?

謝謝回答

HarrisonLin 2004-08-18 11:09 PM

是啊!如果你把變數名稱 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。

金田一 2004-08-19 04:34 PM

我的想法是....
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了嗎?
......
謝謝回答

HarrisonLin 2004-08-19 06:42 PM

[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 個值的變化,應該會比較瞭解了。

金田一 2004-08-20 10:47 PM

我的問題是程式是如何新增資料的...一直想不出來,不是連續新增node來加入資料嗎

HarrisonLin 2004-08-20 11:25 PM

[QUOTE][i]最初由 金田一 發表[/i]
[B]我的問題是程式是如何新增資料的...一直想不出來,不是連續新增node來加入資料嗎 [/B][/QUOTE]

是啊!

tmp2=(link)malloc(sizeof(node));

這一行就是向 OS 要一塊 node 大小的記憶體, malloc 會傳回這塊記憶體的位址,將它轉型成 link 後存到 tmp2,所以 tmp2 這時已經指向一個新的 node 啦!!

金田一 2004-08-21 08:58 AM

嗯...我本以為tmp2會和前的tmp2重疊.
謝謝回答.


所有時間均為 +8。現在的時間是 07:24 PM



 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : [email protected]

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。