aplicații cu liste simplu, dublu înlănțuite și...

3
Aplicații cu liste simplu, dublu înlănțuite și circulare – implementate dinamic I. LISTA SIMPLU ÎNLĂNȚUITĂ Lista liniara simplu inlantuita reprezinta o colectie omogena (acelasi tip) de elemente. Elementele listei sunt aranjate liniar. Fiecare element are un succesor (exceptand ultimul) si fiecare element are un predecesor (exceptand primul). Avantajul folosirii listelor consta in gestionarea dinamica a memoriei. Alocarea sau eliberarea nodurilor se face dinamic, la fiecare inserare respectiv stergere, ceea ce face ca nodurile listei sa fie plasate dispersat in memorie (in cazul vectorilor – structuri de date omogene alocate static, zona de memorie folosita este contigua). Legatura dintre nodurile invecinate trebuie facuta logic explicit de catre programator, prin pastrarea informatiilor de legatura in fiecare nod (pe langa valoarea utila). 1. Realizați un program care conține un meniu prin intermediul căruia: a) Se testează dacă o listă este sau nu vidă. b) Se creează o listă de numere întregi din valorile citite dintr-un fișier. c) Să se afișeze cheile elementelor din listă (in ordinea de la primul la ultimul). d) Să se afișeze cheile elementelor din listă (in ordinea de la ultimul la primul). e) Să se insereze un element la inceputul listei; f) Să se adauge un element la sfârșitul listei; g) Să se adauge un element dupa al k-lea element din lista. Daca nu exista k elemente in lista se va adauga la sfarsit. h) Să se elimine primul element din listă; i) Să se elimine ultimul element din listă; j) Să se elimine elementul aflat dupa cel de-al k-lea element din lista. Daca nu exista k elemente in lista atunci nu se va realiza stergerea. k) Să se elimine fiecare element din lista (golind practic lista). l) Să caute un element de cheie dată în listă; m) Să însumeze elementele pare din listă; n) Să se adauge intre oricare doua elemente consecutive ale listei cate un element nou care sa aiba ca informatie (cheie) media aritmetica a celor doua valori. o) Ieșire din aplicație. Se consideră structura de date și prototipurile următoarelor funcții: struct lista{ int val; // informatie sau cheie lista *leg; }*prim; void tipar(lista *rad); void vida(lista *rad); void adaugare_varf(lista *&rad 1 , int k); apel prin adaugare_varf(prim,el); 1 Declaratia parametrului formal lista *&rad are dubla semnificatie: (1) rad este de tipul pointer la lista (lista *rad) si (2) rad este transmis prin adresa (lista &rad) in sensul ca la iesirea din functie – capul listei (primul element) poate fi modificat (mai ales daca discutam de inserarea in fata listei). Computer Science and Electrical Engineering Department Adrian FLOREA

Upload: ngomien

Post on 02-Jul-2018

254 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aplicații cu liste simplu, dublu înlănțuite și ...webspace.ulbsibiu.ro/adrian.florea/html/Planificari/Planificare... · In C++ pentru alocarea dinamica se utilizeaza urmatori

Aplicații cu liste simplu, dublu înlănțuite și circulare – implementate dinamic

I. LISTA SIMPLU ÎNLĂNȚUITĂ

Lista liniara simplu inlantuita reprezinta o colectie omogena (acelasi tip) de elemente. Elementele listei sunt aranjate liniar. Fiecare element are un succesor (exceptand ultimul) si fiecare element are un predecesor (exceptand primul). Avantajul folosirii listelor consta in gestionarea dinamica a memoriei. Alocarea sau eliberarea nodurilor se face dinamic, la fiecare inserare respectiv stergere, ceea ce face ca nodurile listei sa fie plasate dispersat in memorie (in cazul vectorilor – structuri de date omogene alocate static, zona de memorie folosita este contigua). Legatura dintre nodurile invecinate trebuie facuta logic explicit de catre programator, prin pastrarea informatiilor de legatura in fiecare nod (pe langa valoarea utila).

1. Realizați un program care conține un meniu prin intermediul căruia:a) Se testează dacă o listă este sau nu vidă.b) Se creează o listă de numere întregi din valorile citite dintr-un fișier. c) Să se afișeze cheile elementelor din listă (in ordinea de la primul la ultimul).d) Să se afișeze cheile elementelor din listă (in ordinea de la ultimul la primul).e) Să se insereze un element la inceputul listei;f) Să se adauge un element la sfârșitul listei;g) Să se adauge un element dupa al k-lea element din lista. Daca nu exista k elemente in lista se

va adauga la sfarsit.h) Să se elimine primul element din listă;i) Să se elimine ultimul element din listă;j) Să se elimine elementul aflat dupa cel de-al k-lea element din lista. Daca nu exista k

elemente in lista atunci nu se va realiza stergerea.k) Să se elimine fiecare element din lista (golind practic lista).l) Să caute un element de cheie dată în listă;m) Să însumeze elementele pare din listă;n) Să se adauge intre oricare doua elemente consecutive ale listei cate un element nou care sa

aiba ca informatie (cheie) media aritmetica a celor doua valori.o) Ieșire din aplicație.

Se consideră structura de date și prototipurile următoarelor funcții:

struct lista{ int val; // informatie sau cheie lista *leg; }*prim;

void tipar(lista *rad);void vida(lista *rad);void adaugare_varf(lista *&rad1, int k); apel prin adaugare_varf(prim,el);1 Declaratia parametrului formal lista *&rad are dubla semnificatie: (1) rad este de tipul pointer la lista (lista *rad) si (2) rad este transmis prin adresa (lista &rad) in sensul ca la iesirea din functie – capul listei (primul element) poate fi modificat (mai ales daca discutam de inserarea in fata listei).

Computer Science and Electrical Engineering DepartmentAdrian FLOREA

Page 2: Aplicații cu liste simplu, dublu înlănțuite și ...webspace.ulbsibiu.ro/adrian.florea/html/Planificari/Planificare... · In C++ pentru alocarea dinamica se utilizeaza urmatori

void adaugare_sfarsit(lista *&rad, int k);void eliminare_varf(lista *&rad);void eliminare_sfarsit(lista *&rad);void cautare(lista *rad, int k);void suma_para(lista *rad);

In C++ pentru alocarea dinamica se utilizeaza urmatori operatori (analog ca in cazul pointerilor):• Operatorul new aloca spatiu in HEAP pentru o variabila dinamica. Analog se poate face

prin folosirea functiei malloc.

lista *q,*p;q=new lista; // alocare dinamica a memorieiq = (lista *)malloc(sizeof(lista)) ;

Dupa alocare, adresa variabilei se atribuie lui q, unde q este o variabila pointer catre lista.• Durata de viata a unei variabile alocate in HEAP este pana la eliberarea spatiului ocupat (cu

operatorul delete sau functia free).

free(q); // eliberarea memoriei (dealocare)delete q;

• Dupa eliberare, continutul variabilei q devine nedefinit.

2. Realizați un program care citeste dintr-un fisier inregistrari (numele si prenumele unor studenti avand lungimea ) creaza o lista simplu inlantuita si afiseaza direct (de la primul la ultimul) si invers (de la ultimul la primul) folosind apeluri de functii recursive.

Se consideră structura de date, prototipurile si definitia următoarelor funcții:

const int lungime = 30;typedef struct nod{

char nume[lungime];nod *next;

}TNOD;TNOD *c;

void tipard(TNOD *l) { if (l != NULL)

{ cout<<l->nume<<”\t”; tipard(l->next);}

}

TNOD *creare_lista(void);void tipari(TNOD *l);

3. Scrieți un program care implementează următoarele funcții:

a) Creează o listă, cu valori citite dintr-un fișier;b) Afișează conținutul listei, elementele fiind separate prin caracterul |, precum în exemplul

următor: Computer Science and Electrical Engineering Department

Adrian FLOREA

Page 3: Aplicații cu liste simplu, dublu înlănțuite și ...webspace.ulbsibiu.ro/adrian.florea/html/Planificari/Planificare... · In C++ pentru alocarea dinamica se utilizeaza urmatori

| 7 | 213 | -9 | 4 | 7 | -4 | 12 |c) Primind ca parametrii două liste, L1 (nevida) și L2 (vida), transferă in a doua lista toate

elementele din prima care ocupau pozitii pare;d) Având ca parametru o listă, verifică dacă această este ordonată;e) Primind ca parametrii două liste, L1 și L2 (ambele nevide), verifica daca elementele celor doua

liste sunt sortate crescator si le interclaseaza continutul generand ca rezultat o lista sortata;

4. Scrieti si testati o functie avand ca parametru o lista, functie care determina elementul (si pozitia sa) cu cele mai multe aparitii din lista (primul dintre ele daca sunt mai multe). Functia nu intoarce nimic – numarul maxim de aparitii, valoarea elementului si pozitia in lista – fiind transmise prin lista de parametrii.

5. Se considera o lista ce retine un „numar lung”. Astfel, informatia aferenta fiecarui nod din lista este o cifra de la 0 la 9. Sa se scrie un program care aduna, scade si inmulteste doua numere lungi.

II. LISTA LINIARA DUBLU ÎNLĂNȚUITĂ

1. Să se scrie un program care implementeaza cerintele de la problema I.1 folosind de aceasta data liste dublu inlantuite.

III. LISTA LINIARA CIRCULARA

In cazul listelor circulare trebuie facuta legatura intre ultimul si primul element astfel: (ultim->leg = prim).

1. Rezolvati Problema lui Josephus cu lista liniara circulara.Un grup de n copii se așează în cerc, se numerotează în sens orar cu 1, 2,...,n și rostesc o formulă de selecție de tip “ala bala portocala …”. Fiecăruia, începând cu primul, i se asociază un cuvânt din formula de selecție. Cel care primește ultimul cuvânt este eliminat din cerc. Jocul continuă, începând formula de selecție de la următorul copil, până când se elimină toți copiii. Folosind numerotarea inițială, să se afișeze ordinea ieșirii copiilor din joc.

BIBLIOGRAFIE

[Ior05] Iorga V., Opincaru C., Stratan C., Chiriță A. – „Structuri de date și algoritmi. Aplicații în C++ folosind STL”, Editura Polirom, 2005.

[Tud08] Tudor S. – „Informatica. Curs pentru clasele a IX-a și a X-a”, Editura L&S INFO-MAT, 2008.

[Neg97] Negrescu L. – „Limbajul C. Manual pentru clasa a XI-a”, Editura Computer Libris Agora, 1997.

Computer Science and Electrical Engineering DepartmentAdrian FLOREA