M e considerat lista legată individual și să ajungă la concluzii nefavorabile - lista este rezonabil să se utilizeze ca o stivă, deoarece inserțiile din partea de sus a listei și ștergerea din lista de la începutul au complexitate de ordinul 1, cu manevre suplimentare pot realiza inserția de complexitate la sfârșitul ordinii 1 și determinarea lungimii O (1), dar îndepărtarea de la capăt, iar elementul de inserție sunt căutare O (n).
Cum pot simplifica eliminarea ultimului element? Este evident că, dacă vom păstra un pointer la elementul anterior, ar fi posibilă eliminarea acesteia din urmă.
o structură de date care este compus din noduri care stochează pointerii de date sarcină utilă la nodul anterior și nodul următor - lista legată de două ori.
Structura de care avem nevoie pentru realizarea unui nod listă
Structura de tip Blank DblLinkedList
Structura de tip DblLinkedList cu un singur element
Prima funcție este, în general creează o instanță a structurii DblLinkedList
Nu este nimic interesant. În același timp, descrie funcția pe care șterge o listă
Acum, definim un set de funcții standard - pushFront popFront și de a lucra cu capul, și Pushback popBack de a lucra cu ultimul element, getNth, se introduce și deleteNth pentru a introduce și a scoate într-un loc arbitrar.
Introducerea unui element nou la partea de sus a listei
Introduceți partea din față este foarte similar cu inserția în lista legată. În primul rând creează un nou element
Vom crea un element nou și setați-l
Din moment ce el a fost primul, apoi următorul referită de pointer la vechiul cap al listei, și nu există nici un element anterior. Acum, în cazul în care lista a fost deja elementul cap, indicatorul său anterioare ar trebui să se refere la elementul nou creat
Acum, verificați coada indicatorul. Dacă este gol, apoi, după adăugarea unui nou element, acesta trebuie să se refere la ea
Acum perekinem pointer cap la elementul nou creat și de a crește valoarea dimensiunii contorului
Aruncat capul ukazazatel al listei pentru elementul nou creat
Îndepărtarea de la începutul listei sunt, de asemenea, spre deosebire de însemnat pentru lista legată. Adăugat aruncat doar indicii suplimentare și verificați dacă indicatorul ultimul element, în cazul în care elementul nu mai este lăsat să devină zero.
În primul rând, creați un pointer la primul element al listei. El va trebui să se schimbe după toate prev indicii și alta, am fost capabili de a elimina nodul.
Am creat un pointer la primul element
După aceea cap perekinem pointer la elementul următor
cap indicatorul Toss la elementul următor
În continuare, verificați dacă elementul nu este undeletable în timp ce ultimul (atunci când lista este doar un element), și apoi eliberează memoria.
Am creat un pointer la primul element
Se introduce la sfârșitul anului și eliminarea la sfârșitul unei foarte asemănătoare - trebuie doar să ne întoarcem peste lista. În consecință, toate schimbările pe prev următoare, și cap la coadă
Obținerea de elementul n-lea este foarte simplu și nu diferă de la a acestuia pentru lista legată.
Puteți îmbunătăți această funcție: dacă lista este lungă, în funcție de indicele poate avea loc fie de la început până la sfârșit, sau de la capăt la început. Acest lucru vă permite să utilizați întotdeauna nu mai mult de N / 2 etape.
Acum puteți scrie o funcție pentru a șterge și introduceți de asamblare. În primul rând, vom găsi elementul dorit, și apoi să creați un nou nod (în cazul în care pasta), sau un pointer la elementul șters. Apoi schimba toate indicii.
Nu uita, desigur, să caute valorile capului și coada Quatnities, pentru a indica elementele active în prezent.
Adăugați câteva funcții auxiliare care ajută în munca. În primul rând - aceasta este o listă de imprimare. Având în vedere că tipul de valoare - void *, este necesar să se transmită funcția de imprimare a unui element.
În exemplele pe care le vom folosi variabile de tip int
A doua funcție - pentru a crea o listă de matrice
Acum puteți utiliza lista de două ori legată
R anee ne-am uitat la algoritmul de sortare este o metodă de îmbinare listă legată unidirecțională. Lista legată de două ori pot fi sortate în același mod, astfel încât acum să ne ia în considerare un alt algoritm - inserare de sortare. Esența algoritmului este foarte simplu - pentru a crea o nouă listă bi-direcțională legate. L-am pus într-o listă neordonată, primul element. Pentru a introduce un al doilea element de trecere pe lista sortate și în căutarea unui loc unde să inserați. Dacă locația este găsit, se introduce la sfârșitul anului. Evident, în cazul în care tipul de date nu este cunoscută, va fi necesar să se treacă o funcție de comparație, cu care se poate schimba ordinea de sortare.
Pentru a pune în aplicare, avem nevoie de mai mult de o funcție - pentru a insera elementul specificat. Această funcție va primi un pointer la lista, un pointer la nodul la care doriți să inserați elementul, iar noile date.
Acum, în mod direct de sortare
Este evident că, la sfârșitul în lista transmisă de elemente nu rămâne, așa cum le-au împins afară, astfel încât să înlocuiască vechea listă nou creat.
Complexitatea algoritmului - O (n 2), avem o cale de trecere pentru o listă de complexitate neordonată de ordinul n, pentru fiecare element al trecatorii sortate.
Din moment ce de fiecare dată când creați un nou nod vom elimina un nod din prima listă, este necesară mai multă memorie.
Acum, compara complexitatea diferitelor operații de listă pur și simplu conectate și de două ori legate. Lista unidirecționale legată
Complexitatea operațiunilor pentru lista legată.