Nadesłany przez Emil Hotkowski, 11 lutego 2012 18:18
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
lista_dwukierunkowa.cpp:
//Lista dwukierunkowa
//Emil Hotkowski
//www.algorytm.org
#include <iostream>
using namespace std;
//Deklaracja klasy listy dwukierunkowej
class lista{
public:
class ogniwo{
public:
ogniwo * next;
ogniwo * prev;
int value;
};
class interator{
public:
ogniwo * wsk;
interator next(interator it);
};
lista(int v);
void wyswietl();
interator poczatek;
interator koniec;
interator insert_list(interator it, int v);
interator delete_list(interator it);
interator begin();
interator end();
interator get(int v);
int size;
};
//Przyklad uzycia
int main(int argc, char *argv[])
{
//uwtorz liste z elementem o wartosci 2
lista L(2);
//pobierz wskaznik na pierwszy element listy
lista::interator it = L.begin();
//wstaw element 3, za pierwszym elementem
L.insert_list(it,3);
//przesun wskaznik na kolejny element
it = it.next(it);
//wstaw element o wartosci 8, za elementem o wartosci 3
L.insert_list(it,8);
//wstaw element o wartosci 12, za elementem o wartosci 3
L.insert_list(it,12);
//wyswietl zawartosc listy
L.wyswietl();
cout << "\n";
//pobierz wskaznik na element o wartosci 8
it = L.get(8);
cout << it.wsk->value << "\n";
//usun element o wartosci 8 z listy
L.delete_list(it);
//wyswietl zawartosc listy
L.wyswietl();
cout << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}
//***************
// METODY
//***************
//Konstruktor listy
//tworzy nowa liste dwukierunkowa z jednym elementem o zadanej wartosci v
lista::lista(int v){
ogniwo * a= new ogniwo;
a->next = a;
a->prev = a;
a->value = v;
poczatek.wsk = a;
koniec.wsk = a;
size = 1;
}
//Wstawia nowy element do listy dwukierunkowej
//Element ma wartosc v i jest wstawiany za elementem wskazywanym przez iterator it
lista::interator lista::insert_list(interator it, int v){
ogniwo * a = it.wsk;
ogniwo * b = new ogniwo;
ogniwo * c = a->next;
b->next = c;
b->prev = a;
b->value = v;
c->prev = b;
a->next = b;
if(b->next == b)koniec.wsk = b; //popraw koniec listy, jezeli dodajemy za ostatnim elementem
size++;
return it;
}
//Usuwa z listy dwukierunkowej element wskazywany przez iteroator it
lista::interator lista::delete_list(interator it){
ogniwo * b = it.wsk;
ogniwo * a = b->prev;
ogniwo * c = b->next;
a->next = c;
c->prev = a;
if(poczatek.wsk == b) poczatek.wsk = c; //popraw poczatek listy, jezeli usuwamy pierwszy element
if(koniec.wsk == b) koniec.wsk = a; //popraw koniec listy, jezeli usuwamy ostatni element
delete b;
it.wsk =a;
size--;
return it;
}
//Zwraca poczatek listy dwukierunkowej
lista::interator lista::begin(){
return poczatek;
}
//Zwraca koniec listy dwukierunkowej
lista::interator lista::end(){
return koniec;
}
//Wyswietla zwartosc listy dwukierunkowej
void lista::wyswietl(){
interator it = poczatek;
for(int i = 0 ; i < size ; i++){
cout << it.wsk->value << " ";
it.wsk = it.wsk->next;
}
}
//Zwraca wskaznik na kolejny element w liscie dwukierunkowej
lista::interator lista::interator::next(interator it){
it.wsk = it.wsk->next;
return it;
}
//Zwraca wskaznik na element o zadanej wartosci v
lista::interator lista::get(int v){
interator it = poczatek;
for(int i = 0 ; i < size; i++){
int x = it.wsk->value;
if(x ==v) break;
else it.wsk = it.wsk->next;
}
return it;
}

