Lista jednokierunkowa – przy wprowadzaniu n-tego rekordu wyrzuca błąd

0

Cześć,
mam problem z listą jednokierunkową.
Błędów kompilacji nie ma, program się uruchamia, ale przy wprowadzaniu n-tego rekordu wywala błąd (czasem przy trzecim czasem siedemnastym).
Generalnie nie udało mi się jeszcze wprowadzić więcej niż 20 rekordów.

Proszę o wskazówki gdzie jest błąd? Dopiero zaczynam przygodę z C++ i jeszcze nie zupełnie ogarniam alokowanie pamięci i wskaźniki (szczególnie na struktury)

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

struct Przedmioty{string Nazwa; struct Przedmioty *wskNastepnyElementListy;};
    struct Przedmioty *PierwszyElement;
    struct Przedmioty *Element;

int main()
{
    string tempNazwa;
    struct Przedmioty *tempAdres;

    do
     {
        Element = (struct Przedmioty*) malloc(sizeof(struct Przedmioty));
            if (PierwszyElement == NULL) PierwszyElement = Element;

            cout << "Wprowadz nazwe nowego elementu: ";
            getline (cin,tempNazwa);
                if(tempNazwa == "koniec") return 0;
                (*Element).Nazwa = tempNazwa;
                (*Element).wskNastepnyElementListy = 0;

            if (Element != PierwszyElement)
             {
               tempAdres = PierwszyElement;
               while((*tempAdres).wskNastepnyElementListy != Element)
                if ((*tempAdres).wskNastepnyElementListy != 0)
                 {
                  tempAdres = (*tempAdres).wskNastepnyElementListy;
                 }
                else
                 {
                  (*tempAdres).wskNastepnyElementListy = Element;
                 };
             };
    }
    while(1);

    return 0;
}

0
s.wojcik napisał(a):

Cześć,
mam problem z listą jednokierunkową.
Błędów kompilacji nie ma, program się uruchamia, ale przy wprowadzaniu n-tego rekordu wywala błąd (czasem przy trzecim czasem siedemnastym).
Generalnie nie udało mi się jeszcze wprowadzić więcej niż 20 rekordów.

Proszę o wskazówki gdzie jest błąd? Dopiero zaczynam przygodę z C++ i jeszcze nie zupełnie ogarniam alokowanie pamięci i wskaźniki (szczególnie na struktury)

Korzystaj z new i delete

2

Formatuj kod!
Otagowałeś wątek jako "C++", a gdybyś zamiast std::cout i std::getline użył printf i scanf to miałbyś kod w C (ciągle niedziałający). Mimo tego, że C++ jest w dużej mierze kompatybilny z C, bardzo często idiomatyczne rozwiązania z C są błędami w C++, chociażby używanie gołego malloc jest sygnałem, że z kodem jest coś nie tak i prawdopodobnie problem można byłoby rozwiązać krócej, czytelniej i mniej błędogennie.

Polecam:

  • usunąć to co masz napisane
  • otworzyć jakiś w miarę świeży poradnik z podstawami i przyswoić jeszcze raz podstawy.
  • Potem usiądź nad kartką papieru i pomyśl jakie operacje chciałbyś móc wykonać na swojej liście (np. dodawanie elementu) i zastanów się jak je zaimplementować.
  • Gdy będziesz miał już wstępny plan co chcesz zrobić, odpal edytor i odpowiednio formatując kod (w każdym IDE jest dostępny plugin od automatycznego formatowania), spróbuj zaimplementować to co wymyśliłeś, mając na uwadze, że każda funkcja powinna robić tylko jedną rzecz, np. insert powinien tylko dodawać kolejny element do listy, nie powinien nic printować, czy wczytywać danych od użytkownika itd.

Moim zdaniem (mogę się mylić) najbardziej koszernie i zgodnie z feng shui byłoby napisanie klasy List z metodami odpowiadającymi wybranym przez Ciebie operacjom:

class List {
private:
    struct Node {
        int value;
        Node* next; 
    };

    Node* head;

public:
// tutaj operację jakie chcesz wykonywać na liście
    void addValue(int value);

};

~~
edit: Jeśli natkniesz się, w internecie, na Pana Zelenta, nie daj się zwieść jego uroczemu obliczu. Będzie obiecywał Ci złote góry jeśli tylko zdecydujesz się dołączyć do wyznawców Wielkiego Kopiego-Pasta, ale pamiętaj! Droga ta mimo, że na pozór prosta i usłana kwieciem pachnącym prowadzi ku otchłaniom spaghetti kodu i bezrobocia! Niewielu udało się wyrwać ze szponów Pana Ciemności, a tym którym się powiodło lata zajął powrót do społeczeństwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1