Unelte utilizator

Unelte site


laboratoare:laborator-03

Diferențe

Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.

Link către această vizualizare comparativă

Ambele părți revizuirea anterioară Versiuni anterioare
Urmatoarea versiune
Versiuni anterioare
laboratoare:laborator-03 [2017/02/14 11:44]
florina_elena.barbu
laboratoare:laborator-03 [2018/02/25 22:13] (curent)
mihai.iacov
Linia 1: Linia 1:
-====== Laborator 03: Stive & Cozi ======+====== Laborator 03: Liste ====== 
 +\\ 
 +=====1 Obiectivele laboratorului===== 
 +*Înțelegerea conceptului de funcționare și implementarea unor liste dublu înlănțuite și circulare 
 +*Implementarea unor funcții individuale de lucru cu aceste structuri de date. 
 +\\
  
-TODOD+=====2 Ce este o listă?===== 
 +====2.1 Definiție==== 
 +Listele sunt cele mai bune și cele mai simple exemple a unei structuri de date dinamice care folosește pointeri 
 +la implementarea sa.în mod esențial, trebuie înțeles că listele funcționează ca un vector care se poate mări sau 
 +micșora după nevoie, din orice punct al mulțimii sale de elemente. 
 + 
 +{{ :laboratoare:array_vs_list.png?400 |}} 
 + 
 +Avantaje ale utilizării listelor: 
 +*Elementele pot fi adăugate sau șterse din mijlocul listei 
 +*Nu trebuie definită o mărime inițială, iar memoria se alocă pe rând, odată cu fiecare element adăugat 
 + 
 +Definirea nodului unei liste: 
 +<file cpp> 
 +typedef struct { 
 +     int val; 
 +     node *next; 
 +} node_t; 
 +</file> 
 + 
 +====2.2 Clasificare==== 
 +* **Liste simplu înlănțuite** - Elementele au o singură legătură către următorul element introdus, iar ultimul 
 +element pointează către NULL. 
 + 
 +{{ :laboratoare:simplelist.png?500 | Liste simplu înlănțuite}} 
 + 
 + 
 +* **Liste dublu înlănțuite** - Elementele au dublă legătură către precedentul și antecedentul, capul listei pointând 
 +spre NULL și ultimul element de asemenea 
 + 
 +{{ :laboratoare:doublelist.jpg?500 |}} 
 + 
 +* **Liste circulare** - Pot fi simplu sau dublu înlănțuite cu proprietatea că ultimul element pointează spre primul. 
 + 
 +{{ :laboratoare:circularlist.png?500 |#Poza lista circulare#}} 
 + 
 +====2.3 Operații cu liste:==== 
 +*Adăugare la începutul listei 
 +*Adăugare la sfârsitul listei 
 +*Adăugarea înainte sau după un element dat 
 +*Ștergerea capului de listă 
 +*Ștergerea unui element oarecare din listă 
 + 
 +=====3.Exerciții propuse pentru laborator===== 
 +1. Creați o listă circulară,dublu inlănțuită cu 6 angajați ai unei companii, care să conțină următoarele referințe: nume, nr de telefon, post. 
 +  * Scrieți funcțiile care să scrie urmatoarele:\\ 
 +  * Să introducă un nou angajat după al treilea.\\ 
 +  * Să introducă un nou angajat inainte de cel care e "mecanic".\\ 
 +  * Să steargă angajatul cu un anumit număr de telefon introdus.\\ 
 + 
 +2. Să se creeze o listă liniara simplu inlantuita care contine elemente intregi citite dintr-ul fisier text. 
 +Se citeste apoi o valoare intreaga x. Sa se stearga primul nod care contine valoarea x. 
 +Fișierul se va da ca parametru în linia de comandă. 
 + 
 +3. Să se construiasca o lista liniara simplu inlantuita cu elemente numere intregi. Să se afișeze și apoi să se stearga din lista elementele pare.  
 + 
 +4. Adunaţi 2 polinoame rare, reprezentând fiecare polinom printr-o listă înlănţuită, unde fiecare nod va conţine datele pentru un coeficient şi o putere (de exemplu: 5 x<sup>3</sup>, coeficient = 5, putere = 3). 
 + 
 +5. Pentru laboratorul de liste inlantuite vom porni de la o arhiva cu un schelet de laborator. Nu veti scrie codul de la zero ci veti implementa cateva functii in fisierul ''%%list.c%%''
 + 
 +Descarcati arhiva de {{ :laboratoare:lab1-skel.zip |aici}} si dezarhivati-o. Puteti folosi utilitarul ''%%wget%%'' pentru descarcare si utilitarul ''%%unzip%%'' pentru dezarhivare. 
 +<code bash> 
 +student@sda-ab-vm:~/Documents$ wget http://elf.cs.pub.ro/sda-ab/wiki/_media/laboratoare/lab1-skel.zip 
 +--2017-03-02 20:45:55--  http://elf.cs.pub.ro/sda-ab/wiki/_media/laboratoare/lab1-skel.zip 
 +Resolving elf.cs.pub.ro (elf.cs.pub.ro)... 141.85.227.116 
 +Connecting to elf.cs.pub.ro (elf.cs.pub.ro)|141.85.227.116|:80... connected. 
 +HTTP request sent, awaiting response... 200 OK 
 +Length: 2368 (2,3K) [application/zip] 
 +Saving to: ‘lab1-skel.zip’ 
 + 
 +lab1-skel.zip       100%[===================>  2,31K  --.-KB/   in 0s       
 + 
 +2017-03-02 20:45:56 (4,78 MB/s) - ‘lab1-skel.zip’ saved [2368/2368] 
 + 
 +student@sda-ab-vm:~/Documents$ ls 
 +lab1-skel.zip 
 +student@sda-ab-vm:~/Documents$ unzip lab1-skel.zip 
 +Archive:  lab1-skel.zip 
 +  inflating: list.c                   
 +  inflating: list.h                   
 +  inflating: Makefile 
 +student@sda-ab-vm:~/Documents$ make 
 +gcc list.c -o list -std=gnu99 
 +student@sda-ab-vm:~/Documents$ make run 
 +</code> 
 + 
 +Pentru compilare folositi comanda ''%%make%%''. Pentru rulare puteti folosi fie **''%%./list%%''** fie comanda ''%%make run%%''
 + 
 +====Probleme opţionale - de interviu==== 
 + 
 +1. Se dă o listă simplu înlănţuită(primiţi doar un pointer către primul element). Verificaţi dacă lista conţine o buclă. (o listă simplu înlănţuită conţine o buclă => niciun element nu are legătura NULL) 
 + 
 +2. Se dau două liste(pentru fiecare listă - pointer către primul element) în formă de Y(listele se intersectează, ultimele k elemente sunt comune). Aflaţi valoarea lui k. 
 + 
 +3. Se dă o listă  cu 2n+1 elemente, fiecare element conţine câte un întreg. Toate valorile întregi apar de două ori în listă, excepţie facând una singură. Aflaţi acea valoare.
  
laboratoare/laborator-03.1487065459.txt.gz · Ultima modificare: 2017/02/14 11:44 de către florina_elena.barbu