Sunteți pe pagina 1din 5

Limbaje de Programare

Laboratorul 11: Liste Dublu Inlant, uite


Dan Novischi, Valentin Lungu
20 mai 2016
1. Introducere
antuite.
Scopul acestui laborator este definirea s, i utilizare structurilor de date Liste Dublu Inl
Listele sunt colect, ii de date compuse din unitati denumite noduri. Un nod stocheaza valoarea unui element s, i legaturi la nodurile vecine.
O lista simplu nlant, uita este o structura n care un nod are singura legatura catre urmatorul
nod. Legatura ultimului nod din lista fiind catre elementul null (NULL).
O lista dublu nlant, uita este o structura n care legaturile unui nod sunt catre vecinul aterior
(previous) s, i vecinul urmator (next). Legatura anteriora a primului nod este NULL, iar legatura umator a ultimului nod este tot NULL Astfel, o reprezentarea grafica a acestei structuri
arata ca n Figura 1 de mai jos:

Figura 1: Lista Dublu Inlantuita


unde first s, i last reprezinta pointeri catre primul, respectiv ultimul nod lista. Acesta
definit, ie (a unei liste dublu nlant, uite) se realizeaza n limbajul C, pentru elemente de tip
intreg, cu ajutorul structurilor s, i are urmatoarea reprezentare:
1
2
3
4
5

typedef struct ListNode{


int value;
struct ListNode *next;
struct ListNode *prev;
}ListNode;

unde value reprezinta valoarea unui elementului ntreg stocata de nod, iar next s, i prev
reprezinta legaturile la nodul umator s, i respectiv la cel anterior.
Definit, ia propriu-zisa a listei se realizeaza pe baza definit, iei nodurilor s, i contine pointerii
catre primul (first) s, i ultimul (last) nod:
1
2
3
4

typedef struct List{


ListNode *first;
ListNode *last;
}List;

O lista goala va avea pointeri de first s, i last setat, i la elementul NULL. Operat, iile care
trebuie implementate pentru lucrul cu liste sunt:
create/destroy
insert/delete
isListEmpty
search/contains
Implementarea primelor doua relat, ii sunt prezentate n Sectiunea .

2. Exemplu de program
1
2
3
4
5
6
7
8

#include <stdio.h>
#include <stdlib.h>
// Definitia unui nod din lista
typedef struct ListNode{
int value;
struct ListNode *next;
struct ListNode *prev;
}ListNode;

9
10
11
12
13
14

//Definitia listei
typedef struct List{
ListNode *first;
ListNode *last;
}List;

15
16
17
18

// Functii pentru lucrul cu lista


List* createList(void);
void destroyList(List *list);

19
20
21
22
23
24
25
26
27

int main(void){
// Creare lista
List* l = createList();
// ....
// Distrugere lista
destroyList(l);
return 0;
}

28
29
30
31
32
33

List* createList(void){
List *newList = (List*)malloc(sizeof(List));
newList->first = newList->last = NULL;
return newList;
}

34
35
36
37

void destroyList(List *list){


ListNode *it = list->first;
ListNode *aux = NULL;

38

while(it != NULL){
aux = it;
it = it->next;
free(aux);
}
free(list);

39
40
41
42
43
44
45

1
2
3
4
5
6
7
8
9

// Functie pentru afisarea elementelor unei liste


void printList(List *list){
ListNode* it = list->first;
printf("[");
while(it != NULL && it->next != NULL){
printf(" %d,",it->value);
}
printf(" %d ]\n",it->value);
}

3. Cerint, e
Cerint, a 1 Sa se impletenteze o funct, ie cu numele isListEmpty care verifica daca o lista
cont, ine sau nu elemente. Funct, ia primeste ca parametru o lista s, i ntoarce ntregul 1 daca
lista NU cont, ine elemente s, i ntregul 0 daca lista cont, ine elemente. Funct, ia se va testa n
programul pricipal.
Cerint, a 2 Sa se impletenteze o funct, ie cu numele insertFront care insereaza o valoare
la nceputul listei. Funct, ia primeste ca parametrii o lista s, i un element ntreg (care trebuie
introdus n lista); functia ntoarce nimic. Se va testa funct, ia n programul pricipal.
Cerint, a 3 Sa se impletenteze o funct, ie cu numele deleteFront care sterge o valoare la
nceputul listei. Funct, ia primeste ca parametru lista s, i ntoarce nimic. Se va testa funct, ia
n programul pricipal.
Cerint, a 4 Sa se impletenteze o funct, ie cu numele search care ntoarce un nod din lista
care stocheaza o anumita valoare. Funct, ia primeste lista s, i valoarea ntreaga dupa care se
cauta n lista; funct, ia ntoarce nodul cu valoarea cautata daca acesta exista. Se va testa
funct, ia n programul pricipal.
Cerint, a 5 Sa se impletenteze o funct, ie cu numele contains care verifica daca o anumita
valoare exista ntr-un nod din lista sau nu. Funct, ia are ca parametrii lista s, i valoarea dupa
care se cauta; funct, ia ntoarce 1 daca valoarea exista n lista s, i 0 altfel. Se va testa funct, ia
n programul principal.
Cerint, a 6 - Bonus1 Sa se impletenteze o doua funct, ii similare insertBack/deleteBack
cu cele de la punctele 3 s, i 4 care sa insereze s, i sa stearga elemente de la sfars, itul listei.
Cerint, a 7 - Bonus2 Sa se impletenteze o funct, ie getMid care sa ntoarca valoarea nodului
din mijlocul listei printr-o singur
a parcurgere. Atent, ie la cazul cand lista are un numar
par de elemente, alegerea mijlocului se va face la ntamplare ntre cele doua noduri din mijloc.

Cerint, a 8 - Bonus3 Sa se impletenteze o funct, ie reverse care sa inverseze lista folosind


numai legutra next a nodurilor.
Cerint, a 9 - Bonus4 Sa se impletenteze doua funct, ii insert/delete care sa insereze s, i
sa sterga elementele din lista respectand o ordonare crescatoare.
Cerint, a 10 - Bonus5 Re-implementat, i funct, iile de lucru cu liste dublu nlatuite, modificand reprezentarea listei prin stergerea pointerilor first/last s, i adaugare unui pointer catre
o santinela denumita head. O santinela este un nod alocat dummy (care nu face parte din
lista propriu-zisa), dar este folosita intern pentru simplificarea definirii relat, iilor de lucru.
Totodata lista dublu nlatuita va s, i circulara: legatura anterioara a santinelei arata catre
ultimul element din lista, iar legatura urmatoare a ultimului nod arata catre santila (vezi
Figura 2).

Figura 2: Lista Dublu Inlantuita Ciculara cu Santinela

S-ar putea să vă placă și