Создайте функцию для добавления двусвязного списка к себе в конце

#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»

Вам нужно добавить некоторое условие в вашу функцию display, чтобы остановить, потому что, если вы свяжете последний узел с первым, это циклический список, и while (temp!=NULL) в display всегда будет возвращать true, следовательно, бесконечный цикл. Кроме того, я не понимаю желаемого результата, откуда берется дополнительная «4» посередине?

Suthiro 13.12.2020 11:37

@Arsam Javed Почему в этом ожидаемом выводе три числа 4 5 4 3 2 1 4 5 4 3 2 1?

Vlad from Moscow 13.12.2020 11:59

извините, моя ошибка теперь исправлена

Arsam Javed 13.12.2020 12:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме