循环双向链表插入末尾
circular doubly linked list insertion at the end
我正在遍历 dsa 双循环列表,并正在练习向其中插入元素,在输入第一个元素后我的程序突然结束.....我的 insertafterfunction.i 得到一个错误吗segmentation fault error .just help me through 我找不到哪里出了问题..
#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();
}
}
例如函数 insertafter
中的这个 while 循环
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
没有意义,因为它可能只被调用一次(前提是它会被正确写入)。
此外,由于 while 语句
中的条件,如果列表仅包含头节点,函数 printnode
将不输出任何内容
Node* newnode=headnode;
while (newnode->next!=headnode){
我正在遍历 dsa 双循环列表,并正在练习向其中插入元素,在输入第一个元素后我的程序突然结束.....我的 insertafterfunction.i 得到一个错误吗segmentation fault error .just help me through 我找不到哪里出了问题..
#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();
}
}
例如函数 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
没有意义,因为它可能只被调用一次(前提是它会被正确写入)。
此外,由于 while 语句
中的条件,如果列表仅包含头节点,函数printnode
将不输出任何内容
Node* newnode=headnode;
while (newnode->next!=headnode){