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.