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 18:15]
sebastian.cancel
laboratoare:laborator-03 [2018/02/25 22:13]
mihai.iacov
Linia 1: Linia 1:
-====== Laborator 03: Stive & Cozi ====== +====== Laborator 03: Liste ======
 \\ \\
 =====1 Obiectivele laboratorului===== =====1 Obiectivele laboratorului=====
-*Înțelegerea conceptului de funcționare si implementarea de stive și cozi. +*Înțelegerea conceptului de funcționare și implementarea unor liste dublu înlănțuite și circulare 
-*Implementarea unor funcții individuale de lucru cu acestea.+*Implementarea unor funcții individuale de lucru cu aceste structuri de date.
 \\ \\
  
-=====2 Ce este o stivă?=====+=====2 Ce este o listă?=====
 ====2.1 Definiție==== ====2.1 Definiție====
-O stivă reprezintă o listă cu structuri de date de tipul: Last-In-First-Out (LIFO).\\ +Listele sunt cele mai bune și cele mai simple exemple a unei structuri de date dinamice care folosește pointeri 
-Un exemplu comun ar fi un teanc de cărți: tot punem rți pe o masă, dar în momentul când vrem să le ridică+la implementarea sa.în mod esențial, trebuie înțeles că listele funcționează ca un vector care se poate mări sau 
-începem cu ultimapusă deasupra teancului.+micșora după nevoiedin orice punct al mulțimii sale de elemente.
  
-#poza stiva#+{{ :laboratoare:array_vs_list.png?400 |}}
  
-====2.2 Operații cu stive====+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
  
-Definim structura astfel+Definirea nodului unei liste
-<code+<file cpp
-struct stack+typedef struct { 
-     int s[size]+     int val
-     int top+     node *next
-st+node_t
-</code>+</file>
  
-* **Verificăm dacă stiva e plină sau goală** +====2.2 Clasificare==== 
-<code> +* **Liste simplu înlănțuite** - Elementele au o singură legătură către următorul element introdus, iar ultimul 
-int st_full()//int st_empty+element pointează către NULL. 
-     if(st.top>=size - 1)  //if(st.top==-1) + 
-          return 1; +{{ :laboratoare:simplelist.png?500 | Liste simplu înlănțuite}} 
-     else + 
-          return 0; + 
-}      +* **Liste dublu înlănțuite** - Elementele au dublă legătură către precedentul și antecedentul, capul listei pointând 
-</code> +spre NULL și ultimul element de asemenea 
-* **Adăugarea*+ 
-<code> +{{ :laboratoare:doublelist.jpg?500 |}} 
-void push(int item){ + 
-     st.top++; +* **Liste circulare** - Pot fi simplu sau dublu înlănțuite cu proprietatea că ultimul element pointează spre primul. 
-     st.s[st.top]=item; + 
-} +{{ :laboratoare:circularlist.png?500 |#Poza lista circulare#}} 
-</code+ 
-* **Ștergerea** +====2.3 Operații cu liste:==== 
-<code> +*Adăugare la începutul listei 
-int pop(){ +*Adăugare la sfârsitul listei 
-     int item; +*Adăugarea înainte sau după un element dat 
-     item = st.s[st.top]; +*Ștergerea capului de listă 
-     st.top--; +*Ștergerea unui element oarecare din listă 
-     return (item); + 
-}+=====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> </code>
  
-**//Observații//**\\ +Pentru compilare folositi comanda ''%%make%%''. Pentru rulare puteti folosi fie **''%%./list%%''** fie comanda ''%%make run%%''
-1.Când introducem elemente într-stivă,trebuie să incrementăm top-ul șapoi să adăugam elementul.\\ + 
-2.Când ștergem un element,trebuie întâi să ștergem elementul și apoi să decrementăm top-ul.\\ +====Probleme opţionale - de interviu==== 
-3.O stivă poate fi implementată cu ajutorul unui **vector** sau cu **liste înlănțuite**.\\+ 
 +1. Se dă listă simplu înlănţuită(primiţ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.txt · Ultima modificare: 2018/02/25 22:13 de către mihai.iacov