2016-10-29 255 views
1

我正在写一个简单的函数来插入C++链表的末尾,但最后它只显示第一个数据。我无法弄清楚什么是错的。这是函数:在链表的末尾插入

node* Insert(node* head, int data) 
{ 
    if (head == NULL) { 
     head = new node(); 

     head->data = data; 
     head->link = NULL; 

     return head; 
    } 
    else { 
     node* temp = head; 
     while (temp != NULL) { 
      temp = temp->link; 
     } 

     node* temp2 = new node(); 

     temp2->data = data; 
     temp2->link = NULL; 
     (temp->link) = temp2; 

     return head; 
    } 
} 
+0

在'(temp-> link)= temp2;','temp'是一个空指针(如果它不是,你仍然在'while(temp!= NULL)'循环中旋转)。所以你解引用了一个空指针,它是UB。 – melpomene

+0

非常感谢!:) – mistletoe

回答

0

变化while条件构建从:

while (temp!=NULL) { 
    temp=temp->link; 
} 

while (temp->link!=NULL) { 
    temp=temp->link; 
} 

在声明中,temp->link = temp2,温度是一个空指针。您正在取消引用NULL指针。

要追加后面的节点,temp指针应该指向链表的最后一个节点。因此,在while循环中,当您到达最后一个节点时,您需要停止链表遍历,即link成员指向无(has NULL)的节点。 while (temp->link!=NULL)将在最后一个节点停止,因为最后一个节点将有link成员指向NULL

0
node* Insert(node* head, int data) 
{ 
    if (head == NULL) { 
     head = new node(); 
    } 
    else { 
     while (head->link != NULL) { 
      head = head->link; 
     } 
     head = head->link = new node(); 
    } 
    head->data = data; 
    head->link = NULL; 
    return head; 
} 
+0

代码转储不是答案。 –

+0

@EmilyL。在发表评论之前,您没有阅读过修改内容。对不起,我尝试将代码分解为了在修复代码之前为什么看到了代码中的核心转储。 – Stargateur

1

你可以这样做简化你的逻辑:

void Insert(node **pnode, int data) 
{ 
    while (*pnode) { 
     pnode = &(*pnode)->link; 
    } 
    *pnode = new node(data, NULL); 
} 

假设你有一个node构造函数初始化参数,从和datalink

与其说这是

head = Insert(head, 42); 

的你现在会做

Insert(&head, 42); 
0

变化,而(温度!= NULL)改为(TEMP->链接!= NULL)