O listă înlănțuită - studopediya

O structură de date care reprezintă un set finit comandat de elemente (noduri) conectate între ele prin indicii, numita listă înlănțuită. Fiecare element al unei liste legat cuprinde un câmp de date și un pointer (link) la alta și / sau elementul anterior. Această structură permite să efectueze în mod eficient funcționarea adăugarea și eliminarea elementelor în orice poziție în secvență. Și nu impune reorganizarea structurii, care ar fi necesare în matrice. Dezavantajul unei liste legate, precum și alte structuri, cum ar fi „lista“, în comparație cu gama este lipsa de capacitatea de a lucra cu date în modul de acces aleatoriu, și anume lista - .. acces Succesiv structura, în timp ce matrice - arbitrar. Ultimul dezavantaj reduce eficiența unor operații.

Fiecare nod este conectat simplu (one-way conectat) lista conține un pointer la nodul următor (Fig. 2.7). Dintr-un singur punct puteți obține numai la punctul următor, se deplasează astfel până la capăt. Astfel, se obține un fel de curent care curge într-o singură direcție.

Figura 2.7 - lista individual legată

Pentru a reitera mai devreme a spus. În imaginea fiecare dintre blocurile reprezintă lista elementul (nod). Lista cu capul - o listă a elementului antet (presupunând că următorul câmp pentru el). Acesta nu conține date, ci doar o referință la elementul următor. Prezența datelor care indică info câmp. si link-uri - câmp următor (pentru referințe ulterioare va fi responsabil și domeniul prev). Un semn al lipsei unui indicator este zero câmp.

Lista nu este legat Izolat tipul cel mai convenabil dintr-o listă înlănțuită, adică. A. Dintr-un punct poate fi atins numai în punctul următor, se deplasează astfel până la capăt. Atunci când doar cursorul la elementul următor este un pointer la cea precedentă, atunci această listă este numit de două ori conectat.

Figura 2.8 - listă de două ori legată

Capacitatea de a muta ambele semne înainte și înapoi utile pentru anumite operații, dar suplimentare care necesită utilizarea de mai multă memorie decât cea necesară în lista legată.

Când cantitatea de memorie pentru orice motiv este limitată, atunci alternativa la lista de două ori legată poate servi ca lista-linked XOR (fig. 2.9). Acesta din urmă utilizează operațiune logică XOR (exclusiv „sau“ disjunctie strict), care pentru cele două variabile returnează true numai dacă acest lucru este adevărat, doar una dintre ele, iar al doilea, respectiv, este falsă. operațiuni de masă Adevărul:

Figura 2.9 - Lista-linked XOR

Un alt tip de lista inlantuita - lista inelului. Lista circulară legată ultimul element se referă la prima. În cazul unei liste circulare dublu legat, plus primul element se referă la acesta din urmă (Fig. 2.10). Astfel, o structură este fixată.

Figura 2.10 - Lista de inel legat

Luați în considerare operațiile de bază pe listele legate.

În exemplul de listă de două ori legate, vom explica principiul de funcționare a acestei structuri de date. Atunci când punerea în aplicare a unei liste de structuri utile (în Pascal - înregistrare).

Forma generală a nodului descriere bidirecțional listă și un pointer la primul element al listei legate:

câmp de informații este 1;

câmp de informații 2;

câmp de informații n;

un pointer la elementul următor;

pointer la elementul anterior;

struct DoubleList // nod descriere tip listă

date int; // câmp informații

DoubleList * următor; // pointer la elementul următor

DoubleList * prev; // pointer la elementul anterior

DoubleList * cap; // pointer la primul element al listei

Acum, presupunând că ansamblul descris mai sus și indicatorul la capul listei (vezi. Exemplul de mai sus), putem scrie lista de opțiuni.

void AddList (valoare int, int pozitie)

DoubleList * nod = new DoubleList; // a crea o nouă intrare

ganglioni> date = valoare; // atribuirea de valori elementului

în cazul în care (cap == NULL) // dacă lista este goală

ganglioni> următor = nod; // Setați următorul indicatorul

ganglioni> prev = nod; // set pointer prev

cap = nod; // capul listei este determinată

pentru (int i = poziția; i> 1; Eu--) p = p> următor;

ganglioni> următor = p; // adauga un element

cout<<"\nЭлемент добавлен. \n\n";

int DeleteList (int pozitie)

în cazul în care (cap == cap-> următor) // dacă acesta este ultimul element din listă

șterge cap; // sterge elementul

pentru (int i = poziția; i> 1; Eu--) a = a-> următor;

dacă (un cap ==) cap = a-> următor;

a-> prev-> next = a-> următor; // sterge elementul

cout<<"\nЭлемент удален. \n\n";

Dacă lista este goală, mesajul informând despre acest lucru, iar funcția returnează apelantului.

Funcția PrintList afișează toate elementele listei:

if (cap == NULL) cout<<"Список пуст\n";

cout<<"\nЭлементы списка: ";

Imprimați lista și prin ciclul, care este iterativ. Acum, combina aceste trei funcții într-un singur program, și scrie funcția principală, este responsabil pentru apelarea subrutine:

struct DoubleList // nod descriere tip listă

date int; // câmp informații

DoubleList * următor; // pointer la elementul următor

DoubleList * prev; // pointer la elementul anterior

DoubleList * cap; // pointer la primul element al listei

void AddList (valoare int, pozitia int) // adauga elementul

DoubleList * nod = new DoubleList; // a crea o nouă intrare

ganglioni> date = valoare; // atribuirea de valori elementului

în cazul în care (cap == NULL) // dacă lista este goală

ganglioni> următor = nod; // Setați următorul indicatorul

ganglioni> prev = nod; // set pointer prev

cap = nod; // capul listei este determinată

pentru (int i = poziția; i> 1; Eu--) p = p> următor;

ganglioni> următor = p; // adauga un element

cout<<"\nЭлемент добавлен. \n\n";

int DeleteList (pozitia int) // element de îndepărtare

în cazul în care (cap == cap-> următor) // dacă acesta este ultimul element din listă

șterge cap; // sterge elementul

pentru (int i = poziția; i> 1; Eu--) a = a-> următor;

dacă (un cap ==) cap = a-> următor;

a-> prev-> next = a-> următor; // sterge elementul

cout<<"\nЭлемент удален. \n\n";

anula PrintList () // Deschideți lista

if (cap == NULL) cout<<"Список пуст\n";

articole similare