Documente Academic
Documente Profesional
Documente Cultură
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
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:
Î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ă.
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:
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:
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) {
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).