【求助】TC的指標問題



贊助商連結


金田一
2004-08-16, 05:49 PM
#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,看起來應該會比較清楚:


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;
}


每次都由最後一個 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
1.將tmp2指向一個結構位址
2.tmp2.next=NULL
3.tmp2.data=array[i]
4.將tmp1->next指向tmp2,使其連接
5.將tmp1指向tmp1.next
6.再次 將tmp2指向一個結構位址.故請問這時的tmp2不是應指向tmp2->next了嗎?


第 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
最初由 金田一 發表
我的問題是程式是如何新增資料的...一直想不出來,不是連續新增node來加入資料嗎

是啊!

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

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

金田一
2004-08-21, 08:58 AM
嗯...我本以為tmp2會和前的tmp2重疊.
謝謝回答.