Sunteți pe pagina 1din 8

Universitatea Liberă Internațională din Moldova

Facultatea Informatică, Inginerie, Design


Catedra Tehnologii informaționale și Calculatoare
Disciplina: Structuri de date și algoritmi în C++

Lucrare de laborator Nr.5

Tema : utilizarea listelor liniare pentru scrierea programelor în limbajul


de programare C++.

A efectuat student gr.TIR-26 Guminiuc Victor

A verificat profesor Mititelu Vitalii

Chișinău 2018
CUPRINS
1. Scopul lucrarii ............................................................................................................................................................... 3
2. Sarcina........................................................................................................................................................................... 3
3. Teorie ............................................................................................................................................................................ 3
4. Mersul lucrarii ............................................................................................................................................................... 5
4.1 Scrierea progreamului ................................................................................................................................................. 5
4.2 Rezultatul obtinut...................................................................................................................................................... 8
5. Concluzii ....................................................................................................................................................................... 8
1. Scopul lucrarii
Utilizarea listelor liniare pentru scrierea programelor în limbajul de programare C++.

2. Sarcina
Scrieți un program care permite utilizatorului să selecteze unul din punctele meniului (crearea listei
liniare din structuri; afișarea conținutului listei; adăugarea datelor în listă; modificarea datelor din listă;
eliminarea datelor din listă; căutarea datelor în listă conform căruiva criteriu; sortarea datelor din listă;
ieșirea din program ș.a.). Tema, pe baza căreia trebuie să creați baza de date, precum și câmpurile
obligatorii, sunt indicate în variant

Varianta 7: Filme (Nr, Denumire, Gen, Regizor, Durată, Ţară);

3. Teorie
O listă liniară (numită şi listă înlănţuită -"Linked List") este o colecţie de n>=0 elemente x[1], ... x[n]
toate de un tip oarecare, numite noduri între care există o relaţie de ordine determinată de poziţia lor relativă.
Ea este deci o mulţime eşalonată de elemente de acelaşi tip având un număr arbitrar de elemente. Numărul n
al nodurilor se numeşte lungimea listei. Dacă n=0, lista este vidă. Dacă n> = 1, x[1] este primul nod iar x[n]
este ultimul nod. Pentru 1<k<n, x[k] este precedat de x[k-1] şi urmat de x[k+1].

Acest tip de structură de date se aseamănă cu o structură standard: tipul tablou cu o singură
dimensiune (vector), ambele structuri conţinând elemente de acelaşi tip iar între elemente se poate stabili o
relaţie de ordine. Una dintre deosebiri constă în numărul variabil de elemente care constituie lista liniară,
dimensiunea acesteia nu trebuie declarată şi deci cunoscută anticipat (în timpul compilării) ci se poate
modifica dinamic în timpul execuţiei programului, în funcţie de necesităţi. Un vector ocupă în memorie un
spaţiu continuu de memorie, pe când elementele unei liste simplu înlănţuite se pot găsi la adrese nu neapărat
consecutive de memorie.

O altă deosebire avantajează vectorii, deoarece referirea unui element se face prin specificarea
numărului de ordine al respectivului element, pe când accesul la elementele unei liste liniare se face
secvenţial, pornind de la capul listei (adresa primului nod al listei) până la ultimul element al ei, ceea ce
măreşte uneori considerabil timpul de acces la un anumit element. Pentru o listă liniară este obligatoriu să
existe o variabilă, declarată în timpul compilării, denumită cap de listă care să păstreze adresa primului
element al listei. Pierderea acestei valori va duce la imposibilitatea accesării elementelor listei liniare.
Pentru implementarea dinamică a unei liste liniare, folosind pointeri, nodurile listei vor fi structuri ce
conţin două tipuri de informaţie:

 câmpurile ce conţin informaţia structurală a nodului


 câmpurile ce conţin informaţia de legătură, ce vor conţine pointeri la nodurile listei.

Înlănţuirea secvenţială a elementelor unei liste se face utilizând variabile de tip pointer, care
specifică adresa de memorie a elementelor adiacente. Fiecare nod are un predecesor şi un succesor, mai
puţin elementele prim şi ultim dacă lista nu este circulară.

Liste simplu lantuite

Listele înlănţuite cu un singur câmp de legătură se numesc liste simplu înlănţuite (legătura indică
următorul element din listă). Fiecare nod conţine un pointer ce conţine adresa nodului următor din listă.

Ultimul element poate conţine ca adresă de legătură fie constanta NULL fie constanta 0 (indicând
astfel că ultimul nod nu are nici un succesor).
Într-o astfel de listă există întotdeauna un nod care nu mai are succesor, precum şi un nod care nu
este succesorul nici unui alt nod, aceste noduri constituind capetele listei simplu înlănţuite. Într-o primă
variantă de gestionare a acestui tip de listă vom apela la doi pointeri prim şi ultim pentru a referiri nodurile
terminale ale listei.

Dacă specificarea începutului listei prin pointerul prim este obligatorie, utilizarea pointerului de
sfârşit ultim este opţională, însă eficientă atunci când se doreşte crearea listei în ordine naturală printr-o
inserţie a noilor noduri la sfârşitul acesteia. În practică, parcurgerea întregii liste pentru a determina ultima
poziţie a acesteia este o soluţie ineficientă, convenabilă fiind cunoaşterea, cu ajutorul pointerului ultim, a
nodului terminal al acesteia. În prezenţa lui ultim, secvenţa de program care inserează un nod la sfârşitul
unei liste liniare şi concomitent îl actualizează pe ultim este următoarea:

void Lista::inserare_sfarsit(TINFO val)


{
ElementLista* ptr=new ElementLista(val); if (ptr==NULL)
{ cout<<"Eroare alocare spatiu la inserare"; return;}
Ultim->urm=ptr;
Ultim=ptr;
if (Prim==NULL) Prim=Ultim;
cout<<"Inserare la sfarsitul listei cu succes!\n";
}

Operaţii cu liste liniare simplu înlănţuite

Operatiile cele mai importante definite pe liste sunt :


1. Crearea listei
2. Adaugarea (inserarea) unui element in lista.
Inserarea poate fi facuta:
-la inceputul listei
-la sfarsitul listei
-in interior
3. Stergerea (extragerea) unui element din lista
Stergerea poate fi facuta:
-la inceputul listei
-la sfarsitul listei
-in interior
4. Parcurgerea listei si prelucrarea elementelor

Liste dublu lantuite

Spre deosebire de listele simplu înlănţuite care permit parcurgerea de la primul element spre ultimul
alocat dinamic, listele dublu înlănţuite realizează şi drumul invers, permiţând şi parcurgerea de la ultimul
element către primul element. Modelul grafic al listei dublu înlănţuite este:

Şi cu listele dublu înlănţuite se efectuează operaţii precum:


 inserarea unui element;
 adăugarea unui element;
 ştergerea unui element;
 inversarea a două elemente;
 ştergerea listei;
 parcurgerea într-un sens şi în sensul opus;
 transformarea listei în listă circulară dublu înlănţuită.

4. Mersul lucrarii
4.1 Scrierea progreamului
#include <stdlib.h> case 2: cout << "\nA fost aleasa optiunea
#include <stdio.h> 2\n";afisare();break;
#include <conio.h> case 3: cout << "\nA fost aleasa optiunea
#include <iostream> 3\n";adaugare();break;
#include "string" case 4: cout << "\nA fost aleasa optiunea
#include "vector" 4\n";modificare();break;
case 5: cout << "\nA fost aleasa optiunea
using namespace std; 5\n";eliminare();break;
void continuare(); case 6: cout << "\nA fost aleasa optiunea
void creare(); 6\n";cautare();break;
void afisare(); case 7: cout << "\nA fost aleasa optiunea
void afisareStudent(int i); 7\n";sortare();break;
void adaugare(); case 8: isRunning=false ;break;
void modificare(); default: cout<<" atentie introduceti (1-
void eliminare(); 8)!!\n\n";break;
void cautare(); }
void sortare();
}
bool isRunning = true; else
bool isCreated = false; {
int menuItem; menu();
}
struct Filme }
{ void continuare()
int nr; {
string denumire; cout << "\ntastati orice buton pentru a continua\n";
string gen; cin.ignore();
string regizor; cin.get();
int durata; menu();
string tara; }
Filme *next; void creare()
}; {
Filme *head; if (!isCreated)
void swap(Filme & a, Filme & b) {
{ int i=0;
Filme x; Filme *c = new Filme();
x = a; c->nr = i+1;
a = b; cout << "Introduceti denumirea Filmului : ";
b = x; cin >> c->denumire;
} cout << "Introduceti genul Filmului : ";
void menu() cin >> c->gen;
{ cout << "Introduceti regizorul Filmului : ";
cout << "\n1.Crearea Listei" << endl; cin >> c->regizor;
cout << "2.Afisarea listei" << endl; cout << "Introduceti durata Filmului : ";
cout << "3.Adaugare in lista" << endl; cin >> c->durata;
cout << "4.Modificarea Datelor unui Filme" << endl; cout << "Introduceti tara a Filmului : ";
cout << "5.Eliminarea unui Filme" << endl; cin >> c->tara;
cout << "6.Cautarea unui Film" << endl; c->next = head;
cout << "7.Sortarea datelor" << endl; head = c;
cout << "8.Esire" << endl; isCreated = true;
cout << "Alegeti : "; menu();
cin >> menuItem; }
if (menuItem < 8 && menuItem > 0) else
{ {
switch(menuItem) cout << "Vectorul deja este creat" << endl;
{ continuare();
case 1: cout << "\nA fost aleasa optiunea 1\n";creare(); }
break; }
void afisare()
{ cout << "Introduceti Numarul Filmului care va fi eliminat"
Filme *c = head; << endl;
while (c) cin >> n;
{ n--;
cout << "Filmul [" << c->nr << "] are urmatoarele date :" int i = 0;
<< endl; Filme* c = head;
cout << "denumirea: " << c->denumire << endl; bool eliminat = false;
cout << "genul: " << c->gen << endl; if (n == 0)
cout << "regizor: " << c->regizor << endl; {
cout << "durata: " << c->durata << endl; Filme* temp = head;
cout << "tara: \n" << c->tara << endl; head = head->next;
c = c->next; free(temp);
} eliminat = true;
continuare(); }else if (n > 0)
} {
void adaugare() while (c)
{ {
Filme *c = new Filme(); if (i == n-1)
cout << "Introduceti denumirea Filmului care va fi adaugat {
:" ; Filme* temp = c->next;
cin >> c->denumire; c->next = c->next->next;
cout << "Introduceti genul Filmului care va fi adaugat :" ; free(temp);
cin >> c->gen; eliminat = true;
cout << "Introduceti regizorul Filmului care va fi adaugat :"; }
cin >> c->regizor; i++;
cout << "Introduceti durata Filmului care va fi adaugat :"; c = c->next;
cin >> c->durata; }
cout << "Introduceti tara Filmului care va fi adaugat : "; }
cin >> c->tara; if (eliminat)
c->next = head; {
head = c; cout << "Filmul dat a fost eliminat cu succes!!!" << endl;
continuare(); }
} else
void modificare() {
{ cout << "Filmul cu acest numar nu exista!!!" << endl;
int n = 0; }
cout << "Introduceti numarul Filmului care va fi modificat : continuare();
"; }
cin >> n; void cautare()
n--; {
Filme *c = head; int sm = 0;
int i = 0; cout << "Dupa care criteriu va fi cautarea?" << endl;
while (c) cout << "1.Numar" << endl;
{ cout << "2.denumire" << endl;
if (i == n) cout << "3.gen" << endl;
{ cout << "4.regizor" << endl;
cout << "Introduceti denumirea Filmului : "; cout << "5.durata" << endl;
cin >> c->denumire; cout << "6.tara\n" << endl;
cout << "Introduceti genul Filmului : "; cin >> sm;
cin >> c->gen; int numar = 0;
cout << "Introduceti regizorul Filmului : "; string denumire;
cin >> c->regizor; string gen;
cout << "Introduceti durata Filmului : "; string regizor;
cin >> c->durata; int durata;
cout << "Introduceti tara a Filmului : "; string tara;
cin >> c->tara; Filme* c;
i++; switch (sm)
c = c->next; {
} case 1:
} cout << "Introduceti Numarul Filmului care va fi cautat" <<
continuare(); endl;
} cin >> numar;
c = head;
void eliminare() while (c)
{ {
int n = 0; if (numar = c->nr)
{ cout << "Filmul [" << c->nr << "] are urmatoarele
cout << "Filmului " << c->nr << " are urmatoarele date :" << endl;
date" << endl; cout << "denumirea: " << c->denumire << endl;
cout << "denumirea: " << c->denumire << endl; cout << "genul: " << c->gen << endl;
cout << "genul: " << c->gen << endl; cout << "regizor: " << c->regizor << endl;
cout << "regizor: " << c->regizor << endl; cout << "durata: " << c->durata << endl;
cout << "durata: " << c->durata << endl; cout << "tara: \n" << c->tara;
cout << "tara: \n" << c->tara; }
} c = c->next;
c = c->next; }
} continuare();
continuare(); break;
break; case 5:
case 2: cout << "Introduceti durata Filmului care va fi cautat" <<
cout << "Introduceti denumirea Filmului care va fi cautat" endl;
<< endl; cin >> durata;
cin >> denumire; c = head;
c = head; while (c)
while (c) {
{ if (durata = c->durata)
if (denumire == c->denumire) {
{ cout << "Filmul [" << c->nr << "] are urmatoarele
cout << "Filmului " << c->nr << " are urmatoarele date :" << endl;
date" << endl; cout << "denumirea: " << c->denumire << endl;
cout << "denumirea: " << c->denumire << endl; cout << "genul: " << c->gen << endl;
cout << "genul: " << c->gen << endl; cout << "regizor: " << c->regizor << endl;
cout << "regizor: " << c->regizor << endl; cout << "durata: " << c->durata << endl;
cout << "durata: " << c->durata << endl; cout << "tara: \n" << c->tara;
cout << "tara: \n" << c->tara; }
} c = c->next;
c = c->next; }
} continuare();
continuare(); break;
break; case 6:
case 3: cout << "Introduceti tara angajatului care va fi cautat" <<
cout << "Introduceti genul Filmului care va fi cautat" << endl;
endl; cin >> tara;
cin >> gen; c = head;
c = head; while (c)
while (c) {
{ if (tara == c->tara)
if (gen == c->gen) {
{ cout << "Filmul [" << c->nr << "] are urmatoarele
cout << "Filmul [" << c->nr << "] are urmatoarele date :" << endl;
date :" << endl; cout << "denumirea: " << c->denumire << endl;
cout << "denumirea: " << c->denumire << endl; cout << "genul: " << c->gen << endl;
cout << "genul: " << c->gen << endl; cout << "regizor: " << c->regizor << endl;
cout << "regizor: " << c->regizor << endl; cout << "durata: " << c->durata << endl;
cout << "durata: " << c->durata << endl; cout << "tara: \n" << c->tara;
cout << "tara: \n" << c->tara; }
} c = c->next;
c = c->next; }
} continuare();
continuare(); break;
break; default:
case 4: cout << "Numarul introdus nu corespunde nici unui punct
cout << "Introduceti regizorul Filmului care va fi cautat" << din menu" << endl;
endl; continuare();
cin >> regizor; break;
c = head; }
while (c) }
{ void sortare()
if (regizor == c-> regizor) {

{ bool isChanged = true;


Filme* c;
}
while (isChanged) continuare();
{
isChanged = false; }
c = head; int main()
while (c->next != NULL) {
{ while (isRunning)
if (c->durata > c->next->durata) {
{ menu();
swap(c, c->next);
isChanged = true; return 0;
} }
c = c->next; }
}

4.2 Rezultatul obtinut

5.

5. Concluzii
Am avut insarcinarea a scrie un program care permite utilizatorului să selecteze unul din punctele
meniului (crearea listei; afișarea conținutului listei; adăugarea datelor in lista; modificarea datelor; din lista
eliminarea datelor din lista; căutarea datelor conform căruiva criteriu; sortarea datelor; ieșirea din program
ș.a.).
La scrierea programului am folosit listele lineare, structuri , functii pentru prelucrarea datelor din
lista (adaugare, stergere, actualizare, cautare si afisarea).

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