微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最后插入循环双向链表

如何解决最后插入循环双向链表

我正在通过 dsa 双重循环列表,并正在练习向其中插入元素,在输入第一个元素后,我的程序突然结束......只是帮我解决我找不到哪里出了问题..

#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){

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。