2013-12-21 102 views
1

我的程序應該創建一個鏈接列表並顯示它。我的問題是當addelemnt_end函數結束時,它不會更新headlast
我試過調試,當我的功能完成時,信息和頭部和尾部的下一部分「無法讀取內存」。退出功能後,節點不保存

struct node{ 
int info; 
node *next; 
}; 

node *head, *last; 

void addelement_end(node *head, node *last, int element) 
{if (head == NULL) 
    { node *temp = new node; 
     temp->info = element; 
     temp->next = NULL; 
     last = temp; 
     head = temp; 

    } 
    else {node*temp = new node; 
     last->next = temp; 
     temp->info = element; 
     temp->next = NULL; 
     last = temp; 
    } 
} 
void show(node* head, node *last) 
{ 


if (head==NULL) 
     cout << "Empty list"; 

    else 
    while (head != NULL) 
    { 
     cout << head->info << " "; 
     head = head->next; 
    } 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

int x, n, i; 
cout << "how many numbers"; 
    cin >> n; 

head = last = NULL; 
for (i =1; i <= n; i++) 
{ 
    cin >> x; 
    addelement_end(head, last, x); 

} 
show(head, last); 

return 0; 
} 

回答

2

這是一個非常常見的錯誤。這裏有一個類似的問題的說明:

int change_a(int a) { 
    a = 42; 
} 

int main() { 
    int a = 10; 
    change_a(a); 
    printf("%d\n", a); 
    return 0; 
} 

這將打印10,因爲在功能change_a你只修改包含在變量a值的副本。

正確的解決方案是傳遞一個指針(或者因爲使用C++而使用引用)。

int change_a(int *a) { 
    *a = 42; 
} 

int main() { 
    int a = 10; 
    change_a(&a); 
    printf("%d\n", a); 
    return 0; 
} 

但也許你會告訴我:「我已經在使用指針了!」。是的,但指針只是一個變量。如果要更改指針指向的位置,則需要將指針傳遞給該指針。

所以,試試這個:

void addelement_end(node **head, node **last, int element) 
{ 
    if (*head == NULL) 
    { node *temp = new node; 
     temp->info = element; 
     temp->next = NULL; 
     *last = temp; 
     *head = temp; 
    } 
    else { 
     node *temp = new node; 
     (*last)->next = temp; 
     temp->info = element; 
     temp->next = NULL; 
     *last = temp; 
    } 
} 
+0

,我應該如何調用該函數?我已經嘗試了很多可能性,每次我得到這個錯誤C2664:'void addelement_end(node **,node **,int)':無法將參數1從'node *'轉換爲'node **' –

+0

@ user3125464給出變量的地址:'addelement_end(&head,&last,x);' –

+0

非常感謝您的幫助,它可以工作。如果你知道用於學習指針的好材料將會很棒。 –