Listy w C++, problem podczas wyswietlania(lub inicjalizacji)


(Dodebillo) #1

Mam o to taki kod. Kompilator nie wyrzuca błędu, jednak podczas uruchamiania programu zawiesza się gdy chcę wyświetlić drugi element. Gdzie robię błąd?

#include 

#include 

#include 


using namespace std;


struct wspolrzedne

{ 

    int x;

    int y;

    wspolrzedne *nastepny;

};


int main(int argc, char *argv[])

{

    wspolrzedne *pierwszy, *aktualny, *nowy;


    cout << "Program dzialajcy na listach" << endl;


    pierwszy = new wspolrzedne;

    pierwszy->x=0;

    pierwszy->y=0;

    aktualny->nastepny=pierwszy;


    for(int i=0;i<5;i++)

    {

        aktualny -> nastepny = new wspolrzedne;

        aktualny -> x = i;

        aktualny -> y = 2*i;

        aktualny = aktualny->nastepny;

    }

    aktualny->nastepny = NULL;


    cout << "Po wcisnieniu dowolnego przycisku nastapi wyswietlenie pierwszego elementu " << endl;

    getch();

    aktualny = pierwszy;


    cout << "x = " << aktualny->x << " y = " << aktualny->y << endl;


    cout << "Po wcisnieciu dowolnego przycisku nastapi wyswietelenie kolejnych elementow " << endl;

    getch();

    for(int i=0;i<5;i++)

      {

            cout << "x = " << aktualny->x << " y = " << aktualny->y << endl;  

            aktualny=aktualny->nastepny;

      }


    system("PAUSE");

    return EXIT_SUCCESS;

}

(Sawyer47) #2

Ta linijka jest podejrzana

aktualny->nastepny=pierwszy;

Odwołujesz się do pola aktualny, podczas gdy sam aktualny nie istnieje. Powinno być raczej aktualny = pierwszy;

Inne uwagi:

  1. conio.h - nieprzenośna, DOS-owa biblioteka

  2. system("pause") - nieprzenośne i raczej głupie obejście 'problemu' zamykającej się konsoli


(Copycona) #3

Spójrz na ostrzeżenia (warnings) kompilatora, one często są nie mniej ważne, niż błędy (errors).

http://ideone.com/7QZzv

Wskaźnik nowy jest nieużywany, a aktualny nie jest zainicjowany.


([alex]) #4
wspolrzedne *pierwszy=0,*ostati=0, *nowy;

   for(int i=0;i<5;++i)

     {

      nowy=new wspolrzedne;

      nowy->x=i;

      nowy->y=2*i;

      nowy->nastepny=0;

      if(ostatni) ostatni->nastepny=nowy;

      else pierwszy=nowy;

    }

   for(wspolrzedne *i=pierszy;i;i=i->nastepny)

     {

      cout << "x = " << i->x << " y = " << i->y << endl; 

     }