Funkcja dodająca elementy do listy obiektów

0

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 ?

[code]#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;
}[/code]

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

Napisz to jak człowiek to może zauważysz błąd.

2

Klasa Dziekanat nie ma konstruktora zdefiniowanego przez użytkownika, element head nie zostaje zainicjalizowany. W następującej linii odczytujesz wartość niezaincjalizowanej zmiennej:

        if(head) {

Przy okazji, bardzo dziwnie to wygląda, mieszanina listy w klasycznym stylu C z C++.

edit:
Przy okazji#2, wyciek pamięci:

void dziekanat::DodajStudenta(){ 
 
    student *x = new student;
    cout<<"podaj imie"<<endl;
    cin>>x->imie;
    cout<<"nazwisko"<<endl;
    cin>>x->nazwisko;
    push(head,*x);
 
}
1
  1. Jak chcesz dodawać na koniec to:
class dziekanat
  {
   public:
   lista *head,*tail;
   void DodajStudenta(); 
  };

i masz dodawanie w czasie O(1) zamiast O(N)
2.

void push(lista *&head,student x){
    lista *nowy= new lista;
    lista *tmp= new lista;  // tu masz kolejny wyciek pamięci
void dziekanat::DodajStudenta()
  {
   lista *tmp=new lista;
   cout<<"podaj imie"<<endl;
   cin>>tmp->key->imie;
   cout<<"nazwisko"<<endl;
   cin>>tmp->key->nazwisko;
   tmp->next=0;
   tmp->prev=tail;
   tail=(tail?tail->next:head)=tmp;
  }

A gdyby jeszcze porządny konstruktor zrobiłeś dla lista, to jeszcze mniej kodu.

0

Wielkie dzięki właśnie chodziło o brak konstruktora :) wystarczyło dodać

 pomogło wstawienie konstruktora : 

dziekanat::dziekanat(){
    head = NULL;
}

od niedawna się przerzuciłem z c na c++ dlatego jeszcze używam struktur z C, a akurat funkcje lista miałem już kiedyś napisaną więc po prostu z niej skorzystałem.
Dziękuje za cenne porady. Pozdrawiam

PS. a takie pytanie czy takie łączenie klas i struktury listy z C niesie ze sobą jakieś negatywne skutki ?

1

To tak przy okazji, jeśli lista nie jest elementem zadania, popatrz na klasy std::vector i std::list

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