【问题标题】:circular doubly linked list insertion at the end [closed]在末尾插入循环双向链表[关闭]
【发布时间】:2021-05-07 19:30:54
【问题描述】:

我正在通过 dsa 双循环列表,并且正在练习向其中插入元素,在输入第一个元素后,我的程序突然结束......我的 insertafterfunction 中是否有错误。我得到一个分段错误错误。只是帮我解决我找不到问题所在..

#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-structures doubly-linked-list circular-list


    【解决方案1】:

    例如函数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){
    

    【讨论】:

    • 所以我应该添加 headnode->next=newnode;头节点->上一个=空;那是ryt兄弟吗??
    • @shyam0x 查看我更新的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2018-10-01
    • 2013-11-15
    • 1970-01-01
    • 2012-09-29
    • 2015-06-16
    相关资源
    最近更新 更多