關於動態鏈結 |
尚未結案
|
B.D蘭提斯
一般會員 發表:4 回覆:5 積分:1 註冊:2004-06-01 發送簡訊給我 |
動態鏈結這部分我看過很多書
不過幾乎都寫的差不多
用是會用不過有個問題
一般宣告一個結構
struct Node
{
int i;
int j;
Node *next;
};
一般書上畫這個資料的型態
i j|next
我的問題是
NEXT的樣子
查了許多書上都沒寫
因為在自己中宣告自己
感覺有點類似遞回
我想NEXT樣子是包函*i跟 *j
不過這樣NEXT中不是又會有NODE的嗎?
麻煩高手解答一下
若是這樣宣告
struct Node
{
int i;
Node *next;
int j;
};
這樣結果會跟上面一樣嗎?
而
struct Node
{
int i;
int j;
};
Node *p;
這樣的寫法*P會根*next相同嗎?
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
B.D蘭提斯 您好:
struct NodeFloat { int i; int j; float *next; };先看上面的結構,相信很容易能了解它包含三個成員:兩個int與一個float指標。 接著再看下面的結構, struct Node { int i; int j; Node *next; };幾乎與上面NodeFloat相同,唯一比較奇怪有點讓人產生遞迴聯想的是:Node *next; 其實next它也只是表示一個指向結構Node的指標,跟上述的指標其實意義類似。 只是C/C 容許結構在宣告的同時,可以建立一個指向自己相同結構型態的指標變數。 這樣宣告的目的是為了要建立串列(List:一串連接的node,而非文中提到的動態鏈結),能夠方便我們動態的增減節點。 靠著next我們就能利用它指向下一個節點。 ex. struct nNode node1, node2; node1.next = &node2; ..... 所以底下的結果: (node1.next)->i = 10; 與 node2.i = 10; 相同 (*node1.next).j = 99; 與 node2.j = 99; 相同 有了這些概念,其它的就請參考課本了。 |
B.D蘭提斯
一般會員 發表:4 回覆:5 積分:1 註冊:2004-06-01 發送簡訊給我 |
多謝你的教學
最近問的問題都是您回答的,謝謝
List的動作我也懂
動態鏈結的意義跟使用上我也都懂
最近想把C語言練的更熟
所以把以前一直有些小疑問的地方提出來
struct Node { int i; int j; Node *next; };載Node中的NEXT意義就類似一個指標 可以指NODE的指標 跟 int i; int *pi; pi=&i; 的意義相同 而*pi很單純的是一個int的指標 若是 struct Node { int i; int j; }; Node *next;若只是這樣 我也能理解next中包函的東西 我的第一個問題: struct Node { int i; int j; Node *next; }; 中的型態是如何 而若是這樣宣告 跟上面地next相同嗎 struct Node { int i; int j; }; Node *next; 單純比較NEXT,而不管NODE的結構 而第二個問題 這種結構中有自己, 有類似遞迴的寫法 那下面兩種寫法會相同嗎? 法一: struct Node { int i; int j; Node *next; }; 法二: struct Node { int i; Node *next; int j; } |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
B.D蘭提斯 您好: 因最近比較有空看問題,恰巧看到您的提問,於是就提供一些個人的經驗分享,或許是緣分吧! =====*****
我的第一個問題: < class="code">
struct Node1
{
int i;
int j;
Node1 *next1;
};
中的型態是如何
而若是這樣宣告
跟上面地next相同嗎
struct Node2
{
int i;
int j;
};
Node2 *next2;
單純比較NEXT,而不管NODE的結構
=====*****
為方便區分容我將上述的宣告修改一下。
精確的說:
Node1 *next;與Node2 *next;都是指標變數,她們在記憶體中所佔的長度是一樣的。
唯一不一樣的是在她們前方所宣告的資料型態。
因為指標變數有一個非常方便且重要的特性:
透過對她們的加減運算,能夠讓指標變數任意的指向你所要的相同型態的變數位置,
[code]
ex. int a[5] ={ 0,1,2,3,4 };
int *ptr;
ptr = &a[2];
ptr = ptr 1; // 此刻指向a[3]; => *ptr = a[3];
ptr = ptr - 2; // 此刻指向a[1]; => *ptr = a[1];
*(ptr 3) = 10; // 此刻a[4] = 10;
把指標變數加一將會使其指向下一相同型態的變數的位址,把指標變數減一將會使其指向前一相同型態變數的位址。
問題是指標變數為什麼能知道該移多少bytes呢?這就是在宣告指標變數時,我們要寫出他是指向哪一種型態的原因所在,接下來的compiler會幫我們作編譯。
所以在你把指標變數加一的時候,原先存在該指標變數中的值將增加:sizeof(該資料型態),而不見得是一(除非資料型態是類似char型態)。 因此你的第一個問題:
Node1 *next1; =>指向含有兩個int變數及一個指標變數所在的起始位址。
Node2 *next2; =>指向含有兩個int變數起始位址。
當我們同時將next1, next2加一的話,其內含值將分別增加sizeof(Node1)與sizeof(Node2)。 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====##### 發表人 - richtop 於 2004/07/14 18:43:06 發表人 - richtop 於 2004/07/14 21:22:03
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |