Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna rakenteena Tietomäärittelyt tavalla 1 Esimerkkisovellus Funktioiden toteutuksia Tietomäärittelyt tavalla 2 Funktioiden toteutuksia 1
Taulukon etuja Arrays are sometimes called contiguous list as opposite to dynamically linked list. Advantages of arrays: A) Retrieving element by order number is effective (random access is possible) B) Searching by key (according which data is ordered) is effective because binary search can be used. 2
Taulukon haittapuolia Disadvantages of arrays: A) Static arrays Fixed size problem (nothing can be done during run time). B) Dynamic arrays Array can be expanded during run time. Price is that we must move data. C) Common disadvantages when the order of items must be maintained: Insert operation and delete operation need data moves. Dynamically linked list is an option for array as a data storage structure. To avoid the disadvantages of arrays we can use dynamically linked list. Then we also lose the advantages. 3
Introduction to linked list 1 The requirements for linked list: No upper limit for a number of elements. No extra space allocated at any moment. Data movements never needed. Solution is: Dynamically linked dynamically allocated list. The basic idea: The space is allocated for items one at a time from dynamic memory when needed. We allocate space for the pointer of next node every time when we allocate space for an item (node). Disadvantages of linked list Links need memory space. Random access is not possible. Binary search can not be applied. 4
Introduction to linked list 2 There is no best solution You have to choose the solution according the requirements of the application. For example in the application, where main operations are inserting, deleting and going through all elements in some order and where we never know the maximum number of elements in advance the dynamically linked list is the "best". If on the other hand, the main operation is searching data using a search key and insertions and deletions are rare operations, then array is the best solution. 5
Introduction to linked list 3 Tallennetun tiedon rakenne näyttää silloin muistissa esimerkiksi seuraavalta: a c b Pohditaan miksei muita vaihtoehtoja ole yo. tavoitteiden saavuttamiseksi. Ratkaisulla on myös hinta eli haittapuolet. 6
Different ways to define the node of linked list Option 1. typedef struct node *Tpointer; typedef struct node { Titem item; Tpointer next; Tnode; Option 2. typedef struct node { Titem item; struct node *next; Tnode; typedef struct node *Tpointer; //or typedef Tnode *Tpointer; Option 3. (C++) struct Tnode { ; Titem item; Tnode *next; typedef Tnode *Tpointer; Huom. Määrittelyissä on itseensä viittaus eli self reference. 7
Lineaarisen listan (ADT) toteutus Olemme toteuttaneet erilaisia säiliöitä (järjestetty lista, pino, jono) taulukolla. Nämä kaikki voidaan toteuttaa myös dynaamisesti linkatulla listalla. Otetaan esimerkiksi lista. Pidämme listan interfacen samana, jotta uutta listatoteutusta voidaan käyttää taulukkolistan asemesta muuttamatta itse sovellusta! Valitaan taulukolla aikaisemmin toteutetusta listasta malliksi funktiot: Tlist; void initialize_list(tlist* list); int number_of_items(const Tlist* list); int retrieve_ith(const Tlist* list, int i, Titem* data); void insert_to_list_end(tlist* list, Titem data); ja pari uutta funktiota void cleanup_list(tlist* list); void print_list (const Tlist* list); Tietotyypin nimi on sama kuin ennen, mutta sen määrittely on erilainen. 8
Lineaarisen listan tietomäärittelyt (Tapa 1) typedef char Titem; // listan alkiotyyppi voidaan vaihtaa // ja muutos ei saa näkyä muualla typedef struct node *Tpointer; Tämä on tapa 1, jossa pidetään kirjaa typedef struct node { ensimmäisen ja viimeisen solmun paikoista. Titem item; Pitämällä kirjaa myös viimeisen solmun Tpointer next; paikasta, saadaan loppuun lisäys tehokkaaksi. Tnode; Ratkaisu ei vastaa sivulla 6 olevaa kuvaa. typedef struct { Toisaalta sisällön mukaan järjestyksessä Tpointer first; olevassa listassa (Ordered list) ei sellaista operaatiota kuin loppuun lisäys ole edes Tpointer last; olemassa. Toisaalta taas tässä oleva ratkaisu Tlist; on sopiva esimerkiksi jonon toteutuksessa. void initialize_list(tlist* list); int number_of_items(const Tlist* list); int retrieve_ith(const Tlist* list, int i, Titem* data); jne. 9
Sovellusesimerkki void main (void) { Tlist list; initialize_list(&list); insert_to_list_end(&list, 'a'); insert_to_list_end(&list, 'b'); insert_to_list_end(&list, 'c'); printf("number of items in list is %d\n", number_of_items(&list)); print_list(list); cleanup_list(&list); 10
Funktioiden toteutusesimerkkejä 1 void initialize_list (Tlist* list) { list->first = NULL; list->last = NULL; void insert_to_list_end(tlist* list, Titem data) { Tpointer newnode; newnode = (Tpointer) malloc(sizeof(tnode)); newnode -> item = data; newnode->next = NULL; if (list->first == NULL) list->first = newnode; //ensimmäinen solmu else list->last->next = newnode; //muut solmut list->last = newnode; 11
Funktioiden toteutusesimerkkejä 2 void print_list (const Tlist* list) { Tpointer p = list->first; while (p!= NULL) { printf("%c ", p->item); //Tässä on yleisyysongelma. p = p->next; void cleanup_list(tlist* list) { Tpointer aux1 = list->first, aux2; while (aux1!= NULL) { aux2 = aux1->next; free(aux1); aux1 = aux2; initialize_list(list); 12
Lineaarisen listan tietomäärittelyt (Tapa 2) typedef char Titem; typedef struct node *Tpointer; typedef struct node { Tnode; Titem item; Tpointer next; typedef Tpointer Tlist; void initialize_list(tlist* list); int number_of_items(const Tlist* list); // listan alkiotyyppi voidaan vaihtaa // ja muutos ei saa näkyä muualla int retrieve_ith(const Tlist* list, int i, Titem* data); jne. Labraharjoituksena tehdään funktiot void initialize_list(tlist* list), void insert_to_list_end(tlist* list, Titem data) ja mahdollisesti muita funktioita tällä tietomäärittelyllä. Tämä on tapa 2, jossa pidetään kirjaa vain ensimmäisen solmun paikasta. Ratkaisu vastaa nyt sivulla 6 olevaa kuvaa. Tällainen on sopivampi esimerkiksi järjestyksessä olevassa listassa (Ordered list). 13