Niepoprawne wyświetlanie zawartości listy

0

Mam taki kod:
main.cpp

#include <iostream>
#include "lista.h"
using std::cout;
using std::endl;

int main()
{
	LISTA l1;
	std::string tab1[]={"A","b","c","d","e"};
	int tab2[]={1000,2000,3400,40000,1000000};
//	std::cout<<"dodawanie\n";
	for(int i = 0; i < 5; i++)
	{
	//    std::cout<<i<<std::endl;
		ELEMENT *nowy = new ELEMENT;
		nowy->nazwisko=tab1[i];
		nowy->zarobki=tab2[i];
		nowy->nastepny = NULL;
		l1.dorzuc(nowy);
	}
	//std::cout<<"wypisz\n";
	l1.wypisz('a');
	//std::cout<<"wypisz2\n";
	l1.wypisz('b');
	ELEMENT *nowy = new ELEMENT;
	nowy->zarobki=1000;
	l1.usun(nowy,ident_zarob);
	delete nowy;
	//std::cout<<"po usunieciu\n";
	l1.wypisz('a');
	//std::cout<<"znouw\n";
	l1.wypisz('b');
}

lista.h

#ifndef LISTA_H
#define LISTA_H

#include <iostream>

const int N = 2;
typedef struct rob
{
	std::string nazwisko;
	int zarobki;
	rob *nastepny;
}ELEMENT;

typedef struct rob_ptr
{
	ELEMENT *adres;
	rob_ptr *nastepny;
}LPTR;

int alf(ELEMENT *a, ELEMENT *b);
int zarob(ELEMENT *a, ELEMENT *b);
int ident_nazw(ELEMENT *a, ELEMENT *b);
int ident_zarob(ELEMENT *a, ELEMENT *b);

class LISTA
{
	public:
	LISTA();
	~LISTA();
	void dorzuc(ELEMENT*);
	int usun(ELEMENT*,int (*)(ELEMENT*,ELEMENT*));
	void wypisz(char);
	private:

	typedef struct n
	{
		ELEMENT *glowa;
		ELEMENT *ogon;
	}INFO;

	typedef struct l
	{
	    LPTR *glowa;
	    LPTR *ogon;
	}LPTR_INFO;

	LPTR_INFO inf[N];
	INFO inf_dane;

	int usun_element(ELEMENT*);
	ELEMENT* usun_wsk(LPTR_INFO*, ELEMENT*,int (*)(ELEMENT*,ELEMENT*));
	LPTR_INFO* odszukaj_wsk(LPTR_INFO*,ELEMENT*,int (*)(ELEMENT*,ELEMENT*));
	void write(LPTR_INFO*);
	void dodaj(int,ELEMENT*,int (*)(ELEMENT*,ELEMENT*));
};
#endif

lista.cpp

#include "lista.h"

int alf(ELEMENT *a, ELEMENT *b)
{
	return (a->nazwisko >= b->nazwisko);
}
int zarob(ELEMENT *a, ELEMENT *b)
{
	return (a->zarobki >= b->zarobki);
}
int ident_nazw(ELEMENT *a, ELEMENT *b)
{
	return (a->nazwisko == b->nazwisko);
}
int ident_zarob(ELEMENT *a, ELEMENT *b)
{
	return (a->zarobki == b->zarobki);
}

LISTA::LISTA()
{
	for(int i = 0; i < N; i++)
	inf[i].glowa=inf[i].ogon=NULL;
	inf_dane.glowa=inf_dane.ogon=NULL;
}

LISTA::~LISTA()
{
	while(inf_dane.glowa != NULL)
	{
		ELEMENT *q = inf_dane.glowa->nastepny;
		delete inf_dane.glowa;
		inf_dane.glowa=q;
	}

	for(int i = 0; i < N; i++)
	while(inf[i].glowa != NULL)
	{
		LPTR *q = inf[i].glowa->nastepny;
		delete inf[i].glowa;
		inf[i].glowa=q;
	}
}

LISTA::LPTR_INFO* LISTA::odszukaj_wsk(LPTR_INFO *inf, ELEMENT *q, int (*decyzja)(ELEMENT*a,ELEMENT*b))
{
	LPTR_INFO *res = new LPTR_INFO;
	res->glowa=res->ogon=NULL;
	if(inf->glowa==NULL)
	return res;
	else
	{
		LPTR *przed,*po;
		przed=NULL;
		po=inf->glowa;
		bool flag = true;
		while(flag && po != NULL)
		{
			if(decyzja(po->adres,q))
			flag=false;
			else
			przed=po;
			po=po->nastepny;
		}
		res->glowa=przed;
		res->ogon=po;
	}
	return res;
}

void LISTA::dorzuc(ELEMENT *q)
{
	if(inf_dane.glowa==NULL)
	{
		inf_dane.glowa = inf_dane.ogon = q;
	}
	else
	{
		inf_dane.ogon->nastepny=q;
		inf_dane.ogon=q;
	}
	dodaj(0,q,alf);
	dodaj(1,q,zarob);
}

void LISTA::dodaj(int nr, ELEMENT *q, int (*decyzja)(ELEMENT *a, ELEMENT * b))
{
	LPTR *temp = new LPTR;
	temp->adres = q;
	if(inf[nr].glowa== NULL)
	{
		inf[nr].glowa=inf[nr].ogon=temp;
		temp->nastepny=NULL;
	}
	else
	{
		LPTR *przed,*po;
		LPTR_INFO *where = odszukaj_wsk(&inf[nr],q,decyzja);
		przed = where->glowa;
		po = where->ogon;
		if(przed == NULL)
		{
			inf[nr].glowa=temp;
			temp->nastepny = po;
		}
		else if(po == NULL)
		{
			inf[nr].ogon->nastepny=NULL;
			temp->nastepny=NULL;
			inf[nr].ogon=temp;
		}
		else
		{
			przed->nastepny=temp;
			temp->nastepny=po;
		}
	}
}

int LISTA::usun(ELEMENT *q, int (*decyzja)(ELEMENT*,ELEMENT*))
{
	ELEMENT * temp;
	for(int i = 0; i < 2; i++)
	temp=usun_wsk(&inf[i],q,decyzja);
	if(temp==NULL)
	return 0;
	else
	return usun_element(temp);
}

ELEMENT* LISTA::usun_wsk(LPTR_INFO *inf, ELEMENT *temp, int(*decyzja)(ELEMENT*,ELEMENT*))
{
	LPTR *przed,*po;
	if(inf->glowa==NULL)
	return NULL;
	else
	{
		LPTR_INFO *gdzie = odszukaj_wsk(inf,temp,decyzja);
		przed=gdzie->glowa;
		po=gdzie->ogon;
		if(po==NULL)
		return NULL;
		else if(po->nastepny==NULL)
		{
			inf->ogon=przed;
			przed->nastepny == NULL;
		}
		else if(po==inf->glowa)
		{
			inf->glowa=po->nastepny;
		}
		else
		{
			przed->nastepny=po->nastepny;
		}
	}
	ELEMENT *ret = po->adres;
	delete po;
	return ret;
}

int LISTA::usun_element(ELEMENT *q)
{
	ELEMENT *po = inf_dane.glowa;
	ELEMENT *przed = NULL;
	while((po != NULL) && (po!=q))
	{
		przed=po;
		po=po->nastepny;
	}
	if(po != q)
	return 0;
	if(po==inf_dane.glowa)
	{
		inf_dane.glowa=po->nastepny;
		delete po;
	}
	else if(po==inf_dane.ogon)
	{
		przed->nastepny=NULL;
		inf_dane.ogon=przed;
		delete po;
	}
	else
	{
		przed->nastepny=po->nastepny;
		delete po;
	}
	return 1;
}

void LISTA::wypisz(char znak)
{
	if(znak=='a')
	write(&inf[0]);
	else
	write(&inf[1]);
}

void LISTA::write(LPTR_INFO *inf)
{
	LPTR *temp=inf->glowa;
	while(temp!=NULL)
	{
		std::cout<<temp->adres->nazwisko<<" zarabia "<<temp->adres->zarobki<<std::endl;
		temp=temp->nastepny;
	}
}

Niestety zamiast poprawnych danych jedynie co mi się wyświetla to:
A zarabia 1000
A zarabia 1000
A zarabia 1000
A zarabia 1000

5
  1. Zlikwiduj smrodek przy inkrementacji: http://4programmers.net/Forum/1101404
  2. Użyj deklaracji: typedef int DECYZJA(ELEMENT*,ELEMENT*) po czym masz int LISTA::usun(ELEMENT *q, DECYZJA *decyzja) - znacznie bardziej przejrzyste.
  3. Nie używaj polskiego nazewnictwa: http://4programmers.net/Forum/1208091
  4. Masz dwa wskaźniki następny - to prowadzi do problemów - gubisz się co jest czym, więc daj różne nazwy
  5. Po kiego ci typedef struct rob { ... } ELEMENT; skoro piszesz w C++? Wystarczy: struct ELEMENT { ... };
  6. Zrób te struktury strukturami wewnętrznymi klasy LISTA.
  7. Funkcje int alf(ELEMENT *a, ELEMENT *b) oraz inne zrób statycznymi składowymi.
  8. Dodaj podobną do powyższego funkcję: int ptr(ELEMENT *a, ELEMENT *b) { return a==b; } po czym usun_element() skróć do jednego wiersza z użyciem usun_wsk() i tego nowego ptr()
    Bajzel w kodzie jest nie z tej ziemi, jak poprawisz powyższe to wrzuć kod, będzie można wyszukać w tym jakiś sens.

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