#include
typedef struct no
{int age;
struct no *next;}node ;
node *ad(int a) //用來把值塞到一個新的記憶體空間的函數
{node *data;
data=(node *)malloc(sizeof(node));
data->age=a;
return data ;
}
void main(void)
{char a;
int address;
node *index,*index1;
scanf(\"%d\",&address);
index=(node *)malloc(sizeof(node));
index->age=address;
index1=index;
while (address!=0) //用0來終止....我不會用EOF
{scanf(\"%d\",&address) ;
index->next=ad(address);
index=index->next;
index->next=NULL;
};
while (index1!=NULL)
{printf(\"%d\\n\",index1->age);
index1=index1->next;
}
}
---------------------------------------------------------------------------------------------------------
以上是小弟寫的鏈結串列,這只是簡單的單向鏈結,我知道寫的不好(新手阿Orz),也有點誤打誤撞,現在有一個問題,再第一個while這邊,我的用意是將這些已宣告的記憶體空間串聯起來,程式跑的很正常,但我覺得不太對,我覺得index既然一直往下移動,那之前串的不是就等於沒串,因為我有點迷惘,所以加了第二個while,結果很正常,可以把我之前的列出來.那是這邊我想錯了嗎,請大大們解說一下八^^
2006-02-04 16:45:57 · 1 個解答 · 發問者 魚子醬 1 in 電腦與網際網路 ➔ 程式設計
恩~我的問題是,舊的index指標會被新的index所取代,那我的想法是,之前while裡指好的指標就會被新的index所取代那之前所指的會不會斷掉或是不存在呢,然後只剩下最後面有連起來而已?事實上是不會的,但為什麼勒,再請你解說一下八~3Q
2006-02-04 19:08:56 · update #1
你的ad()函式最主要的功能是malloc一個node出來. 一開始你先向使用者要address. address得手之後malloc第一個node.並且把index和index1都指向第一個node. 再來如果address不是0的話就執行迴圈. 如果address是0那index和index1都指向第一個node.所以你的鏈結串列裡有一個node.一個age是0的node.(也就是說你的鍵結串列尾的值一定都是0)不過你在此有一個問題, 如果address是0的話,index指向的node裡的next是亂數(你沒給值).這樣執行時會出問題喔. 鏈結串列裡最後一個node的next應指向NULL才對.回到address不是0的狀況.現在index和index1都是指向鏈結串列的頭.在迴圈裡你再要address. 之後呼叫ad()取得新的一個node(傳入剛得到的address).並把index的next指向新的node.如此一來, index裡所有的成員變數都設定了值. 之後把index指向index的next. 且把新的index的next指向NULL.所以每執行迴圈一次,index->next就會指向新的一個node且在建造完新的一個node之後index會指向新的一個node.注意, 在此迴圈裡你只動到index而沒動到index1. 所以index1在執行完迴圈之後還是指向鏈結串列的頭.所以迴圈執行完之後你就有一個鏈結串列. 而index1指向鏈結串列的頭, index指向鏈結串列的尾. 假如我在執行此程式時輸入9, 1, 0.那 執行前 執行後 輸入值index的值index1的值index的值index1的值鏈結串列9亂數亂數999->亂數199199->1->NULL019099->1->0->NULL在第二個迴圈執行時index1裡指向鏈結串列的頭.所以你用來游走鏈結串列.不過因index1是唯一一個指向鏈結串列頭的指標, 所以迴圈執行完之後, 你就沒有指向鏈結串列頭的指標了. 如此你的鏈結串列,除了鏈結串列尾的node以外都遺失掉了.你的程式最後有一個小問題, 就是你沒用free()歸還malloc來的記憶體.有借有還,再借不難嘛... :)這是我的寫法#include
2006-02-05 01:57:14 補充:
不好意思,沒講清楚.以我的例子為主,第一次執行迴圈之前,index1和index指向同一個node(node的age是9). 第一次執行迴圈時呼叫ad()來malloc()新的一個node(新的node的age是1).並且把index指向的node裡的next指向新的一個node. 所以原來的node裡的資料age還在, 且所以9的node裡的next指向1的node. 而1的node裡的next指向NULL. 之後把index指向的node裡的next.要記得index是指向9的node. 所以index現在會指向1的node. 所以鏈結串列變成9->1.
2006-02-05 01:57:22 補充:
第二次執行迴圈時呼叫ad()來malloc()新的一個node(新的node的age是0).並且把index指向的node裡的next指向新的一個node. 要記得現在index是指向1的node. 所以1的node裡的next指向0的node. 而0的node裡的next指向NULL. 所以鏈結串列變成9->1->0.要注意,改變index指向的node並不會改變index原來指向的node的資料. 原來的node的資料是不會變的.也就是說如果index本來是指向9的node.你把index改成指向1的node的話.9的node還是9的node,不會改變.懂不懂?不懂請再問
2006-02-05 02:02:36 補充:
index=index->next;不能講是”舊的index指標會被新的index所取代”. 應是”把index改指向index->next所指向的node”. 比如說index指向9的node.index->next指向1的node. index=index->next;表示執行完之後index會指向1的node.只改指標,不改內容.
2006-02-04 17:43:00 · answer #1 · answered by 龍 7 · 0⤊ 0⤋