Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Problem z dodaniem obiektu do listy dwukierunkowej

Ostatnio zmodyfikowano 2014-01-02 14:28
Autor Wiadomość
ice25
Temat założony przez niniejszego użytkownika
[c++] Problem z dodaniem obiektu do listy dwukierunkowej
» 2014-01-01 21:05:49
Witam
Może mi ktoś powiedzieć co tu zrobiłem źle że program się kompiluje ale po wprowadzeniu danych, gdy ma już dodać element do listy się zawiesza ?

C/C++
#include <string>
#include <iostream>


using namespace std;


class student {
public:
    string imie;
    string nazwisko;
   
};



typedef struct list {
    struct list * next, * prev;
    student key;
} lista;

void push( lista *& head, student x ) {
    lista * nowy = new lista;
    lista * tmp = new lista;
    nowy->key = x;
    nowy->next = NULL;
    if( head ) {
        tmp = head;
        while( tmp->next ) tmp = tmp->next;
       
        tmp->next = nowy;
        nowy->prev = head;
    }
    else {
        head = nowy;
        tmp->prev = NULL;
    }
   
}

class dziekanat {
public:
    lista * head;
    void DodajStudenta();
   
   
};

void dziekanat::DodajStudenta() {
   
    student * x = new student;
    cout << "podaj imie" << endl;
    cin >> x->imie;
    cout << "nazwisko" << endl;
    cin >> x->nazwisko;
    push( head, * x );
   
}


void show( lista * head ) {
    while( head ) {
        cout << head->key.imie << endl;
        head = head->next;
    }
   
   
}

int main() {
   
   
    dziekanat lol;
    lol.DodajStudenta();
   
   
   
    getchar();
    getchar();
    return 0;
}
P-100890
m4snow
wskaźnik(i) w kosmos
» 2014-01-02 00:31:50
Hej.
Wywala sie bowiem w funkcji push jest taka linijka:

        while( tmp->next ) tmp = tmp->next;
w momencie uruchomienia domyślnie tmp->next wskazuje na kosmos tak samo jak tmp->prev bo nie zainicjowałeś wskaźników w żaden sposób. I w efekcie próbujesz czytać coś do czego nie wolno ci się dobrać.

najłatwiej to obejść stosując domyślny "konstruktor" struktury zerujący wskaźniki przy inicjalizacji nowej listy


list(){next=0;prev=0;};

ale za cholewę nie wiem czy jest to zgodne ze sztuką.. Ale działa, nie sprawdzałem na ile poprawnie dalej.
P-100907
ice25
Temat założony przez niniejszego użytkownika
» 2014-01-02 14:28:34
Wielkie dzięki właśnie chodziło o brak konstruktora :) wystarczyło dodać
 pomogło wstawienie konstruktora :

dziekanat::dziekanat(){
    head = NULL;
}
P-100938
« 1 »
  Strona 1 z 1