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

Podobne dokumenty