This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-06 [2015/04/02 08:40] mihai.neacsu2901 [Exerciții] |
sd-ca:laboratoare:laborator-06 [2015/04/07 10:24] (current) dragos.dimitriu [Exerciții] |
||
---|---|---|---|
Line 53: | Line 53: | ||
{{sd-ca:playground:lista_circ_simplu.png?direct& |}} | {{sd-ca:playground:lista_circ_simplu.png?direct& |}} | ||
- | ==== Listă circulară dublu-înlănţuită ==== | + | ==== Listă circulară dublu înlănţuită ==== |
+ | <code c++ list.h> | ||
+ | template <typename T> | ||
+ | struct Node { | ||
+ | T value; | ||
+ | Node<T> *next, *prev; | ||
+ | Node (T value) { | ||
+ | this->value = value; | ||
+ | next = prev = NULL; | ||
+ | } | ||
+ | Node() { | ||
+ | next = prev = NULL; | ||
+ | } | ||
+ | }; | ||
- | Fiecare nod are două legături, asemanator ca şi la listele liniare simplu-înlănţuite, însă diferenţa este că listele circulare dublu-înlănţuite legatura dinaintea primului nod îl leagă pe acesta de ultimul nod, şi legatura de dinaintea ultimului nod catre îl leagă pe acesta de primul nod. La fel ca şi la listele liniare dublu-înlănţuite, operaţiile de inserţie şi ştergere pot fi făcute în orice punct din listă, cu acces la oricare nod apropiat. | + | template <typename T> |
+ | class LinkedList { | ||
+ | private: | ||
+ | Node<T> *pFirst, *pLast; | ||
+ | public: | ||
+ | // Constructor | ||
+ | LinkedList(); | ||
+ | // Destructor | ||
+ | ~LinkedList(); | ||
- | {{sd-ca:playground:lista_circ_dublu.png?direct& |}} | + | /* Adauga un nod cu valoarea == value la inceputul listei. */ |
+ | void addFirst(T value); | ||
+ | /* Adauga un nod cu valoarea == value la sfarsitul listei. */ | ||
+ | void addLast(T value); | ||
- | =====Exemplu===== | + | /* Elimina elementul de la inceputul listei si intoarce valoarea acestuia. */ |
- | <code cpp list.h> | + | T removeFirst(); |
- | /* list.h */ | + | |
- | #ifndef __LIST__H | + | |
- | #define __LIST__H | + | |
- | template <typename T>struct Node { | + | /* Elimina elementul de la sfarsitul listei listei si intoarce valoarea acestuia. */ |
- | T value; | + | T removeLast(); |
- | Node<T> *next; | + | |
- | Node<T> *prev; | + | /* Elimina prima aparitie a elementului care are valoarea == value. */ |
+ | T removeFirstOccurrence(T value); | ||
+ | |||
+ | /* Elimina ultima aparitie a elementului care are valoarea == value. */ | ||
+ | T removeLastOccurrence(T value); | ||
+ | |||
+ | /* Afiseaza elementele listei pe o singura linie, separate printr-un spatiu. */ | ||
+ | void printList(); | ||
+ | |||
+ | /* Intoarce true daca lista este vida, false altfel. */ | ||
+ | bool isEmpty(); | ||
}; | }; | ||
- | template <typename T>class LinkedList { | + | #endif |
- | private: | + | |
- | Node<T> *pFirst, *pLast; | + | |
+ | </code> | ||
+ | ===== Exerciții ===== | ||
+ | |||
+ | 1) [**5p**] Implementați în header-ul definit anterior funcțiile pentru o listă liniară dublu înlănțuită. | ||
+ | * [**3p**] constructor, destructor(eliberați memoria folosită) și isEmpty. | ||
+ | * [**1p**] addFirst și addLast. | ||
+ | * [**1p**] removeFirst, removeLast si removeFirstOccurence. | ||
+ | |||
+ | 2) [**2p**] Implementați o stivă folosind liste. | ||
+ | |||
+ | <code cpp stack.h> | ||
+ | #ifndef __STACK__H | ||
+ | #define __STACK__H | ||
+ | |||
+ | template<typename T> | ||
+ | class Stack { | ||
public: | public: | ||
- | // Constructor | + | // Constructor |
- | LinkedList(); | + | Stack(); |
- | // Destructor | + | |
- | ~LinkedList(); | + | |
- | + | ||
- | /* Adauga un nod cu valoarea == value la inceputul listei. */ | + | |
- | void addFirst(T value); | + | |
- | /* Adauga un nod cu valoarea == value la sfarsitul listei. */ | + | // Destructor |
- | void addLast(T value); | + | ~Stack(); |
- | /* Elimina elementul de la inceputul listei si intoarce valoarea acestuia. */ | + | void push(T x); |
- | T removeFirst(); | + | T pop(); |
+ | T peek(); | ||
+ | int isEmpty(); | ||
- | /* Elimina elementul de la sfarsitul listei listei si intoarce valoarea acestuia. */ | + | private: |
- | T removeLast(); | + | // Vectorul de stocare. |
+ | LinkedList<T> stackList; | ||
+ | // De ce nu mai este nevoie sa retinem topLevel? | ||
+ | }; | ||
+ | #endif | ||
+ | </code> | ||
- | /* Elimina prima aparitie a elementului care are valoarea == value. */ | + | 3) [**2p**] Implementați o coadă folosind liste. |
- | T removeFirstOccurrence(T value); | + | |
- | /* Elimina ultima aparitie a elementului care are valoarea == value. */ | + | <code cpp queue.h> |
- | T removeLastOccurrence(T value); | + | |
- | /* Afiseaza elementele listei pe o singura linie, separate printr-un spatiu. */ | + | #ifndef __QUEUE_H |
- | void printList(); | + | #define __QUEUE_H |
- | /* Intoarce true daca lista este vida, false altfel. */ | + | template <typename T> |
- | bool isEmpty(); | + | class Queue { |
+ | private: | ||
+ | // De ce nu mai este nevoie sa retinem head, tail si size? | ||
+ | LinkedList<T> queueList; | ||
+ | |||
+ | public: | ||
+ | // Constructor. | ||
+ | Queue(); | ||
+ | |||
+ | // Destructor. | ||
+ | ~Queue(); | ||
+ | |||
+ | void enqueue(T e); | ||
+ | T dequeue(); | ||
+ | T front(); | ||
+ | int isEmpty(); | ||
}; | }; | ||
#endif | #endif | ||
- | |||
</code> | </code> | ||
- | ===== Exerciții ===== | ||
- | 1) [**4p**] Implementați în header-ul definit anterior funcțiile pentru o listă liniară dublu înlănțuită. | ||
- | * [**2p**] constructor, destructor(eliberați memoria folosită) și isEmpty. | ||
- | * [**1p**] addFirst și addLast. | ||
- | * [**1p**] removeFirst si removeLast. | ||
+ | BONUS [**bragging rights**] Implementati inversarea unei liste simplu inlantuite, fara memorie auxiliara. | ||
- | 2) [**2p**] Implementați functia removeFirstOccurrence și demonstrați funcționarea acesteia printr-un cod simplist. | ||
+ | <hidden> | ||
3) [**2p**] Implementați o coadă folosind liste. | 3) [**2p**] Implementați o coadă folosind liste. | ||
Line 149: | Line 204: | ||
</code> | </code> | ||
- | <hidden> | + | |
- | 2) [**2p**] Implementați functia removeLastOccurrence și demonstrați funcționarea acesteia printr-un cod simplist. | + | |
2) [**3p**] Implementaţi o funcţie removeDuplicates şi demonstraţi funcţionarea acesteia printr-un cod simplist. Funcţia va trebui să elimine toate elementele duplicate din lista dublu înlănţuită. | 2) [**3p**] Implementaţi o funcţie removeDuplicates şi demonstraţi funcţionarea acesteia printr-un cod simplist. Funcţia va trebui să elimine toate elementele duplicate din lista dublu înlănţuită. | ||
Line 158: | Line 212: | ||
3) [**4p**] Implementati inversarea unei liste simplu inlantuite, fara memorie auxiliara. | 3) [**4p**] Implementati inversarea unei liste simplu inlantuite, fara memorie auxiliara. | ||
- | 3) [**2p**] Implementați o coadă folosind liste. | ||
<code cpp queue.h> | <code cpp queue.h> | ||
Line 186: | Line 239: | ||
#endif | #endif | ||
</code> | </code> | ||
- | </hidden> | ||
3) [**2p**] Implementați o stivă folosind liste. | 3) [**2p**] Implementați o stivă folosind liste. | ||
Line 216: | Line 268: | ||
</code> | </code> | ||
- | <hidden> | ||
4) [**1p bonus**] Considerăm o listă simplu înlănțuită, iar structura unui nod următoarea: | 4) [**1p bonus**] Considerăm o listă simplu înlănțuită, iar structura unui nod următoarea: | ||