[C++] lista jednokierunkowa

D-Mic
Użytkownik
Użytkownik
Posty: 99
Rejestracja: 2 paź 2010, o 11:04
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 4 razy

[C++] lista jednokierunkowa

Post autor: D-Mic »

Witam, mam zamiar napisać program który wrzuca do listy graczy podanych przez użytkownika. Nie wiem czemu ale na samym poczatku mam problem, z którym nie moge sobie poradzic. Według mnie to jest napisane dobrze, ale może ktoś podsunie jakąs mysl. Program kompiluje się, dodaje graczy, ale gdy już jest koniec dodawania i ma wypisać, to niby wypisuje, ale zaraz pojawia sie komunikat o błędzie, za każda wskazówke będę wdzięczny.

Pozdrawiam

Kod: Zaznacz cały

#include<cstdio>
#include<string>
#include<cstdlib>
#include <iostream>
#include<fstream>
#include<sstream>


using namespace std;

class gracz{
public:
	string name;
	int wz;
	string team;
	
	gracz(){
		cout<<"Podaj nazwisko gracza"<<endl;
		cin>>name;
		cout<<"Podaj wzrost gracza"<<endl;
		cin>>wz;
		cout<<"Podaj druzyne gracza"<<endl;
		cin>>team;
	};

	void wypisz(){
		cout<<"Gracz: "<<name<<" o wzroscie: "<<wz<<" z druzyny: "<<team<<endl;

	}
	gracz *nast;
	~gracz(){};
};

int main(){
	gracz *glowa=NULL,*wsk=NULL;
	int a=1;
	//gracz *b;
		
	while(a==1){
		cout<<"Co robimy?"<<endl;
		cin>>a;
		if(a==1){
		if(glowa==NULL){
			glowa=wsk=new gracz();
		}
		else{
			wsk->nast=new gracz();
			wsk=wsk->nast;
		}
		}
		else
			break;
		
	}

	wsk=glowa;
	while(wsk!=NULL){
		wsk->wypisz();
		wsk=wsk->nast;
	}
	
	delete glowa,*wsk;
	getchar(); 
	return 0;
}
void_t
Użytkownik
Użytkownik
Posty: 103
Rejestracja: 14 maja 2011, o 18:25
Płeć: Mężczyzna
Pomógł: 26 razy

[C++] lista jednokierunkowa

Post autor: void_t »

Błąd jest tutaj, w okolicy 57 linii, a ujawnia się w:

Kod: Zaznacz cały

while(wsk!=NULL){
Pętla wykonuje się dopóki wsk nie będzie NULL. Ale Twoje przejście do następnego elementu listy:

Kod: Zaznacz cały

wsk=wsk->nast;
nie przewiduje ustawienia wskaźnika do nastepnego elemenu na NULL, stąd pętla będzie wykonywać się przez jakiś czas, dopoki nie trafi na coś co faktycznie jest NULLem.

Powinieneś zrobić to tak:

Kod: Zaznacz cały

wsk=wsk->nast;
wsk->nast = NULL;

Kod: Zaznacz cały

delete glowa,*wsk;
Spójrz raz jeszcze jak alokowałeś pamięć. Poza tym o ile mi wiadomo taka konstrukcja nie zrobi nic poza dealokacją 'glowa'. Swoją drogą '*wsk' nie wskazuje na przestrzeń, tylko na wskaźnik do wskaźnika na przestrzeń.

delete nie działa w ten sposób - nie zdealokujesz całej pamięci w liście. Musisz po tym przejechać pętlą. (coś aka Twoje wypisywanie)

Do śledzenia błędów tego typu polecam valgrinda (nie wiem czy jest port na windowsa?).
D-Mic
Użytkownik
Użytkownik
Posty: 99
Rejestracja: 2 paź 2010, o 11:04
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 4 razy

[C++] lista jednokierunkowa

Post autor: D-Mic »

poradziłem sobie z tym, dziękuje.

A teraz jeszcze jedno pytanie. Czy jeżeli dodam nastepująca pętlę:

Kod: Zaznacz cały

  FILE *plik;
	  if ((plik=fopen("plik.txt","r"))==NULL)
		cout<<"Plik nie istnieje!"<<endl;
	  else{
		  
		while (!feof( plik )) {
			fscanf(plik,"%s %d %s",e,&d,c);
			if(glowa==NULL){
			glowa=wsk=new gracz(e,d,c);
			}
			else{
			wsk->nast=new gracz(e,d,c);
			wsk=wsk->nast;
			}
		}
	  }
	  cout<<"OK!"<<endl;
	  fclose(plik);
	  }
to czy dane z pliku będą czytane poprawnie? Według mnie powinny być, według kompilatora niekoniecznie:). Stworzyłem drugi konstruktor który wykorzystuje 3 argumenty pobrane z pliku, ale własnie znowu mam problem jak wcześniej, czyli wyszukiwanie problemu przez Windows, zapewne znowu gdzies zabrakło jakiegoś nullowania wskaźnika...
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] lista jednokierunkowa

Post autor: Afish »

Co oznacza stwierdzenie "według kompilatora niekoniecznie"? Jaki błąd kompilacji dostajesz? I dlaczego wczytujesz dane z pliku przy użyciu wskaźników, a na konsolę wyrzucasz przez cin? Lepiej stosuj jednolite rozwiązania, czyli albo printfy i scanfy do konsoli i plików, albo strumienie do wszystkiego.
D-Mic
Użytkownik
Użytkownik
Posty: 99
Rejestracja: 2 paź 2010, o 11:04
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 4 razy

[C++] lista jednokierunkowa

Post autor: D-Mic »

dostawałem ten sam error co wcześniej, czyli po prostu program zawieszal się podczas swojego działania, mimo że kompilował się poprawnie, ale już udało mi się naprawić. A co do strumieni/printfów, wiem wiem musze się nauczyć "dobrego stylu programowania" no ale wszystko powolutku

Pozdrawiam
ODPOWIEDZ