2011-03-06 96 views
0

我在下面的代碼得到一個分段錯誤:打印鏈接列表。我究竟做錯了什麼?

void print_stack(Node * root) { 
    while(root != NULL) { 
    // print the node 
    root = root->next; 
    } 
} 

鑑於此作品:

int print_stack(Node ** root) { 

    Node * tmp = *root; 

    while(*root != NULL) { 
    // print the node 
    *root = (*root)->next; 
    } 

    *root = tmp; 
} 

的問題是什麼我做錯了嗎?對於這兩個函數,我都將節點指針的地址傳遞給列表的頭部。我試圖讓第一個函數工作,因爲它似乎更理想(沒有指針分配和永久更改根指針)..謝謝。

編輯:我已經張貼在這裏的代碼:http://dpaste.com/477724/

+0

賽格故障的「根=根 - >下一個」行,或別的地方在你的程序? – Jollymorphic 2011-03-06 04:37:13

+0

@Jollymorphic:我不這麼認爲..如果下一個是NULL,那麼while循環中的條件應該會導致它斷開。第二個功能確實有效。 – Sam 2011-03-06 04:42:18

+0

如果編譯鏈接中的確切發佈代碼,那麼您肯定會得到編譯錯誤,而不是運行時錯誤(即seg故障)。 – Mahesh 2011-03-06 05:03:14

回答

1

您傳遞了一個節點指針的地址,而該函數只需要一個節點指針。

此:

print_stack(&main); 

應該是這樣的:

print_stack(main); 
+0

它可能是任何東西。 1)這只是錯誤的類型。 2)你嘗試訪問root-> next,這對指針指針不起作用,3)你可能訪問試圖訪問數據成員的「// print the node」部分。這就像2)會失敗。 – quasiverse 2011-03-06 05:15:32

0

後所有的代碼,顯示鏈表的初始化 - 好像它應該工作。

class Node 
{ 
public: 
    Node(); 
    Node *next; 
}; 

Node::Node() 
{ 
    next = NULL; 
} 

void print_stack(Node * root) 
{  
    while(root != NULL) 
    {  // print the node  
     root = root->next;  
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Node *root = new Node(); 
    Node *begin = root; 
    for (int i=0;i<10;i++) 
    { 
     Node *pNew = new Node(); 
     root->next = pNew; 
     root = pNew; 
    } 
    print_stack(begin); 
    return 0; 
} 
+0

http://dpaste.com/477724/謝謝 – Sam 2011-03-06 04:39:40

+0

是的,沒有錯你顯示的代碼。問題必須存在於您未向我們顯示的代碼中。 – 2011-03-06 04:40:27

+0

嗨,Jeff ..感謝您花時間打出解決方案。不幸的是,這並不能真正幫助我,因爲你通過C++使用了不同的實現。我很想知道我在代碼中做了什麼錯誤,以及如何解決這個問題。抱歉給你帶來不便。 – Sam 2011-03-06 04:50:50

0

有你的鏈接發佈在程序編譯錯誤。

ERROR1:int print_stack(Node * root)應該返回int。但它的定義並非如此。

誤差2:在開關的情況下,而主叫print_stack,應該通過Node*類型的參數,而不是Node**。所以,它應該是print_stack(main);

誤差3:在切換功能的case u,推函數的參數應該是push(&main, &d);