火車 發問時間: 電腦與網際網路程式設計 · 1 0 年前

Linked List Stack

演算法如下:

struct _NODE

{

int Data;

struct_NODE *pNext;

};

typedef struct_NODE node;

typedef node *link;

typedef node _TOP;

void AddNodeToStack( _TOP **top, int nVal )

{

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

pNewNode->Data = nVal;

pNewNode->pNext = *top;

*top = pNewNode;

}

問題一:

請問 addNodeToStack( _TOP **top, int nVal ) 這個函式裡,為什麼要寫 _TOP **top ??( 希望可以詳細說明 有點模糊 )

問題二:

可以把這個函式改成以下的形式嗎?

void AddNodeToStack( _TOP *top, int nVal )

{

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

pNewNode->Data = nVal;

pNewNode->pNext = top;

top = pNewNode;

}

已更新項目:

謝謝這位前輩,我想我會搞混,是因為我看另一本書的時候,他 add stack 是這樣寫的

struct node

{

int item;

struct node *next;

}

2 個已更新項目:

void push_stack( int data, struct node *ptr, struct node *top )

{

ptr = ( struct node * )malloc( sizeof( struct node ) ); / *新建立的節點 */

ptr->item = data;

ptr->next = top;

top = ptr;

}

3 個已更新項目:

if 我定義 typedef struct node Node 那這個函式不就可以寫成

void push_stack( int data,Node *ptr, Node *top )

{

ptr = ( Node * )malloc( sizeof( struct node ) ); / *新建立的節點 */

ptr->item = data;

ptr->next = top;

top = ptr;

}

因為這樣,所以才有之前的疑問…

還是說另一本書這寫的是錯的…

4 個已更新項目:

To all:

感謝你們的回答,我大概知道我的問題了!

4 個解答

評分
  • 1 0 年前
    最佳解答

    他寫 _TOP **top的意思是傳入的變數是一個指標中還有指標的變數,

    現在我舉個列子,

    //先宣告一個 link 指標並配置記憶體空間

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

    //宣告一個 link指標

    link* pLink = ( link* ) malloc( sizeof( link ) );

    //把pNewNode給 pLink指標,由於pNewNode本身是node*

    //而 pLink 則是 node**,是由上面的typedef推導出來的。

    //所以要指派的時候必需要像下面這樣寫

    *pLink = pNewNode;

    //現在呼叫addNodeToStack( _TOP **top, int nVal );

    //就可以這樣寫

    addNodeToStack( pLink, 10 );

    不過基本上指標中還帶有指標的話通常都是用在指標陣列啦!

    我遇過的情形是陣列佔絕大部分。

    第二個問題是一般在處理link list的時候的做法,舉個例子好了。

    //先宣告一個 link 指標並配置記憶體空間

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

    //現在呼叫addNodeToStack( _TOP *top, int nVal );

    //就可以這樣寫

    addNodeToStack( pNewNode, 10 );

    而如果是傳入第一個問題的那種指標中還有指標的話,

    就要像下面這樣寫,

    addNodeToStack( *pLink, 10 );

    因為pLink是指標中還有指標,

    所以用 提領運算子* 提出來的東西還是指標,

    必須再用 提領運算子* 再提一次出來,

    才會是指標所指的內容!

    以上就這樣,

    有問題再發問吧!^^~

    2008-08-12 10:17:04 補充:

    你說的

    定義 typedef struct node Node 那這個函式不就可以寫成

    void push_stack( int data,Node *ptr, Node *top )

    是改可以改成那樣沒錯,

    也可以增加程式的閱讀性。

    至於你說的 "還是說另一本書這寫的是錯的… "

    這句話是指?

    是指雙重指標嗎?

    如果是雙重指標的話,

    他這樣用list也是有可能啦!

    如果是要 連結 指標 陣列的話,

    是有可能會使用雙重指標。

    以上就這樣。

    有問題再發問吧!^^~

  • SiYu
    Lv 5
    1 0 年前

    http://www.phpbbserver.com/graphicsparalle/viewtop...

    請參考此篇. .

    2008-08-14 16:59:17 補充:

    怪怪. 我看的到阿.

    2008-08-14 17:18:56 補充:

    看看這個可行嗎 ??

    http://cockroachtw.spaces.live.com/blog/cns!205180...

    2008-08-15 10:41:13 補充:

    不知道你看懂了嗎? 然後再想想你的問題. 你就知道為什麼.

  • 1 0 年前

    **top => 指向指標的指標

    如字面意思~不難懂

    2008-08-12 03:12:43 補充:

    addNodeToStack( _TOP **top, int nVal )

    傳入是 Top指標的位置

    void AddNodeToStack( _TOP *top, int nVal )

    傳入是 Top指標指到的某個型別為_TOP object的位置

    top = pNewNode; 那這一行如何出事~版大知了吧~

    2008-08-12 09:28:31 補充:

    應用不同~

    指標問題~用圖解可幫忙思考~

  • 1 0 年前

    恩謝謝…我知道他是指標的指標

    不過為什麼要這麼弄?

    2008-08-12 20:09:24 補充:

    Your request is forbidden

    Sorry, but you'r visiting a ads web, it is prohibited!

    這個連結無法看呢

    2008-08-14 20:14:10 補充:

    非常感謝 我可以看到囉!

    2008-08-15 12:26:05 補充:

    有個實際的 SOURCE CODE 就好懂許多了,我想以下的話是重點:

    你可以把 tree* 看成某種變數型態. 傳給test 也是 tree* 所以傳的是變數的value.

    在這邊強調. 這是call by value (個人很討驗有人說C 有call by address)

    既然是call by value 當然function 內改動值是不會影響到主程式.

    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    咪咪 你說對吧?

還有問題?馬上發問,尋求解答。