2013-11-21 184 views
2

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

void InsertAtEnd (node* &firstNode, string name){ 

     node* temp=firstNode; 

     while(temp!=NULL) temp=temp->next; 

      temp = new node; 
     temp->data=name; 
     temp->next=NULL; 

     if(firstNode==NULL) firstNode=temp; 

} 

回答

10

你写的是:

  • 如果firstNode为null,它与单节点代替temp这 没有下一个节点(和任何人的nexttemp

  • 否则,如果firstNode不为空,则没有任何反应,除了temp 节点被分配和泄漏。

下面是一个更正确的代码:

void insertAtEnd(node* &first, string name) { 
    // create node 
    node* temp = new node; 
    temp->data = name; 
    temp->next = NULL; 

    if(!first) { // empty list becomes the new node 
     first = temp; 
     return; 
    } else { // find last and link the new node 
     node* last = first; 
     while(last->next) last=last->next; 
     last->next = temp; 
    } 
} 

另外,我建议增加一个构造函数来node

struct node { 
    std::string data; 
    node* next; 
    node(const std::string & val, node* n = 0) : data(val), next(n) {} 
    node(node* n = 0) : next(n) {} 
}; 

,使您能够创建这样的temp节点:

node* temp = new node(name); 
1

您列表中的最后一个元素从来没有将它的next指针设置为列表中的新元素。

1

问题是你正在用新元素替换链表的头部,并且在这个过程中失去了对实际列表的引用。

要在末尾插入,你想改变while条件:

while(temp->next != null) 

循环后,temp将指向列表的最后一个元素。然后创建一个新的节点:

node* newNode = new node; 
newNode->data = name; 
newNode->next = NULL; 

然后换旁边这个新节点temp S:

temp->next = newNode; 

你也不需要通过firstNode作为参考,除非你想NULL被作为治疗一个长度为0的链表。在这种情况下,您将需要对方法进行重大修改,以便它可以单独处理firstNodeNULL的情况,因为在这种情况下,您无法评估firstNode->next而没有分段错误。

0

你做了两个基本错误:

  1. 当你在列表中滚动,你滚下最后一个元素,并开始在它背后的虚空建设。找到最后一个元素之后的第一个NULL是无用的。你必须找到最后一个元素本身(其'下一个'等于NULL的元素)。迭代temp->next,而不是temp

  2. 如果你想在最后追加元素,你必须用它的地址覆盖最后一个指针的NULL。相反,你在列表的开始处写入新的元素。

    void InsertAtEnd(node * & firstNode,string name) { node * newnode = new node; newnode-> data = name; newnode-> next = NULL;

    if(firstNode == NULL) firstNode = newnode; } else { node * last = firstNode; while(last-> next!= NULL)last = last-> next; last-> next = newnode; }}

请注意,如果您确保永远养活NULL,但始终有至少一个元素初始化所有列出这变得有点整洁。而且,在列表的开始处插入比在末尾添加要容易得多:newnode->next=firstNode; firstNode=newnode

0

如果您不想使用引用指针,则可以使用指向指针的指针。我的完整代码都象下面这样:

void insertAtEnd(struct node **p,int new_data) 
{ 
    struct node *new_node=(struct node *)malloc(sizeof(struct node)); 
    new_node->data=new_data; 
    new_node->next=NULL; 
    if((*p)==NULL)//if list is empty 
    { 
     *p=new_node; 
     return; 
    } 
    struct node* last=*p;//initailly points to the 1st node 
    while((last)->next != NULL)//traverse till the last node 
     last=last->next; 
    last->next=new_node; 
} 
void printlist(struct node *node) 
{ 
    while(node != NULL); 
    { 
     printf("%d->",node->data); 
     node=node->next; 
    } 
} 
int main() 
{ 
    struct node *root=NULL; 
    insertAtEnd(&root,1); 
    insertAtEnd(&root,2); 
    insertAtEnd(&root,3); 
    insertAtEnd(&root,4); 
    insertAtEnd(&root,5); 
    printlist(root); 
return 0; 
}  

了解需要以下两个变量的关键是认识问题:

  1. 结构节点** P:因为我们需要把它从根链接主节点中创建的节点。
  2. struct node * last:因为如果不使用,原始内容将随着while循环内下一个节点的内容而改变。最后只打印2个元素,最后2个节点,这是不需要的。
-1
void InsertAtEnd (node* &firstNode, string name){ 

     node* temp=firstNode; 

     while(temp && temp->next!=NULL) temp=temp->next; 

     node * temp1 = new node; 
     temp1->data=name; 
     temp1->next=NULL; 
     if(temp==NULL) 
      firstNode=temp1; 
     else 
      temp->next= temp1; 


} 

while循环将在临时返回== NULL在你的代码,而不是你需要的最后一个节点的指针,而从反馈环路这样

while(temp && temp->next!=NULL) temp=temp->next; 

并分配一个新的节点到返回的临时节点的下一个指针将把数据添加到链表的尾部。

+0

也许你可以添加一些说明... –

-1

您可以使用此代码:

void insertAtEnd(Node* firstNode, string name) 
{ 
    Node* newn = new Node;    //create new node 
    while(firstNode->next != NULL) //find the last element in yur list 
     firstNode = firstNode->next; //he is the one that points to NULL 
    firstNode->next = newn;    //make it to point to the new element 
    newn->next = NULL;  //make your new element to be the last (NULL) 
    newn->data = name;  //assign data. 
} 
0
void addlast (int a) 
{ 

    node* temp = new node; 
    temp->data = a; 
    temp->next = NULL; 
    temp->prev=NULL; 
    if(count == maxnum) 
    { 
     top = temp; 
     count++; 
    } 
    else 
    { 
     node* last = top; 
     while(last->next) 
      last=last->next; 
     last->next = temp; 
    } 
} 
+1

也许你可以添加一些说明... –

+2

请仔细阅读本有关代码只回答: http://meta.stackoverflow.com/a/303605/4284627 –

+0

欢迎来到堆栈溢出!虽然这段代码可能会回答这个问题,但为什么和/或代码如何回答这个问题提供了额外的背景,这提高了它的长期价值。不鼓励使用仅有代码的答案。 – Ajean