#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);
}
Я хочу создать функцию для добавления списка ссылок к себе в конце, но в этом случае после temp->next=(*second)
это в конечном итоге показывает бесконечный цикл. Я пытался получить только значение копии Node* head
как second
, но это не помогло. Пожалуйста, дайте мне пример кода на С++.
результат, который я хочу, похож на «5 4 3 2 1 5 4 3 2 1»
@Arsam Javed Почему в этом ожидаемом выводе три числа 4 5 4 3 2 1 4 5 4 3 2 1?
извините, моя ошибка теперь исправлена
Если задание
создайте функцию для добавления двусвязного списка к себе в конце
то ожидаемый вами вывод
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
Вам необходимо добавить в список новые узлы с копиями хранящихся в данный момент данных.
Элемент данных data
вашего класса Node
объявлен со спецификатором типа double
class Node{
public:
double data;
Node* next;
Node* prev;
};
Однако функция insert
имеет дело с данными типа int
void insert(Node**,int);
Поэтому вам нужно изменить либо тип члена данных, либо тип параметра. Нет большого смысла использовать ключ класса class
вместо ключа класса struct
. Кроме того, поскольку программа является программой C++, вы должны передать указатель на головной узел по ссылке в значении C++ вместо значения C через указатель на указатель.
Вот демонстрационная программа, которая показывает, как может быть написана функция finaloutput
, которую я переименовал в программе в double_list
.
#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
Вам нужно добавить некоторое условие в вашу функцию
display
, чтобы остановить, потому что, если вы свяжете последний узел с первым, это циклический список, иwhile (temp!=NULL)
вdisplay
всегда будет возвращатьtrue
, следовательно, бесконечный цикл. Кроме того, я не понимаю желаемого результата, откуда берется дополнительная «4» посередине?