Связанный список с использованием классов и методов, OOP C ++ - PullRequest
0 голосов
/ 25 февраля 2020

это один из моих первых OOP проектов, и я не понимаю, что я делаю не так. Я должен сделать класс для связанного списка с функциями, написанными внутри. Я получаю эту ошибку при самом простом вызове конструктора, и я не знаю, почему: выброшено необработанное исключение: нарушение прав записи. это был nullptr.

#include "stdafx.h"
#include <iostream>
#include <conio.h>

class Nod {
    int info;
    Nod* next;

    public:
        Nod() {
            info = 0;
            next = NULL;
        }
        Nod(int inf, Nod *p)
        {
            info = inf;
            next = p;
        }
        ~Nod() {
            delete[] next;
            info = -1;
        }
        void setInfo(int x) {
            info = x;
        }
        int getInfo() {
            return info;
        }
        void setNext(Nod *p) {
            next = p;
        }
        Nod* getNext(Nod x) {
            return x.next;
        };
};

class Lista {
    Nod* start;
    Nod* end;
    int unsigned size;

    public:
        Lista(int x) {                                    //Constructor
            size = 1;
            start->setInfo(x);
            start->setNext(NULL);
            end->setNext(NULL);
        }

        Lista(int x, int y) {               //Constructor
            start = new Nod;
            start->setInfo(y);
            Nod* NodCurent;
            start->setNext(NodCurent);
            NodCurent->setInfo(y);
            for (unsigned int i = 2; i <= size; i++)
            {
                Nod* NodUrmator;
                NodUrmator = new Nod;
                NodCurent->setNext(NodUrmator);
                NodUrmator->setInfo(x);
                end->setNext(NodUrmator);
                end = NodUrmator;
                Nod NodCurent(x, NodUrmator);
            }
        }

        ~Lista() {                                  //Destructor
            Nod *p = start->getNext(*start);
            Nod *aux;
            while (p != NULL)
            {
                aux = p;
                p = p->getNext(*p);
                delete aux;
            }
            start = end = NULL;
            size = 0;
        }

        void insert(int x) {                    //insert x at the end of the list
            if (size != 0)
            {
                Nod* newEnd = new Nod(x, NULL);
                //newEnd->setNext(NULL);
                //end->setInfo(x);
                end->setNext(newEnd);
                end = newEnd;
                size++;
            }
            else
            {
                Nod* aux;
                aux->setInfo(x);
                size = 1;
                start = end = aux;
            }
        }

        void insertAt(int x, int i) {            //insert x on position i
            if (i >= size)
            {
                Nod *p = new Nod(x, NULL);
                end->setNext(p);
                end = p;
                size++;
            }
            else if (i <= 0)
            {
                Nod* aux = new Nod(x, start);
                start = aux;
                size++;
            }
            else                                              
            {
                Nod* aux = start->getNext(*start);
                //aux->setNext(*(start->getNext));
                if (i == 1)
                {
                    start->setInfo(x);
                    start->setNext(aux);
                }
                else
                {
                    for (int k = 1; k <= i; k++)
                    {
                        aux = aux->getNext(*aux);
                    }
                    Nod aux1(x,aux);
                    size++;
                }
            }
        }

        int get(int i)                               //Return element from position i;
        {
            Nod* aux = start;
            for (int k = 1; k < i; k++)
                aux = aux->getNext(*aux);
            return aux->getInfo();
        }

        int length() {                               //Return size of list;
            return size;                                                         
        }
        Lista reverse()                              //Returneaza lista scrisă invers;
        {
            //IDK;
        }
        void removeFirst()                           //deletes first element;
        {
            if (size == 0)
                return;
            Nod *p = start->getNext(*start);
            delete start;
            start->setNext(p->getNext(*p));
            size--;
        }

        void removeLast()                            //deletes last element;
        {
            if (size == 0)
                return;
            if (size == 1)
                removeFirst();
            Nod *p = start->getNext(*start);
            for (int i = 1; i < size; i++)
                p = p->getNext(*p);
            p->setNext(NULL);
            delete end;
            end = p;
            size--;
        }

        void remove(int i)                           //deletes element from position i;
        {
            if (i <= 0)
                removeFirst();
            if (i >= size)
                removeLast();
            Nod *p = start->getNext(*start);
            for (int k = 1; k < i; k++)
                p = p->getNext(*p);

            Nod *aux = p->getNext(*p);
            Nod *deSters = aux;
            aux = aux->getNext(*aux);
            delete deSters;
            p->setNext(aux);
            size--;
        }

        bool hasDuplicates()                         //Checks if list has duplicates;
        {
            if (size <= 1)
                return false;
            int v[200];
            Nod *p = start->getNext(*start);
            for (int i = 1; i <= size && p->getNext(*p) != NULL; i++)
            {
                v[i] = p->getInfo();
                p = p->getNext(*p);
            }
            for (int i = 1; i <= size - 1; i++)
                for (int j = 1; j <= size; j++)
                    if ((i != j) && (v[i] == v[j]))
                        return true;
            return false;
        }

        bool has(int x)                              //Checks if list has element x;
        {
            if (size == 0)
                return false;
            Nod *p = start->getNext(*p);
            for (int i = 1; i <= size && p->getNext(*p) != NULL; i++)
            {
                if (p->getInfo() == x)
                    return true;
                p->getNext(*p);
            }
            return false;
        }

        bool isEmpty()                               //Checks if list is empty;
        {
            if (size == 0)
                return true;
            return false;
        };
};

int main()
{
    Lista L(3);
    getchar();
    return 0;
}
...