创建一个函数,在末尾向自身添加一个双向链表

create a function to add a doubly linked list to itself at the end

#include <iostream>
#include <string>
using namespace std;
class Node{
public:
double data;
Node* next;
Node* prev;
};
void insert(Node**,int);
void display(Node*);
void finaloutput(Node*,Node**);
int main()
{
    Node* head=NULL;
    Node** second=NULL;
    insert(&head,1);
    insert(&head,2);
    insert(&head,3);
    insert(&head,4);
    insert(&head,5);
    cout<<"List is"<<endl;
    display(head);
    cout<<endl;
    cout<<"Final output is"<<endl;
    second=&head;
//  Node* second=(*&head);
finaloutput(head,second);
display(head);
}
void insert(Node** headref,int new_data)
{
Node* new_node=new Node();
new_node->data=new_data;
new_node->next=(*headref);
new_node->prev=NULL;
if(*headref!=NULL)
{
(*headref)->prev=new_node;
}
(*headref)=new_node;
}
void display(Node* headref)
{
Node* temp=headref;
while (temp!=NULL)
{
    cout<<temp->data<<" ";
    temp=temp->next;
}

}
void finaloutput(Node* headref,Node** second)
{  
Node ptrbegin;
Node* temp=(headref);
while(temp->next!=NULL)
{
    temp=temp->next;
}

temp->next=(*second);
}

我想创建一个函数,在末尾向自身添加一个 link 列表,但在 temp->next=(*second) 之后,这最终会显示一个无限循环。我试图只获取 Node* head 的价值副本作为 second 但它没有帮助。请给我提供 C++ 中的示例代码。

我想要的输出就像 '5 4 3 2 1 5 4 3 2 1'

如果分配是

create a function to add a doubly linked list to itself at the end

那么你所期望的输出

5 4 3 2 1 4 5 4 3 2 1

不正确,因为在将列表加倍之前它具有以下值

5 4 3 2 1

所以双列表的输出将是

5 4 3 2 1 5 4 3 2 1

您需要将新节点添加到包含当前存储数据副本的列表中。

您的 class Node 的数据成员 data 使用类型说明符 double

声明
class Node{
public:
double data;
Node* next;
Node* prev;
};

但是函数 insert 处理 int

类型的数据
void insert(Node**,int);

因此您需要更改数据成员的类型或参数的类型。用class键class代替class键struct没有太大意义。此外,由于该程序是 C++ 程序,因此您应该在 C++ 中通过引用将指针传递给头节点,而不是通过指向指针的指针传递 C 的意思。

这是一个演示程序,展示了如何编写我在程序中重命名为 double_list 的函数 finaloutput

#include <iostream>

struct Node
{
    int data;
    Node *next;
    Node *prev;
};

void insert( Node * &head, int data )
{
    head = new Node { data, head, nullptr };
    if ( head->next ) head->next->prev = head;
}

std::ostream & display( const Node * head, std::ostream &os = std::cout )
{
    for ( const Node *current = head; current != nullptr; current = current->next )
    {
        os << current->data << " -> ";
    }
    
    return os << "null";
}

void double_list( Node * &head )
{
    if ( head )
    {
        Node *second_head = nullptr;
        
        Node **first = &head;

        for ( Node **second = &second_head, *prev = nullptr; 
              *first;
              first = &( *first )->next, prev = *second, second = &( *second )->next ) 
        {
            *second = new Node { ( *first )->data, nullptr, prev };
        }
        
        *first = second_head;
    }
}

int main() 
{
    Node *head = nullptr;
    
    insert( head, 1 );
    insert( head, 2 );
    insert( head, 3 );
    insert( head, 4 );
    insert( head, 5 );

    display( head ) << '\n';
    
    double_list( head );
    
    display( head ) << '\n';

    return 0;
}

程序输出为

5 -> 4 -> 3 -> 2 -> 1 -> null
5 -> 4 -> 3 -> 2 -> 1 -> 5 -> 4 -> 3 -> 2 -> 1 -> null