Осуществлять Список, Соединенный внутри Соединенного Темплате Листа

У меня есть одна сдержись Списка Вдвойне Соединенная и Узла. Я хочу осуществить объект типа ListaLigada внутри структуры, начиная с которой я верю в Соединенный главный Список. Проблема, которая у меня есть, состоит в том, что я не заканчиваю понимать, как в том, чтобы соглашаться на внутренний список.

Мой Узел получает структуру, чтобы создавать узлы, которые идут внутри Соединенного Списка; так что я хочу согласиться на Соединенный Список, который будет внутри центрального блока. У меня нет даже идеи, из как делания этого, я очень потеряна.

Приложение я сдержись LL и заявления моей структуры.

Estructura

И после только я распределил память внутри моего void main (). Пожалуйста, я нуждаюсь в помощи.

Сдержись:


#pragma once

#ifndef LL
#define ll

template  struct Nodo {
public:
    T1 info;
    Nodo* prev;
    Nodo* next;
    Nodo(){ }
    Nodo(T1 data)
    {
        this->info = info;
    }
    ~Nodo() {}
};

template  class ListaLigada
{
public:
    T* head=NULL, *tail=NULL;
    ListaLigada();
    void AddNodo(T nodo);
};

template  void ListaLigada::AddNodo(T nodo)
{
    T* aux = NULL;
    aux = new T(nodo);
    aux->next = NULL;
    aux->prev = NULL;

    if (head == NULL)
    {
        head = aux;
        tail = aux;
    }

    else
    {
        tail->next = aux;
        aux->prev = tail;
        tail = aux;
    }

}
#endif

0
задан 10.11.2019, 03:43
1 ответ

У тебя есть серьезные проблемы diseГ±o, концепции и implementaciГіn в тебе cГіdigo.

  • include guard estГЎ плохо и не funcionarГЎ: ты подтверждаешь на LL, но определяешь ll.
    • AdemГЎs aГ±ades #pragma once, которые это include guard из составителя C ++ Microsoft, а следовательно он не estГЎndar ни портативно.
  • Твой узел - структура и первое, что ты делаешь, состоит в том, чтобы определять зону pГєblica вышеупомянутой структуры, это состоит избыточным: структуры - pГєblicas назначено по умолчанию.
  • у назначенного по умолчанию строителя нет тела, podrГ-туза использовать определенного составителем раньше используя default, то же самое для разрушителя.
  • Строитель с parГЎmetro получает аргумент типа аргумента шаблона, но ты это не используешь, взамен выравниваешь переменную Nodo::info, если сама.
  • Parametrizas твой список принимая, что аргумент шаблона serГЎ всегда узел, если ты instancian твой шаблон с типом, который не был бы твоим узлом, cГіdigo fallarГЎ из-за всех сторон.
    • Это снимает чувство списка данных, изящество состоит в том, чтобы мочь parametrizar с произвольными данными.
  • Структура Alumno хранит указатель в список, это склонное к ошибкам, использует инстанцию.

, Чтобы соглашаться на список внутри Alumno, достаточно использовать действующую точку (.):

Alumno a;
a.materias_alumno->AddNodo(/* lo que corresponda */);

, Но это serГ - в с cГіdigo, поскольку это у тебя есть сейчас, что не является ни правильным ни подходящим, мое предложение - следующее:

template <class T> class ListaLigada
{
    // El nodo debe ser privado e inaccesible desde fuera.
    // No es necesario que sea plantilla, porque usa los datos plantilla de la clase madre.
    struct Nodo {
        T dato;
        Nodo* prev = nullptr;
        Nodo* next = nullptr;
        Nodo() = default; // Deja que el compilador te haga el constructor.
        Nodo(T1 data) : dato{data}
        //              ^^^^^^^^^^ <--- Usa la lista de inicialización del constructor.
        {
        }
        ~Nodo() = default; // Deja que el compilador te haga el destructor.
    };
    // Los datos, deben ser internos e inaccesibles desde fuera.
    Nodo* head=NULL, *tail=NULL;
public:
    ListaLigada();
    void AddDato(T dato)
    {
        // Hacer cosas...
    }
};
2
ответ дан 01.12.2019, 12:10