首页 > 解决方案 > 在末尾插入循环双向链表

问题描述

我正在通过 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();
    }
}

标签: c++data-structuresdoubly-linked-listcircular-list

解决方案


例如函数内的这个while循环insertafter

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没有意义,因为它可能只被调用一次(前提是它会被正确编写)。

printnode此外,如果由于 while 语句中的条件,列表仅包含头节点,则该函数将不输出任何内容

    Node* newnode=headnode;
    while (newnode->next!=headnode){

推荐阅读