创建一个函数,在末尾向自身添加一个双向链表
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
#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