2010-09-25 106 views
1

我遇到了一些我寫過的鏈表的問題。我不知道,如果它是我的插入函數的問題,或者如果它是我的遍歷函數是不正確的。我希望得到一些意見。一個側面說明,我現在主要在主要列表中,因爲我不知道我的initNode函數是否正確。鏈接列表問題

#include <iostream> 

using namespace std; 

typedef struct Node 
{ 
    int data; 
    Node *next; 
}; 

void initNode(Node *head) 
{ 
    head = new Node; 
    head->next = NULL; 
} 

void insertNode(Node *head, int x) 
{ 
    Node *temp; 
    temp = new Node; 
    temp->data = x; 

    temp->next = head; 
    head = temp; 

} 

void traverse(Node *head) 
{ 
    Node *temp; 
    temp = head; 

    if(head == NULL) 
    { 
     cout << "End of list. " << endl; 
    } 
    else 
    { 
     while(temp != NULL) 
     { 
     cout << temp->data << " "; 
     temp = temp->next; 
     } 
    } 

} 

int main() 
{ 
    Node *head; 
    head = NULL; 

    insertNode(head, 5); 
    insertNode(head, 5); 

    traverse(head); 

    return 0; 
} 

回答

4

您的head不是從insertNode返回main。請注意,即使head是一個指針,指針本身也是一個值,並且指針值的任何更改都不會反映在main中。最簡單的辦法是通過背部的head更新值:

Node *insertNode(Node *head, int x) 
{ 
    ... 
    return head; 
} 

而且還更新了它main

head = insertNode(head, 5); 

這樣做的另一個常見方法是將一個指針傳遞給一個指針和更新它直接:

void insertNode(Node **head, int x) 
{ 
    Node *temp; 
    temp = new Node; 
    temp->data = x; 

    temp->next = *head; 
    *head = temp; 
} 

,並調用它是這樣的:

insertNode(&head, 5); 
0

你讓你寫入initNode函數的方式會導致內存泄漏。你已經傳入了一個指針,但你需要傳入一個指針的引用。 (同樣的問題,詹姆斯和卡薩布蘭卡提到insertNode。)