LIsta jednokierunkowa

A2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Witam to moja prawie gotowa lista jednokierunkowa mam tylko problem przy wstawianiu bo jak wstawię jakiś element np. 100
to nie mogę dodać elementu większego np 101 może ktoś mi wyjaśnić jaki jest błąd podejrzewam, że w funkcji insert2

Kopiuj
#include <iostream>
using namespace std;

struct Wezel
{
	float dane;
	Wezel *nastepny;
};
Wezel *poczatek=NULL;

void usunpoczatek(Wezel *&poczatek)
{
	Wezel *tmp;
	tmp=poczatek;
	poczatek=tmp->nastepny;
	delete tmp;//free(tmp)
}

void usunAll(Wezel *&poczatek)
{
	Wezel *tmp;
	while(poczatek!=NULL)
	{
		tmp=poczatek;
		poczatek=tmp->nastepny;
		delete tmp;
	}
}
int szukaj(Wezel *&poczatek,float wartosc)
{
	Wezel *tmp;
	tmp=poczatek;
	while(tmp!=NULL)
	{
		
		if(tmp->dane==wartosc)
		{
			cout<<"jest taki element na liscie\n";system("PAUSE");return 0;
		}
		
		tmp=tmp->nastepny;	
	}	

	cout<<"nie ma takiego elementu na liscie\n";system("PAUSE");return 0;
	return 0;
}
void drukuj(Wezel *poczatek)
{
	Wezel *tmp;
	tmp=poczatek;
	int t=1;
	for(tmp;tmp!=NULL;tmp=tmp->nastepny,t++)
	{
		cout<<"[ "<<tmp->dane<<" ] -";
		if(t%8==0)cout<<endl;
	}
}

int deletee(Wezel *&head, float x) //zwrócenie wartości ≠ 0 oznacza błąd 
{ 
	Wezel *p, *previous; 
	previous = NULL; 
	p = head; 
	if(!p) return(-1); //lista pusta 
	while(p) { 
		if(p->dane == x) //znaleziono element o kluczu x 
	{ 
		if(!previous) //usunięto „czoło listy” 
		head = p->nastepny; 
		else previous->nastepny = p->nastepny;//”sklejenie” listy 
			free(p); //zwolnienie alokowanej pamięci 
			return(0); 
		} 
		if(p->dane > x) return(-1); //nie znaleziono elementu o kluczu x 
	previous = p; p = previous->nastepny; 
	} 
	return(-1); //nie znaleziono elementu o kluczu x 
}
int insert2(Wezel *&head,float key)
{
	Wezel *p,*prev=NULL,*new_node;
	new_node = new Wezel;
	if(!new_node)return(-1);
	new_node->nastepny=NULL;
	new_node->dane=key;
	p=head;
	if(!p)//lista dotad byla pusta
	{
		head=new_node;return 0;
	}
	while(p)
	{
		if(p->dane==key)return -2;//na liscie jest just element
		if(p->dane<key){prev=p;p=prev->nastepny;}
		else
		{if(!prev)
		head=new_node;
		else
			prev->nastepny=new_node;
		}
		new_node->nastepny=p;return 0;
			}
	prev->nastepny=new_node;return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int zakonczenie=99;
	float war;
	while(zakonczenie!=1)
	{
		
		system("CLS");
		cout<<"\nAdam "<<endl;
		cout<<"\nlista jednokierunkowa podaj opcje"<<endl;
		cout<<"1 koniec programu"<<endl;
		cout<<"2 dodanie do listy "<<endl;
		cout<<"3 dodanie kilku losowych el. do listy "<<endl;
		cout<<"4 usuniecie z listy"<<endl;
		cout<<"5 usuniecie kilku poczatkowych el z listy"<<endl;
		cout<<"6 szukanie"<<endl;
		cout<<"7 czyszczenie listy"<<endl;
		drukuj(poczatek);
		cout<<"\n: ";
		cin>>zakonczenie;
		switch(zakonczenie)
		{
		case(1):
			cout<<"koniec programu"<<endl;
			system("PAUSE");
			return 0;
		case(2):
			cout<<"jaka wartosc dodac? : "; 
			cin>>war;
			insert2(poczatek,war); 
			break;
		case(3):
			cout<<"ile dodac? : "; 
			cin>>war;
			for(int q=0;q<war;q++)
			{
				insert2(poczatek,(float)(rand()%100)); 
				
			}
			break;
		case(4):
			if(poczatek==0)
			{
				cout<<"lista jest pusta\n";system("PAUSE");
			}
			else
				{
					cout<<"co chcesz usunac : ";
					cin>>war;
					deletee(poczatek,war);
				}
			break;
		case(5):
			cout<<"ile usunac : "; 
			cin>>war;
			if(!poczatek)
			{
				cout<<"lista jest pusta\n";system("PAUSE");
			}else
			{
				for(int q=1;q<=war;q++)
				{
			usunpoczatek(poczatek);
				}
			}
			break;
			case(6):
				cout<<"co chcesz znalezc : ";
				cin>>war;
			szukaj(poczatek,war);
			break;
		case(7):
			usunAll(poczatek);
			break;
		}
	}
	system("PAUSE");
	return 0;
}
PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

tak na oko to ta linia wydaje się być odpowiedzialna za Twój problem:

Kopiuj
if(p->dane<key){prev=p;p=prev->nastepny;}

I tak na przyszłość kod mógłbyś w stawiać w odpowiednie dla kodu tagi, aby się ładnie wyświetlało z kolorowaniem składni

  • Rejestracja: dni
  • Ostatnio: dni
0

nie ma znaku # przed include

davemajster
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Twoja pętla w insert2() jest jakaś dziwna, po co to return na końcu było. Myślę, że tak będzie poprawnie

Kopiuj
while (p) {
  if(p->dane == key) return -2;
  else if(p->dane < key) {
    prev = p;
    p = p->nastepny;
  } else {
    new_node->nastepny = p;
    break;
  }
}
if(!prev)
  head = new_node;
else 
  prev->nastepny = new_node;

No i kto Ci powiedział że nieudana alokacja przez operator new zwraca NULL ? Po co wartości zwracane w funkcjach jak ich nie używasz ? No i kompilacja twojego kodu(ale to szczegół):

Kopiuj
g++     adam.cpp   -o adam
adam.cpp: In function ‘int szukaj(Wezel*&, float)’:
adam.cpp:40:77: error: ‘system’ was not declared in this scope
adam.cpp:46:67: error: ‘system’ was not declared in this scope
adam.cpp: In function ‘int deletee(Wezel*&, float)’:
adam.cpp:73:31: error: ‘free’ was not declared in this scope
adam.cpp: At global scope:
adam.cpp:107:22: error: ‘_TCHAR’ has not been declared
adam.cpp: In function ‘int _tmain(int, int**)’:
adam.cpp:114:29: error: ‘system’ was not declared in this scope
adam.cpp:143:63: error: ‘rand’ was not declared in this scope
adam.cpp:183:23: error: ‘system’ was not declared in this scope
make: *** [adam] Error 1

pozdrawiam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.