Реализация списков с++

#include <iostream>

using namespace std;

struct Node {
    int value;
    Node* next;
};


 class List{

 public:  
    Node* head;
    List() {
        head = NULL;
    }

    Node* add(int x,int ind) {
        Node* p = new Node;
        Node* q = new Node;
        p->value = x;
        p->next = NULL;
        if (head == nullptr) {
            head = p;
        }
        else {
            q = head;
            q->next = head;
            for (int i = 0; i <= ind; i++) {
                if (i == ind||q->next) {
                    p->next = q->next;
                    q->next = p;
                }
                q = q->next;
            }
        }
        return p;
    }
    Node* del(int ind) {
        Node* q = new Node;
        for (int i = 0; i <= ind; i++) {
            if (i == ind) {
                q->next = q->next->next;
            }
            if (i == ind + 1) q->next = nullptr;
            q = q->next;
        }
        return 0;
    }
    Node* top() {
        cout << head->value;
        return head;
    }
    void show() {
        Node* h = head;
        while (h!=NULL) {
            cout << h->value;
            h = h->next;
        }
        cout << h->value;
    }
};

int main()
{
    List list;
    list.add(2,0);
    list.add(3,1);
    list.add(4,2);
    list.show();
    return 0;
}

Пытаюсь сделать односвязные списки на с++. Добавление идет после заданного элемента,удаление тоже. Не особо шарю за это.У меня в выводе элементов проблемы(ф-ия show). Не знаю как сделать правильное условие. У меня цикл выполняется бесконечно.


Ответы (2 шт):

Автор решения: AR Hovsepyan

По моему вам придется все заново написать, но с пониманием того, что делаете. Чтобы не заморачиваться, можете пользоваться более современным решением:

class List {
    struct Node {
        int value;
        std::unique_ptr<Node> next;
    };
    std::unique_ptr<Node> head;
public:    
    void add(int x) {
        head = std::make_unique<Node>(Node{ x, std::move(head) });
    }
    
    Node* top() {
        return head.get();
    }
    void show() {
        for (Node* p = top(); p; p = p->next.get())
            std::cout << p->value << ' ';
    }
    ~List()
    {
        while (head)
            head = std::move(head->next);
    }
};
int main()
{   
    List list;
    list.add(2);
    list.add(3);
    list.add(4);
    list.show();
    return 0;
}
→ Ссылка
Автор решения: ТарасПрогер
#include <iostream>

using namespace std;

struct Node {
    int value;
    Node* next;
};


class List {

public:
    Node* head;
    List()
    {
        head = NULL;
    }

    void pop_front()
    {
        Node* temp = head;
        head = head->next;
        delete temp;
    }
    void push_front(int data)
    {
        head = new Node{data, head};
    }
    void del(int index)
    {
        if (index == 0)
        {
            pop_front();
        }
        else
        {
            Node* previous = this->head;
            for (int i = 0; i < index - 1; i++)
            {
                previous = previous->next;
            }


            Node* toDelete = previous->next;

            previous->next = toDelete->next;

            delete toDelete;
        }

    }
    void insert(int data, int index)
    {
        if (index == 0)
        {
            push_front(data);
        }
        else
        {
            Node* previous = this->head;

            for (int i = 0; i < index - 1; i++)
            {
                previous = previous->next;
            }

            Node* newNode = new Node{ data, previous->next };

            previous->next = newNode;
        }
    }

    void push_back(int data)
    {
        if (head == nullptr)
        {
            head = new Node{ data, nullptr };
        }
        else
        {
            Node* current = this->head;

            while (current->next != nullptr)
            {
                current = current->next;
            }
            current->next = new Node{data,nullptr};

        }
    }

    void show() 
    {
        Node* h = head;
        while (h != NULL) 
        {
            cout << h->value << endl;
            h = h->next;
        }
      //  cout << h->value;
    }
};


int main()
{
    List list;
//    list.add(208, 0);
    list.push_back(32);
    list.push_back(-2);
    list.push_front(3);
    list.insert(292, 1);
    list.show();
    return 0;
}

Тут уже лучше переделать на вот так

→ Ссылка