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