c++ - 为什么这个在末尾插入节点的链表程序没有给出任何输出?
问题描述
这段代码没有给出任何输出。可以有不同的方式来实现链表。但我想在这个中找到我的错误。我在这段代码中找不到任何错误。这是我的完整代码
#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;
}
解决方案
但我想在这个中找到我的错误。
一步一步地执行你的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 指出的解决方案。我建议你尝试不同的方法来实现这个功能。
推荐阅读
- javascript - 使用 RXJS,有没有办法产生一个当源 Observables 当前发出的项目数相同时发出的 observable?
- javascript - webpack:如何在 package.json 替代 main 属性(unpkg、main:src、source、jsnext:main、main:umd、jsdelivr)之间切换?
- feign - 如何捕捉 Feign OkhhtpClient SocketTimeOut 异常?
- python - 在 matplotlib 中增加 gif 分辨率
- javascript - 如何将一个对象拼接成一个对象数组?
- python - 按组根据其他列更改列值
- javascript - NodeJS - HTML文本内容的每个单词的边界矩形/坐标/偏移(以像素为单位)
- c++ - 类引用成员 - 不是具有合成构造函数的类中的错误,而是用户定义的构造函数中的错误
- javascript - 使用键过滤对象数组
- python - tf.contrib.rnn.LayerNormBasicLSTMCell 的贬低