2016-08-14 70 views
0

有人可以幫我找出下面的代碼的問題。爲什麼我不能在頭後插入節點到C++鏈接列表中?

#include <iostream> 

using namespace std; 

struct node 
{ 
    int a,b; 
    struct node* next=NULL; 
}; 

node* head=NULL; 

void insert(int a,int b) 
{ 
    if(head==NULL) 
    { 
     head=new node; 
     head->a=a; 
     head->b=b; 
     return; 
    } 
    node* cur=head; 
    while(cur!=NULL) 
    { 
     cur=cur->next; 
    } 
    cur=new node; 
    cur->a=a; 
    cur->b=b; 
    return; 
} 

void display() 
{ 
    node* cur=head; 
    while(cur!=NULL) 
    { 
     cout<<cur->a<<"\t"<<cur->b<<"\n"; 
     cur=cur->next; 
    } 

} 

int main() 
{ 
    int i; 
    for(i=0;i<3;++i) 
    { 
     insert(i,i+1); 
    } 
    display(); 
    //cout<<h->next->a; 
    return 0; 
} 

這是我得到的輸出:

 0  1 

看來我只能顯示頭節點,沒有被插入之後。如果我嘗試訪問頭後的下一個節點,則會出現分段錯誤。這是爲什麼?

+2

你試過調試?這是你必須學習的一項重要技能。 [這裏是一個簡單的解釋](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/):)祝你好運 – Rakete1111

+0

@ Rakete1111,耶我試過顯示的人所有的節點內容在插入到插入函數後立即生效,但是在顯示和主函數中,它好像是從列表的其餘部分開始分離頭部 –

+0

請注意,您是如何從不在任何地方實際設置下一個變量的? – samgak

回答

4

搜索代碼是:

node* cur=head; 
while(cur!=NULL) 
{ 
    cur=cur->next; 
} 
cur=new node; 

在循環結束時,你已經找到了正確的地方加入了新的節點,但是您覆蓋與cur = new node; - 所以你需要使用更多的東西一樣:

node *new_node = new node; 
new_node->a = a; 
new_node->b = b; 
new_node->next = nullptr; 
cur->next = new_node; 

,或等效:

cur->next = new node; 
cur->next->a = a; 
cur->next->b = b; 
cur->next->next = nullptr; 

更妙的是,你會創建一個構造爲struct node類,如:

node(int a_init = 0, int b_init = 0) : a(a_init), b(b_init), next(nullptr) { } 

然後:

cur->next = new node(a, b); 

會做整個初始化工作。

+0

Heyy男人,我只是看到了你的評論。我一分鐘後自己解散了這個情況。它工作的人感謝。 –

4
  • 雖然插入,更新head->next爲NULL(當head是NULL) 和curr->next爲NULL(當一些元件已經在列表中) 分別。
  • 您未鏈接headcurr。要鏈接headcurr,您可以使用 創建另一個指針,而不是保存新元素,如new_ptr。 保持curr這樣curr->next=NULL,然後寫 curr->next=new_ptr

    void insert(int a,int b) 
    { 
        if(head==NULL) 
        { 
         head=new node; 
         head->a=a; 
         head->b=b; 
         head->next=NULL; 
         return; 
        } 
        node* cur=head,*new_ptr; 
        while(cur->next!=NULL) 
        { 
         cur=cur->next; 
        } 
        new_ptr=new node; 
        new_ptr->a=a; 
        new_ptr->b=b; 
        new_ptr->next=NULL; 
        curr->next=new_ptr; 
        return; 
    } 
    
+0

而不是發佈整個代碼,只需發佈​​相關更改。它更容易閱讀:) – Rakete1111

3

我發現了錯誤。插入時,不是坐在節點中,而是檢查它是否爲空,查看前面的1個節點並檢查它是否爲空。因爲如果你不這樣做,那麼列表將會被破壞,並且cpp會在其他地方分配內存,而不是分配給最後一個列表節點的下一個分支的指針。

改進的插件功能:

void insert(int a,int b) 
{ 
    if(head==NULL) 
    { 
     head=new node; 
     head->a=a; 
     head->b=b; 
     head->next=NULL; 
     return; 
    } 
    node* cur=head; 
    while(cur->next!=NULL) 
    { 
     //cout<<cur->a<<"\t"<<cur->b<<"\n";; 
     cur=cur->next; 
    } 
    cur->next=new node; 
    cur->next->a=a; 
    cur->next->b=b; 
    return; 
} 
1

在創建任何節點時,該節點的下一個指針變爲null按你的節點的定義。

struct node 
{ 
    int a,b; 
    struct node* next=NULL; 
}; 

現在,創建開始節點後,開始節點的下一個指針是NULL。而當U創建你的第二個節點,你沒有你的第一個節點的下一個節點指向第二個節點。那麼如果你沒有指向第二個節點的指針,你將如何能夠到達第二個節點。

因此,解決辦法將是 -

void insert(int a,int b) 
{ 

node *temp; 
if(head==NULL) 
    { 
     head=new node; 
     head->a=a; 
     head->b=b; 
     temp=head; 
     return; 
    } 
    node* cur=head; 
    while(cur!=NULL) 
    { 
     cur=cur->next; 
    } 
    cur=new node; 
    temp->next=cur; 
    cur->a=a; 
    cur->b=b; 
    temp=cur; 
     return; 
}