This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-06 [2015/04/02 11:15] cosmin.boaca [Listă circulară simplu înlănţuită] |
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ă simplu înlănţuită ==== | + | ==== Listă circulară dublu înlănţuită ==== |
<code c++ list.h> | <code c++ list.h> | ||
template <typename T> | template <typename T> | ||
struct Node { | struct Node { | ||
T value; | T value; | ||
- | Node<T> *next; | + | Node<T> *next, *prev; |
Node (T value) { | Node (T value) { | ||
this->value = value; | this->value = value; | ||
+ | next = prev = NULL; | ||
} | } | ||
Node() { | Node() { | ||
+ | next = prev = NULL; | ||
} | } | ||
}; | }; | ||
Line 70: | Line 71: | ||
class LinkedList { | class LinkedList { | ||
private: | private: | ||
- | Node<T> *pLast; | + | Node<T> *pFirst, *pLast; |
- | Node<T> *sentinel; | + | |
public: | public: | ||
// Constructor | // Constructor | ||
Line 108: | Line 108: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | 1) [**4p**] Implementați în header-ul definit anterior funcțiile pentru o listă liniară dublu înlănțuită. | + | 1) [**5p**] 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. | + | * [**3p**] constructor, destructor(eliberați memoria folosită) și isEmpty. |
* [**1p**] addFirst și addLast. | * [**1p**] addFirst și addLast. | ||
- | * [**1p**] removeFirst si removeLast. | + | * [**1p**] removeFirst, removeLast si removeFirstOccurence. |
+ | 2) [**2p**] Implementați o stivă folosind liste. | ||
- | 2) [**2p**] Implementați functia removeFirstOccurrence și demonstrați funcționarea acesteia printr-un cod simplist. | + | <code cpp stack.h> |
+ | #ifndef __STACK__H | ||
+ | #define __STACK__H | ||
+ | |||
+ | template<typename T> | ||
+ | class Stack { | ||
+ | public: | ||
+ | // Constructor | ||
+ | Stack(); | ||
+ | |||
+ | // Destructor | ||
+ | ~Stack(); | ||
+ | |||
+ | void push(T x); | ||
+ | T pop(); | ||
+ | T peek(); | ||
+ | int isEmpty(); | ||
+ | |||
+ | private: | ||
+ | // Vectorul de stocare. | ||
+ | LinkedList<T> stackList; | ||
+ | // De ce nu mai este nevoie sa retinem topLevel? | ||
+ | }; | ||
+ | #endif | ||
+ | </code> | ||
3) [**2p**] Implementați o coadă folosind liste. | 3) [**2p**] Implementați o coadă folosind liste. | ||
Line 144: | Line 169: | ||
#endif | #endif | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | BONUS [**bragging rights**] Implementati inversarea unei liste simplu inlantuite, fara memorie auxiliara. | ||
+ | |||
<hidden> | <hidden> | ||
- | 2) [**2p**] Implementați functia removeLastOccurrence și demonstrați funcționarea acesteia printr-un cod simplist. | + | 3) [**2p**] Implementați o coadă folosind liste. |
+ | |||
+ | <code cpp queue.h> | ||
+ | |||
+ | #ifndef __QUEUE_H | ||
+ | #define __QUEUE_H | ||
+ | |||
+ | template <typename T> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
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 154: | 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 182: | Line 239: | ||
#endif | #endif | ||
</code> | </code> | ||
- | </hidden> | ||
3) [**2p**] Implementați o stivă folosind liste. | 3) [**2p**] Implementați o stivă folosind liste. | ||
Line 212: | 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: | ||