Lista jednokierunkowa do oceny

0

Witam
Napisałem program, który implementuję listę jednokierunkową oraz różne funkcję,
które pozwalają modyfikować zawartość listy. Program napisałem po to aby lepiej
posługiwać się wskaźnikami. Proszę o ocenę fachowym okiem czy poniższy kod
jest dobrze napisany, czy tak to powinno wyglądać? (Nigdy nie widziałem np. innej
biblioteki od środka, która implementuję listę więc po prostu wywarzałem otwarte drzwi ;) )

 #include<iostream>
#include<conio.h>
#include<Windows.h>

using namespace std;

struct list {
	int v;
	list *next;
	};

void push_front(list **H) {
	int value;
	cout<<"Podaj wartosc: ";
	cin>>value;
	
	list *h=new list;
	h->v=value;
	h->next=*H;
	*H=h;
	
	}
	
 void push_back(list **W) {
 	
 	int value; list *H=*W;
	cout<<"Podaj wartosc: ";
	cin>>value;
 	
 	list *h=new list;
 	h->v=value;
 	h->next=0;
 	
 	if(*W!=0) {
 	while(H->next!=0) {
 		H=H->next;
 		}
 		H->next=h;
 	}else *W=h;
 	
 }

void pop_front(list **H) {
	if(*H) {
	list *wsk=*H;
	*H=(*H)->next;
	delete wsk;
	 }
		}

void pop_back(list **H) {
	
	if(*H) {
	  if((*H)->next==0) {
	  delete *H;
	  *H=0;
	  
        }
	  else {
	  	list *h=*H;
	  	while(h->next->next!=0) h=h->next;
	  	delete h->next; h->next=0;
	  	 
	  }
		
	}
	
	
}

int amount(list *W) {
	int value=0;
	if(W!=0) { while(W->next!=0) { W=W->next; value++; } value++; }
	return value;
	}
	
void delete_v(list **H) {
	if(*H) {
	int value;
	cout<<"Podaj wartosc: ";
	cin>>value;
	
	list *h=*H;
	while(h->next!=0) {
		if(h->next->v==value) {
			list *wsk=h->next->next;
			delete h->next;
			h->next=wsk;
		} else h=h->next;
	}
	
	if((*H)->v==value) {
		list *wsk=(*H)->next;
		delete *H;
		*H=wsk;
		}	
	
	
   } 
}

list *find(list *H) {
	while(H->next!=0) H=H->next;
	return H; 
	}
	
	void reverse(list *H) {
		if(H->next->next!=0) reverse(H->next);
		H->next->next=H;
		H->next=0;
		}
		
   void sort(list *H) {
		
		while(H->next!=0) {
			
			list *wsk=H->next;
			list *wsk2=H;
			
			while(wsk!=0) {
				if(wsk2->v > wsk->v ) wsk2=wsk;
				wsk=wsk->next;
			}
			
			int v=wsk2->v;
			wsk2->v=H->v;
			H->v=v;
			
			H=H->next;
		}
   	
   }		
  
void delete_list(list *H) {
	
	if(H) {
		delete_list(H->next);
		delete H;
		}
	
}



int main()    {


	

	list *H=0; char button;
	
		
		
	while(true) {
		
		system("cls");
		cout<<"--------------------------------------------------------------------------------";
	   
	   if(H==0) cout<<"Lista jest pusta "<<endl; 
	   else {
	   	list *h=H;
	   	while(h!=0) 
	   	{
	   		cout<<h->v<<" ";
	   		h=h->next;

	   	}
	   	cout<<endl;
	   	
	   } 
		cout<<"--------------------------------------------------------------------------------"<<endl<<endl<<endl;
		cout<<"MENU"<<endl;
		cout<<"1 Dodaj element na poczatku listy "<<endl;
		cout<<"2 Dodaj element na koncu listy "<<endl;
		cout<<"3 Usun element z poczatku listy "<<endl;
		cout<<"4 Usun element z konca listy "<<endl;
	    cout<<"5 Zwroc liczbe elementow listy "<<endl;
		cout<<"6 Usun element/y o zadanej wartosci "<<endl;
		cout<<"7 Uloz elementy rosnaco "<<endl;
		cout<<"8 Odwroc kolejnosc elementow na liscie "<<endl;
		cout<<"wybor: ";
		button=getch();
			
			switch(button) 
			{
				case '1': push_front(&H); break;
				case '2': push_back(&H); break;
				case '3': pop_front(&H); break;
				case '4': pop_back(&H); break;
				case '5': cout<<"Elementow jest "<<amount(H);  getch(); break;
				case '6': delete_v(&H); break;
				case '7': if(H!=0) sort(H); break;
				case '8':
					if(H->next!=0) {
						list *wsk=find(H);
						reverse(H);
						H=wsk;
						}
				break;
				case 27: exit(0);
				default: cout<<"Error"<<endl; Sleep(100);
				
			}
		
	}
	
	
	
	delete_list(H); H=0;
	
	
	return 0;
}

Za wszelkie rady i sugestie dziekuje.

1

Nie czytałem całości ale niewiele tu jest dobrze.
Lista składa się z węzłów. Węzeł składa się z wartości i wskaźnika na kolejny element. U ciebie to Lista składa się z wartości i wskaźnika. Nie ma to sensu. Gdybyś zrobił to poprawnie to mógłbyś w klasie Lista mieć dwa wskaźniki - na początek i koniec listy. To by ci ułatwiło dodawania nowych elementów z dowolnej strony. Poza tym implementacja listy absolutnie NIE powinna niczego wypisywać ani pobierać od użytkownika. Lista to lista. A jakbym chciał tej twojej listy użyć w programie okienkowym? Albo w aplikacji webowej? To jakby miałbym dodawać elementy do tej listy skoro ty tam jakieś cout i cin masz?

0

Tzn. Ja bardziej robiłem to jako już działający program dlatego są cin/cout w funkcjach bo tak mi bylo wygodniej,
oczywiście można po prostu przekazać jako argument do funkcji jak tworzyłbym bibliotekę.

Lista składa się z węzłów. Węzeł składa się z wartości i wskaźnika na kolejny element. U ciebie to Lista składa się z wartości i wskaźnika.

Tego za bardzo nie rozumiem. Przecież jak dodaje elementy do listy to tworzę własnie wezly ktore łacze wskaznikami.

1

No to wyjaśnie ci prościej: u ciebie dodanie nowego elementu do listy powoduje wywołanie new list. Czyli w wolnym tłumaczeniu "utwórz nową listę". WTF? Czyli u ciebie lista składa się z wartości i z listy. Troche jak ta zagadka matematyczna że cegła waży kilogram i pół cegły... ;]

0

Ale u mnie "list" to tylko nazwa, rownie dobrze moglo by być "node" choć faktycznie nazwa "list"
tu zabardzo nie pasuję ale ważniejsze jest działanie.
A zagadka jest dobra, wiele osob sie nabralo ;)

1

Słaba ta lista.

1

Wskaźniki wskaźnikami, ale skoro piszesz w C++, a nie czystym C to możesz również wykorzystać referencje do przekazywania węzłów. Mnie osobiście widok więcej niż jednego * obok siebie mocno zniechęca.

0

Wskaźniki wskaźnikami, ale skoro piszesz w C++, a nie czystym C to możesz również wykorzystać referencje do przekazywania węzłów. Mnie osobiście widok więcej niż jednego * obok siebie mocno zniechęca.

Jak już mówiłem chciałem ulepszyć poslugiwanie sie wskaznikami, bo mozna sie pogubic czasami :].

Słaba ta lista.

Dlaczego ;( program działa jak nalezy?

0

To może jakieś wskazówki jeszcze oprócz "Słaba ta lista" ;)

0

Wątek do zamknięcia.Dziekuje

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