1. Lista jednokierunkowa. Jest to dynamiczna struktura wiązana
Transkrypt
1. Lista jednokierunkowa. Jest to dynamiczna struktura wiązana
Metody i Języki Programowania w5, ćw.5 mgr inŜ. Paweł Kośla Lista 1. Lista jednokierunkowa. Jest to dynamiczna struktura wiązana, która składa się z węzłów. KaŜdy węzeł (tworzony niezaleŜnie w pamięci) zawiera właściwe dane oraz dodatkowo wskaźnik do kolejnego węzła. pocz Dane 1 Dane 2 Dane 3 Dane 4 next next next next NULL Identyfikatorem całej listy jest wskaźnik do pierwszego elementu. Dostęp do kolejnych elementów jest moŜliwy przez „przechodzenie” przez kolejne węzły za pomocą wskaźników „next”. Przykładowe operacje na listach: Dodawanie nowego elementu do listy. - stworzyć nowy węzeł - ustawić wskaźnik next na element następujący - ustawić wskaźnik next elementu poprzedzającego na nowy węzeł. pocz Dane 1 Dane 2 Dane 3 Dane 4 next next next next NULL Dane 11 next Usuwanie elementu z listy. - ustaw wskaźnik next elementu poprzedzającego na węzeł wskazywany przez obiekt do usunięcia. - usuń węzeł do usunięcia – delete pocz Dane 1 Dane 11 Dane 2 Dane 3 Dane 4 next next next next next NULL Metody i Języki Programowania w5, ćw.5 mgr inŜ. Paweł Kośla 2. Lista dwukierunkowa. W kaŜdym elemencie (węźle) listy przechowywane są odnośniki zarówno do następnego jak i poprzedniego elementu na liście. Taka reprezentacja umoŜliwia swobodne przemieszczanie się po liście w obie strony. pocz Dane 1 Dane 1 Dane 1 Dane 1 next next next next prev prev prev prev NULL koniec NULL 3. Ćwiczenie. 1) Zaprojektuj klasę implementującą listę jednokierunkową. class ListaJed { Wezel *pocz; ListaJed() { pocz=NULL; } ~ListaJed() { /*...*/ } } struct Wezel { int dana; Wezel *next; } 2) Napisz metodę dodająca element na początek listy. void ListaJed::dodajNaPoczatek(int a) { Wezel *z = new Wezel(); z->dana=a; z->next = pocz; pocz = z; } pocz Dane 1 Dane 2 Dane 3 Dane 4 next next next next NULL Dane 0 next 3) Napisz metodę wyświetlającą listę. void ListaJed::wsw() { Wezel *tmp = pocz; cout<<"Moja lista:"<<endl; //przejscie po wszystkich wezlach while(tmp!=NULL) { cout<<tmp->dana<<endl; tmp=tmp->next; } } 4) Napisz destruktor. ListaJed::~ ListaJed () { Wezel *tmp = pocz; Wezel *doUsuniecia; while(tmp->next!=NULL) { doUsuniecia=tmp; tmp=tmp->next; delete doUsuniecia; } } tmp pocz ....... tmp Dane 1 Dane 2 Dane 3 Dane 4 next next next next tmp NULL Metody i Języki Programowania w5, ćw.5 mgr inŜ. Paweł Kośla 5) Napisz metodę dodającą element na koniec listy. void ListaJed::dodajNaKoniec(int a) { if(pocz==NULL) { dodaj(a); return; } //ustawiamy wskaznik tmp na ostatni element Wezel *tmp = pocz; while(tmp->next!=NULL) pocz { tmp=tmp->next; } tmp ....... tmp Dane 1 Dane 2 Dane 3 Dane 4 next next next next tmp Dane 2 Dane 3 Dane 4 next next next next } 6) Napisz metodę usuwającą zadany element z listy. int ListaJed::usun(int poz) { Wezel *tmp = pocz; Wezel *poprzedni; if(tmp == NULL || poz<0) return 0; //jesli podana pozycja jest bledna (poz<0), //lub lista jest pusta if(poz==0) { pocz = pocz->next; delete tmp; return 1; } //jesli usuwamy pierwszy element z listy //musimy podmienic wskaznik poczatkowy for(int i=0; i<poz;i++) //dla pozostalych przypadkow { //ustawiamy wskaznik tmp na usuwanej pozycji poprzedni=tmp; //oraz zapamietujemy poprzedni element tmp=tmp->next; if(tmp==NULL) return 0; //brak elementu do usuniecia } return 1; } Dane 0 next Wezel *z = new Wezel(); //dodajemy na koniec z->dana=a; z->next = NULL; Dane pocz 1 tmp->next = z; poprzedni->next=tmp->next; delete tmp; NULL //wykonujemy obejscie elementu usuwanego NULL