Didaxis
lecție · Informatică

Liste circulare

Ultimul nod legat de primul și parcurgerea ciclică.

Se face în:
Clasa a X-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 2 · rezumatul lecției

Pe scurt

Într-o listă circulară, ultimul nod se leagă din nou de primul, astfel parcurgerea se poate relua fără a întâlni un terminator nul. Pentru valorile 2, 5, 7, succesorul lui 7 este 2. Structura este utilă când elementele se prelucrează pe rând, la nesfârșit, de exemplu jucătorii care își așteaptă rândul, dar o buclă care așteaptă nullptr nu se mai oprește.

Desen la lecția „Liste circulare”
2în detaliustratul 2 din 2 · pentru clasă și Bacalaureat

În detaliu

Într-o listă circulară, ultimul nod nu mai are legătura nulă, ci este legat de primul nod, astfel încât parcurgerea poate continua la nesfârșit. Orice nod are un succesor: în lista cu valorile 2, 5, 7 succesorul lui 7 este 2. Din acest motiv o buclă care așteaptă nullptr nu se mai oprește, iar parcurgerea completă trebuie să se oprească la revenirea în nodul de plecare, după ce acesta a fost procesat o dată. O listă goală se tratează separat, pentru că nu are un prim nod. Structura este potrivită când elementele se prelucrează în ordine ciclică: jucătorii care își așteaptă rândul, procesele care primesc pe rând timp de calcul, o numărătoare repetată.

Exemplul 1 — parcurgerea ciclică.

#include <iostream>
using namespace std;
struct Nod { int v; Nod* urmator; };
int main() {
    Nod a{2, nullptr}, b{5, nullptr}, c{7, nullptr};
    a.urmator = &b; b.urmator = &c; c.urmator = &a;
    Nod* p = &a;
    for (int k = 0; k < 4; ++k) {
        cout << p->v << " ";
        p = p->urmator;
    }
    return 0;
}

Cele patru afișări sunt 2 5 7 2. Revenirea la 2 după al treilea pas confirmă legătura circulară. Pentru o parcurgere în care fiecare nod este vizitat o singură dată, ciclul se oprește când p redevine nodul de start.

Exemplul 2 — parcurgerea completă o singură dată. Cu start = &a, se procesează întâi nodul start, apoi se avansează cu p = p->urmator și se repetă până când p == start. Se vizitează 2, 5, 7, în această ordine, iar suma valorilor este 14. Condiția de oprire testează egalitatea cu nodul de start după ce acesta a fost procesat, nu înainte, altfel nicio iterație nu ar rula; un ciclu do ... while (p != start) exprimă exact acest lucru.

Exemplul 3 — numărătoarea cu eliminare. Cinci copii, numerotați 1–5, stau în cerc; din doi în doi, un copil iese, până rămâne unul singur. Pornind de la copilul 1 și numărând 1, 2, ies pe rând copiii 2, 4, 1 și 5, iar rămâne copilul 3. Lista circulară modelează natural cercul: după ieșirea unui nod, predecesorul lui se leagă direct de succesorul lui, iar numărătoarea continuă de la acesta. Fiecare eliminare cere parcurgerea a cel mult doi pași și refacerea unei singure legături.

Inserarea într-o listă circulară. Pentru a adăuga un nod nou q după nodul p, se aplică aceleași două legături ca la lista simplă: q->urmator = p->urmator; p->urmator = q;. Dacă lista are un singur nod, nodul este legat de el însuși, iar succesorul lui este el. Din cercul , inserarea valorii 6 după 5 dă , iar parcurgerea completă dintr-un nod oarecare vizitează patru noduri.

Ștergerea unui nod. Pentru a elimina nodul de după p, se reține q = p->urmator, apoi se execută p->urmator = q->urmator;. Din cercul , ștergerea nodului de după 5, adică a valorii 6, readuce lista la . Dacă lista are un singur nod, p->urmator == p, iar ștergerea ar elimina chiar nodul p; acest caz se tratează separat, iar lista devine goală. La ștergerea nodului de start trebuie actualizat și pointerul start, ca să nu rămână îndreptat spre un nod eliberat.

Greșeli frecvente

  • Greșit: parcurgerea unei liste circulare se oprește singură la ultimul nod.
    Corect: lista nu are nod nul; parcurgerea se oprește la revenirea în nodul de start.
  • Greșit: o buclă while (p != nullptr) este potrivită pentru o listă circulară.
    Corect: nu s-ar încheia niciodată.
  • Greșit: lista circulară nu poate fi goală.
    Corect: o listă fără noduri are capul nul și se tratează separat.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Surse și referințe

Redactare proprie, conform programei:

  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X intensiv; rocnee.eu

Documente consultate

  • Programa școlară de informatică intensiv, clasa a X-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
  • Emory University, CS171, „Linked Lists”, secțiunea despre liste circulare, mathcenter.oxford.emory.edu/site/cs171/linkedLists/

Desene: Redactare proprie (desen original), conform OMECI 5099/2009, anexa 5, Informatică X intensiv; rocnee.eu

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.