循环双向链表插入末尾

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 后,头节点的数据成员 prevnext 等于 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;
}

即调用函数后头节点的数据成员prevnext会指向头节点本身

一般来说,单独的函数 insert 没有意义,因为它可能只被调用一次(前提是它会被正确写入)。

此外,由于 while 语句

中的条件,如果列表仅包含头节点,函数 printnode 将不输出任何内容
    Node* newnode=headnode;
    while (newnode->next!=headnode){