This shows you the differences between two versions of the page.
|
sd-ca:laboratoare:laborator-06 [2015/04/02 12:07] cosmin.boaca [Listă circulară simplu-înlănţuită] |
sd-ca:laboratoare:laborator-06 [2015/04/07 10:24] (current) dragos.dimitriu [Exerciții] |
||
|---|---|---|---|
| Line 45: | Line 45: | ||
| {{sd-ca:playground:lista_dublu.png?direct& |}} | {{sd-ca:playground:lista_dublu.png?direct& |}} | ||
| - | ==== Listă circulară dublu-înlănţuită ==== | + | ==== Listă circulară simplu-înlănţuită ==== |
| Primul şi ultimul nod sunt legate împreună. Pentru a parcurge o listă circular înlănţuită se începe de la oricare nod şi se urmăreşte lista prin aceasta direcţie aleasă până când se ajunge la nodul de unde s-a pornit parcurgerea (lucru valabil şi pentru listele circulare dublu-înlănţuite). | Primul şi ultimul nod sunt legate împreună. Pentru a parcurge o listă circular înlănţuită se începe de la oricare nod şi se urmăreşte lista prin aceasta direcţie aleasă până când se ajunge la nodul de unde s-a pornit parcurgerea (lucru valabil şi pentru listele circulare dublu-înlănţuite). | ||
| 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: | ||