Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:laborator-06 [2015/04/02 10:15]
cosmin.boaca [Listă circulară dublu-î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ă dublu-înlănţuită ==== +==== Listă circulară dublu înlănţuită ==== 
- +<code c++ list.h>
-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. +
- +
-{{sd-ca:​playground:​lista_circ_dublu.png?​direct&​ |}} +
- +
-<code c++ stack.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 77: Line 72:
 private: private:
     Node<​T>​ *pFirst, *pLast;     Node<​T>​ *pFirst, *pLast;
- 
 public: ​ public: ​
     // Constructor     // Constructor
Line 108: Line 102:
     bool isEmpty();     bool isEmpty();
 }; };
 +
 +#endif
  
 </​code>​ </​code>​
  ===== 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**] removeFirstremoveLast ​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 148: 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 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:​
  
sd-ca/laboratoare/laborator-06.1427958910.txt.gz · Last modified: 2015/04/02 10:15 by cosmin.boaca
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0