LIsta jednokierunkowa

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

#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;
}
0

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

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

0

nie ma znaku # przed include

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

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ół):

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.

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