Witam
Prosiłbym o pomoc także odnośnie listy jednokierunkowej , w ktorej mam problem z usuwaniem. Chodzi o funkcje usun ktora mimo, ze powinna to nie dziala jak nalezy... trudno mi powiedziec dlaczego... dlugo ja juz debuguje i nic z tego nie moge wymyslic. Ponizej zamieszczam swoj kod:
#include <iostream>
using namespace std;
struct ELEMENT
{
int wartosc;
ELEMENT *nastepny;
};
struct INFO
{
ELEMENT *glowa;
ELEMENT *ogon;
};
void zainicjuj(INFO*);
void dodaj(INFO*,int);
void usun(INFO*,int);
void wypisz(INFO);
void szukaj(INFO,int);
void zwolnij(INFO);
int main()
{
INFO lst;
char operacja;
int parametr;
zainicjuj(&lst);
cin >> operacja;
cin >> parametr;
while(operacja!='k')
{
switch(operacja)
{
case 'w':
wypisz(lst);
break;
case 'd':
dodaj(&lst,parametr);
break;
case 's':
szukaj(lst,parametr);
break;
case 'u':
usun(&lst,parametr);
break;
}
cin >> operacja;
cin >> parametr;
}
zwolnij(lst);
return 0;
}
void zainicjuj(INFO *wsk_info)
{
wsk_info->glowa=NULL;
wsk_info->ogon=NULL;
}
void zwolnij(INFO lst)
{
ELEMENT *p,*q;
if(lst.glowa!=NULL)
{
q=lst.glowa;
while(q!=NULL)
{
//zapamietujemy wskaznie na nastepny element listy
//w zmiennej p
p=q->nastepny;
//usuwamy element listy wskazywany przez q
delete(q);
//przypisujemy zmiennej q wskazanie na kolejny element
q=p;
}
}
}
/********************************************************************
Zaimplementuj funkcje dodaj(INFO *lst,int elem), ktora dolaczy element o wartosci
rownej elem na koniec listy.
********************************************************************/
void dodaj(INFO *tmp,int val)
{
ELEMENT *ptr = new ELEMENT;
ptr->wartosc = val; // wpisanie wartości val do nowego elemntu listy
ptr->nastepny = NULL; // wskaznik nowego elementu na NULL
if(tmp->glowa == NULL)tmp->glowa = tmp->ogon = ptr; // stworzenie pierwszego elemenu, glowa = ogon
else
{
tmp->ogon->nastepny = ptr;
tmp->ogon = ptr;
}
}
/********************************************************************
Zaimplementuj funkcje wypisz(INFO lst), ktora wypisze w kolejnych wierszach
zakonczonych znakime nowej linni ("\n") kolejne elementy listy.
********************************************************************/
void wypisz(INFO tmp)
{
ELEMENT *ptr = new ELEMENT;
ptr = tmp.glowa;
if(tmp.glowa == NULL)
{
cout<<"lista pusta\n";
}
else
{
while( ptr != NULL )
{
cout<<ptr->wartosc<<endl;
ptr = ptr->nastepny;
}
}
}
/********************************************************************
Zaimplementuj funkcje szukaj(INFO lst,int elem), ktora sprawdzi,
czy na liscie znajduje sie przynajmniej jeden element o wartosci rownej elem;
- jesli tak, to wypisze na stdout tekst "TRUE",
- jesli nie, to wypisze na stdout tekst "FALSE",
zakonczony znakiem nowej linni "\n".
********************************************************************/
void szukaj(INFO tmp,int elem)
{
ELEMENT *ptr = new ELEMENT;
int check = 0; // zmienna do porownania czy wystapila
ptr = tmp.glowa;
if(tmp.glowa == NULL)cout<<"FALSE - emty list"<<endl;
else
{
do
{
if(ptr->wartosc == elem)
{
check = 1;
}
ptr = ptr->nastepny;
}
while(ptr != NULL);
if(check == 1)cout<<"TRUE"<<endl;
else cout<<"FALSE"<<endl;
}
}
/********************************************************************
Zaimplementuj funkcje usun(INFO* lst ,int elem), ktora usunie z listy wszystkie elementy
o wartości równej parametrowi elem.
********************************************************************/
void usun(INFO *tmp,int value)
{
ELEMENT *ptr = tmp->glowa;
while(ptr->nastepny != NULL)
{
if(ptr->nastepny->wartosc == value)
{
ELEMENT *erase = new ELEMENT;
erase = ptr->nastepny;
ptr->nastepny = erase->nastepny;
delete (erase);
}
else
{
ptr = ptr->nastepny;
}
}
}