Implementacja listy jednokierunkowej.

0

Witam.

Mam pewien problem z zadaniem odnośnie implementacji listy.

Zadanie brzmi

Przedstaw implementację listy jednokierunkowej w jęz. C/C++ . Zaimplementuj funkcje wyświetlania elementów listy, dodawania do listy oraz usuwania elementów z listy. Lista ma przechowywać elementy typu Integer z przedziału <1,50>. Lista musi przechowywać elementy w porządku od najmniejszego do największego elementu, czyli w momencie dodawania elementu należy go wstawić w odpowiednie miejsce.

Ja zrobiłem owe zadanie, natomiast problem gdzieś tkwi w rzekomej funkcji push_front().

Poniżej wstawiam kod źródłowym mojego zadania.

 #include <iostream>
#include <list>
#include <windows.h>

using namespace std;

list <int> lista; 
int wybor;



void wyswietl()
{
    system("CLS");
    
    cout<<" Lista: \n "<<endl;

    for(list<int>::iterator i=lista.begin(); i!= lista.end(); ++i)
       cout<<*i<<" ";

    cout<<endl;
    cout<<" \n"<<endl<<endl;
}



void push_front()
{
    int liczba;
    cout<<"Jaka liczbe wstawic na poczatek listy: ";
    
    cin>>liczba;
    if(liczba>50)
    {
    
    cout<<"Liczba jest za duza";
    Sleep(1000);
}
    else;
    lista.push_front(liczba);
    
    if(liczba>50)
    {
    	lista.pop_front();
    	
    }
    else;
    lista.sort();
}







void size()
{
    cout<<"Cyfr na liscie: "<<lista.size();
    Sleep(2000);
}



void max_size()
{
    cout<<"Max liczb na liscie: "<<lista.max_size();
    Sleep(5000);
}



void empty()
{
    cout<<"Czy lista jest pusta? -> ";
    if (lista.empty()==1) cout<<"TRUE"; else cout<<"FALSE";
    Sleep(2000);
}



void remove()
{
    int liczba;
    cout<<"Usun z listy wszystkie liczby rowne: ";
    cin>>liczba;
    lista.remove(liczba);
}





void reverse()
{
    cout<<"Odwrocenie kolejnosci liczb";
    lista.reverse();
    Sleep(2000);
}



void exit()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12);
    cout<<"Koniec programu!";
    Sleep(2000);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0);
}


int main()
{

do
{

wyswietl();

cout << " MENU:"<<endl;


cout << "1  -> Dodanie elementu"<<endl;
cout << "2  -> Liczba elementow na liscie"<<endl;
cout << "3  -> Max liczba elementow na liscie"<<endl;
cout << "4  -> Sprawdza czy lista jest pusta"<<endl;
cout << "5  -> Usuwa z listy wszystkie elementy"<<endl;
cout << "6  -> Odwracanie elementow na liscie"<<endl;

cout << "Podaj skrot akcji: ";
cin >> wybor;

	switch (wybor)
	{
        case 1:  push_front(); break;
        case 2:  size();       break;
        case 3:  max_size();   break;
        case 4:  empty();      break;
        case 5:  remove();     break;
        case 6: reverse();    break;
        case 7: exit();       break;

        default:
        cout<<"blad";
        Sleep(2000);
        break;
	}

}
while(wybor!=7);

    return 0;
}

Proszę o pomoc w tym zadaniu.

Pozdrawiam.

1

Coo? W tym zadaniu raczej chodzi zupełnie o coś innego, to znaczy o zaprojektowanie i zainteresowanie listy ** samemu **, a nie korzystając z std::list i pisząc jakiegoś głupiego wrappera na to. Btw, std::list jest zaimplementowane jako lista dwukierunkowa.

0

Więc w takim razie o co chodzi, bo nie rozumiem ?

2

Tak tldr to wywal #include <list> i wtedy pisz.

0

Z tym, że nie czaję tego w żadnym wypadku. Może to zbyt dla mnie nie do ogarnięcia.
Naprowadźcie mnie jakoś, ew. jakąś pomoc naukową. Rozumiem wszystko z linku od Dragona, ale przeobrazić na C++ nie umiem.

0

Na serio wrapper na zajęcia XD.
Jedno z rozwiązań:
Tworzysz sobie klasę Node z polami:

Node *next;
int value;

I teraz tworzysz sobie klasę Lista z polem Node root.
I np dodawanie elementu na koniec. ( co prawda skrajnie nie efektywne)

Node *tmp = root;
while(tmp->next){ tmp = tmp->next }
tmp->next = new Node(x)
0

cała seria filmików.

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