algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Lista - Implementacja w C/C++
Ocena użytkownikóww: *****  / 24
SłabyŚwietny
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;
}
Dodaj komentarz