首页 > 解决方案 > 为什么这个在末尾插入节点的链表程序没有给出任何输出?

问题描述

这段代码没有给出任何输出。可以有不同的方式来实现链表。但我想在这个中找到我的错误。我在这段代码中找不到任何错误。这是我的完整代码

#include <iostream>
using namespace std;
 class node{
    public:
    int data;
    node* next;

    node(int val){
      data=val;
      next=NULL;
    }
 };

 void insertAtTail (node* &head, int val){
   node * n=new node(val);
   
   if(head==NULL){
     head=n;
   }
   node * temp= head;
   while(temp->next != NULL){
     temp=temp->next;
   }
   temp->next=n;

 }

void display(node* head){
  node * temp= head;
  while(temp!=NULL){
    cout<<temp->data<< "->";
    temp=temp->next;
  }
  cout<<"NULL"<<endl;
}

 int main(){
   node *head=NULL;
   insertAtTail(head,1);
   insertAtTail(head,2);
   insertAtTail(head,3);
   display(head);
   return 0;
 }

标签: c++c++17

解决方案


但我想在这个中找到我的错误。

一步一步地执行你的insertAtTail函数,你会发现你head和你的head->next指针指向同一个内存位置。分配初始指针后,您将为节点head分配相同的值。next

对代码的一个简单修复是在初始化头部后返回。

void insertAtTail(node*& head, const int val) {
  node* n = new node(val);
   
  if(head==nullptr){
    head=n;
    return;  // head is initialized, we don't need to do more here
  }
  node* temp= head;
  while(temp->next != nullptr){
    temp = temp->next;
  }
  temp->next = n;
}

实现此功能的另一种方法是

void insertAtTailRec(node*& head, const int val) {
  if(head == nullptr) {
    head = new node(val);
    return;
  }
  insertAtTailRec(head->next, val);
}

或者@WhozCraig 指出的解决方案。我建议你尝试不同的方法来实现这个功能。


推荐阅读