全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1663
推到 Plurk!
推到 Facebook!

關於動態鏈結

尚未結案
B.D蘭提斯
一般會員


發表:4
回覆:5
積分:1
註冊:2004-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-13 15:47:05 IP:61.228.xxx.xxx 未訂閱
動態鏈結這部分我看過很多書 不過幾乎都寫的差不多 用是會用不過有個問題 一般宣告一個結構 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-13 18:06:39 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-14 11:52:13 IP:61.228.xxx.xxx 未訂閱
多謝你的教學 最近問的問題都是您回答的,謝謝 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-14 18:39:08 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-14 18:47:18 IP:211.76.xxx.xxx 未訂閱
部分內容被截掉,補登一下,可能說太多了!哈哈! =====***** 而第二個問題 這種結構中有自己, 有類似遞迴的寫法 那下面兩種寫法會相同嗎? 法一:
系統時間:2024-05-02 7:36:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!