c++ - 在末尾插入循环双向链表
问题描述
我正在通过 dsa 双循环列表,并且正在练习向其中插入元素,在输入第一个元素后,我的程序突然结束......我的 insertafter 函数是否有错误。我得到一个分段错误错误。帮帮我通过我找不到出了什么问题..
#include<iostream>
struct Node{
int data;
Node* next;
Node* prev;
};
Node* headnode;
void insert(int data){
Node* newnode = new Node;
newnode->data= data;
newnode->next=headnode;
newnode->prev=headnode;
headnode=newnode;
}
void insertafter(int data){
Node* newnode=new Node;
newnode->data=data;
newnode->next=headnode;
Node* existingnode = headnode;
while(existingnode->next!=headnode){
existingnode=existingnode->next;
}
existingnode->next=newnode;
newnode->prev= existingnode;
headnode->prev=newnode;
}
void printnode(){
Node* newnode=headnode;
while (newnode->next!=headnode){
std::cout<<newnode->data<<"->";
newnode=newnode->next;
}
std::cout<<"\n";
}
int main(){
headnode=NULL;
int x,data;
std::cin>>x;
for(int i=0;i<x;i++)
{
std::cin>>data;
if(i==0)
{
insert(data);
}
else
{
insertafter(data);
}
printnode();
}
}
解决方案
例如函数内的这个while循环insertafter
while(existingnode->next!=headnode){
existingnode=existingnode->next;
}
调用未定义的行为,因为在调用函数后,头节点的insert
数据成员prev
和next
等于nullptr
.
见函数插入
void insert(int data){
Node* newnode = new Node;
newnode->data= data;
newnode->next=headnode; // here headnode is equal to nullptr
newnode->prev=headnode; // And here headnode is equal to nullptr
headnode=newnode;
}
看来您的意思至少是以下函数定义
void insert(int data){
Node* newnode = new Node;
newnode->data= data;
headnode=newnode;
newnode->next=headnode;
newnode->prev=headnode;
}
也就是调用函数后,头节点的数据成员prev
和next
头节点会指向头节点本身。
一般来说,单独的函数insert
没有意义,因为它可能只被调用一次(前提是它会被正确编写)。
printnode
此外,如果由于 while 语句中的条件,列表仅包含头节点,则该函数将不输出任何内容
Node* newnode=headnode;
while (newnode->next!=headnode){
推荐阅读
- jmeter - 如何将不同数量的线程设置为不同的线程组?
- c# - 模拟将方法调用返回到另一个对象的方法
- asp.net - 使用请求流和一些数据时,使用 HttpWebRequest 调用 API 会返回 404 错误,如何解决?
- android - 有没有办法在 Android 和 iOS 上生成一个链接,如果已安装,则在 Firefox 中打开,如果没有,则指向 AppStore/GooglePlay 安装 FF
- c++ - 处理二维动态分配的数组
- ravendb - RavenDB 从 3.5 迁移到 5.0.3 引发重复键错误
- javascript - 用多个键和值填充对象数组
- django - Django Cache 我可以部分清除特定对象视图的缓存吗?
- excel - 排除隐藏在 For Each 函数中的某些工作表
- java - Java/OpenJDK,如何动态加载库