logo

Struktura podataka povezanog popisa u C++ s ilustracijom

A povezani popis je vrsta linearne dinamičke podatkovne strukture koju koristimo za pohranu podatkovnih elemenata. Nizovi su također vrsta linearne podatkovne strukture gdje su podatkovne stavke pohranjene u kontinuiranim memorijskim blokovima.

Za razliku od nizova, povezani popis ne treba pohranjivati ​​podatkovne elemente u susjednim memorijskim regijama ili blokovima.

A povezani popis se sastoji od elemenata poznatih kao 'čvorovi' koji su podijeljeni u dva dijela. Prva komponenta je dio gdje pohranjujemo stvarne podatke, a druga je dio gdje pohranjujemo pokazivač na sljedeći čvor. Ova vrsta strukture poznata je kao ' pojedinačno povezana lista .'

Povezani popis u C++

Ovaj vodič detaljno će proći kroz pojedinačno povezani popis.

Struktura pojedinačno povezane liste ilustrirana je na donjem dijagramu

Struktura podataka povezanog popisa u C++ s ilustracijom
  • Kao što smo vidjeli u gornjem dijelu, prvi čvor povezane liste poznat je kao 'glava', dok se posljednji čvor naziva 'rep'. Budući da u posljednjem čvoru nije navedena memorijska adresa, posljednji čvor povezane liste imat će null sljedeći pokazivač.
  • Budući da svaki čvor uključuje pokazivač na sljedeći čvor, elementi podataka u povezanom popisu ne moraju biti zadržani na susjednim lokacijama. Čvorovi mogu biti raspršeni po cijeloj memoriji. Budući da svaki čvor ima adresu onog nakon njega, čvorovima možemo pristupiti kad god želimo.
  • Možemo brzo dodavati i uklanjati podatke s povezanog popisa. Kao rezultat toga, povezani popis može se dinamički povećati ili smanjiti. Povezani popis nema maksimalnu količinu podatkovnih stavki koje može sadržavati. Kao rezultat toga, možemo dodati onoliko stavki podataka koliko želimo na povezani popis sve dok ima dostupnog RAM-a.
  • Budući da ne moramo unaprijed odrediti koliko stavki trebamo na povezanom popisu, povezani popis štedi memorijski prostor osim što ga je jednostavno umetnuti i izbrisati. Jedini prostor koji koristi povezani popis je pohranjivanje pokazivača na sljedeći čvor, što dodatno povećava troškove.

Nakon toga, proći ćemo kroz razne operacije koje se mogu izvesti na povezanom popisu.

1) Umetanje

Povezani popis se proširuje radnjom dodavanja na njega. Iako bi se činilo jednostavno, s obzirom na strukturu povezane liste, znamo da svaki put kada se doda podatkovna stavka, moramo promijeniti sljedeće pokazivače prethodnog i sljedećeg čvora nove stavke koju smo dodali.

Gdje će se nova podatkovna stavka umetnuti drugi je aspekt o kojem treba razmisliti.

broj abecede

Postoje tri mjesta gdje se podatkovna stavka može dodati na povezani popis.

a. Počevši od povezanog popisa

Ispod je povezana lista brojeva 2->4->6->8->10. Glava koja pokazuje na čvor 2 sada će pokazivati ​​na čvor 1, a sljedeći pokazivač čvora 1 imat će memorijsku adresu čvora 2, kao što je prikazano na slici ispod, ako dodamo novi čvor 1 kao prvi čvor na popisu .

Struktura podataka povezanog popisa u C++ s ilustracijom

Kao rezultat toga, novi povezani popis je 1->2->4->6->8->10.

b. Nakon zadanog čvora

U ovom slučaju, dan nam je čvor i iza njega moramo dodati novi čvor. Povezani popis će izgledati ovako ako se čvor f doda povezanom popisu a->b->c->d->e nakon čvora c:

Struktura podataka povezanog popisa u C++ s ilustracijom

Stoga provjeravamo je li navedeni čvor prisutan u gornjem dijagramu. Ako je prisutan, stvara se novi čvor f. Nakon toga usmjeravamo sljedeći pokazivač čvora c na potpuno novi čvor f. Sljedeći pokazivač čvora f sada pokazuje na čvor d.

c. Posljednja stavka povezanog popisa

U trećem slučaju, novi čvor se dodaje na kraj povezane liste. Uzmite u obzir donji povezani popis: a->b->c->d->e, s dodatkom čvora f na kraju. Nakon dodavanja čvora, povezani popis će izgledati ovako.

Struktura podataka povezanog popisa u C++ s ilustracijom

Kao rezultat, konstruiramo novi čvor f. Pokazivač repa koji vodi do null je tada usmjeren na f, a sljedeći pokazivač čvora f je usmjeren na null. U donjem programskom jeziku generirali smo sve tri vrste funkcija umetanja.

Povezani popis može se deklarirati kao struktura ili kao klasa u C++. Povezani popis deklariran kao struktura klasična je izjava u C stilu. Povezani popis koristi se kao klasa u modernom C++-u, uglavnom kada se koristi standardna biblioteka predložaka.

Struktura je korištena u sljedećoj aplikaciji za deklariranje i generiranje povezanog popisa. Njegovi članovi bit će podaci i pokazivač na sljedeći element.

C++ program:

 #include using namespace std; struct Node { int data; struct Node *next; }; void push ( struct Node** head, int nodeData ) { struct Node* newNode1 = new Node; newNode1 -&gt; data = nodeData; newNode1 -&gt; next = (*head); (*head) = newNode1; } void insertAfter ( struct Node* prevNode, int nodeData ) { if ( prevNode == NULL ) { cout <data = nodedata; newnode1 -> next = prevNode -&gt; next; prevNode -&gt; next = newNode1; } void append ( struct Node** head, int nodeData ) { struct Node* newNode1 = new Node; struct Node *last = *head; newNode1 -&gt; data = nodeData; newNode1 -&gt; next = NULL; if ( *head == NULL ) { *head = newNode1; return; } while ( last -&gt; next != NULL ) last = last -&gt; next; last -&gt; next = newNode1; return; } void displayList ( struct Node *node ) { while ( node != NULL ) { cout <data <'; node="node" -> next; } if ( node== NULL) cout<next, 55 ); cout << 'final linked list: ' endl; displaylist (head); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Final linked list: 35--&gt;25--&gt;55--&gt;15--&gt;45--&gt;null </pre> <h3>2) Deletion</h3> <p>Similar to insertion, deleting a node from a linked list requires many points from which the node might be eliminated. We can remove the linked list&apos;s first, last, or kth node at random. We must correctly update the next pointer and all other linked list pointers in order to maintain the linked list after deletion.</p> <p>In the following C++ implementation, we have two deletion methods: deleting the list&apos;s initial node and deleting the list&apos;s last node. We begin by adding nodes to the head of the list. The list&apos;s contents are then shown following each addition and deletion.</p> <p> <strong>C++ Program:</strong> </p> <pre> #include using namespace std; struct Node { int data; struct Node* next; }; Node* deletingFirstNode ( struct Node* head ) { if ( head == NULL ) return NULL; Node* tempNode = head; head = head -&gt; next; delete tempNode; return head; } Node* removingLastNode ( struct Node* head ) { if ( head == NULL ) return NULL; if ( head -&gt; next == NULL ) { delete head; return NULL; } Node* secondLast = head; while ( secondLast -&gt; next -&gt; next != NULL ) secondLast = secondLast-&gt;next; delete ( secondLast -&gt; next ); secondLast -&gt; next = NULL; return head; } void push ( struct Node** head, int newData ) { struct Node* newNode1 = new Node; newNode1 -&gt; data = newData; newNode1 -&gt; next = ( *head ); ( *head ) = newNode1; } int main() { Node* head = NULL; push ( &amp;head, 25 ); push ( &amp;head, 45 ); push ( &amp;head, 65); push ( &amp;head, 85 ); push ( &amp;head, 95 ); Node* temp; cout &lt;&lt; &apos;Linked list created &apos; &lt; next ) cout <data <'; if ( temp="=" null ) cout << 'null' endl; head="deletingFirstNode" (head); 'linked list after deleting node' < next <data cout<<'null'<<endl; last data 'null'; return 0; } pre> <p> <strong>Output:</strong> </p> <pre> Linked list created 95--&gt;85--&gt;65--&gt;45--&gt;25--&gt;NULL Linked list after deleting head node 85--&gt;65--&gt;45--&gt;25--&gt;NULL Linked list after deleting last node 85--&gt;65--&gt;45--&gt;NULL </pre> <h3>Node Count</h3> <p>While traversing the linked list, the process of counting the number of nodes can be performed. In the preceding approach, we saw that if we needed to insert/delete a node or display the contents of the linked list, we had to traverse the linked list from the beginning.</p> <p>Setting a counter and incrementing as well as we traverse each node will provide us the number of nodes in the linked list.</p> <h3>Differences between Array and Linked list:</h3> <table class="table"> <tr> <th>Array</th> <th>Linked list</th> </tr> <tr> <td>Arrays have a defined size.</td> <td>The size of the linked list is variable.</td> </tr> <tr> <td>Inserting a new element is difficult.</td> <td>Insertion and deletion are simpler.</td> </tr> <tr> <td>Access is permitted at random.</td> <td>No random access is possible.</td> </tr> <tr> <td>Elements are in relatively close or contiguous.</td> <td>The elements are not contiguous.</td> </tr> <tr> <td>No additional room is required for the following pointer.</td> <td>The following pointer requires additional memory.</td> </tr> </table> <h3>Functionality</h3> <p>Since linked lists and arrays are both linear data structures that hold objects, they can be utilised in similar ways for the majority of applications.</p> <p>The following are some examples of linked list applications:</p> <ul> <li>Stacks and queues can be implemented using linked lists.</li> <li>When we need to express graphs as adjacency lists, we can use a linked list to implement them.</li> <li>We can also use a linked list to contain a mathematical polynomial.</li> <li>In the case of hashing, linked lists are employed to implement the buckets.</li> <li>When a programme requires dynamic memory allocation, we can utilize a linked list because linked lists are more efficient in this instance.</li> </ul> <h2>Conclusion</h2> <p>Linked lists are data structures used to hold data elements in a linear but non-contiguous form. A linked list is made up of nodes with two components each. The first component is made up of data, while the second half has a pointer that stores the memory address of the following member of the list.</p> <p>As a sign that the linked list has ended, the last item in the list has its next pointer set to NULL. The Head is the first item on the list. The linked list allows for a variety of actions such as insertion, deletion, traversal, and so on. Linked lists are favoured over arrays for dynamic memory allocation.</p> <p>Linked lists are hard to print or traverse because we can&apos;t access the elements randomly like arrays. When compared to arrays, insertion-deletion procedures are less expensive.</p> <p>In this tutorial, we learned everything there is to know about linear linked lists. Linked lists can also be doubly linked or circular. In our forthcoming tutorials, we will go through these lists in detail.</p> <hr></data></pre></next,></data></data>

2) Brisanje

Slično umetanju, brisanje čvora s povezanog popisa zahtijeva mnogo točaka s kojih se čvor može eliminirati. Možemo nasumično ukloniti prvi, zadnji ili k-ti čvor povezane liste. Moramo ispravno ažurirati sljedeći pokazivač i sve ostale pokazivače povezane liste kako bismo održali povezanu listu nakon brisanja.

U sljedećoj C++ implementaciji imamo dvije metode brisanja: brisanje početnog čvora liste i brisanje zadnjeg čvora liste. Počinjemo dodavanjem čvorova na početak liste. Nakon svakog dodavanja i brisanja prikazuje se sadržaj popisa.

C++ program:

 #include using namespace std; struct Node { int data; struct Node* next; }; Node* deletingFirstNode ( struct Node* head ) { if ( head == NULL ) return NULL; Node* tempNode = head; head = head -&gt; next; delete tempNode; return head; } Node* removingLastNode ( struct Node* head ) { if ( head == NULL ) return NULL; if ( head -&gt; next == NULL ) { delete head; return NULL; } Node* secondLast = head; while ( secondLast -&gt; next -&gt; next != NULL ) secondLast = secondLast-&gt;next; delete ( secondLast -&gt; next ); secondLast -&gt; next = NULL; return head; } void push ( struct Node** head, int newData ) { struct Node* newNode1 = new Node; newNode1 -&gt; data = newData; newNode1 -&gt; next = ( *head ); ( *head ) = newNode1; } int main() { Node* head = NULL; push ( &amp;head, 25 ); push ( &amp;head, 45 ); push ( &amp;head, 65); push ( &amp;head, 85 ); push ( &amp;head, 95 ); Node* temp; cout &lt;&lt; &apos;Linked list created &apos; &lt; next ) cout <data <\'; if ( temp="=" null ) cout << \'null\' endl; head="deletingFirstNode" (head); \'linked list after deleting node\' < next <data cout<<\'null\'<<endl; last data \'null\'; return 0; } pre> <p> <strong>Output:</strong> </p> <pre> Linked list created 95--&gt;85--&gt;65--&gt;45--&gt;25--&gt;NULL Linked list after deleting head node 85--&gt;65--&gt;45--&gt;25--&gt;NULL Linked list after deleting last node 85--&gt;65--&gt;45--&gt;NULL </pre> <h3>Node Count</h3> <p>While traversing the linked list, the process of counting the number of nodes can be performed. In the preceding approach, we saw that if we needed to insert/delete a node or display the contents of the linked list, we had to traverse the linked list from the beginning.</p> <p>Setting a counter and incrementing as well as we traverse each node will provide us the number of nodes in the linked list.</p> <h3>Differences between Array and Linked list:</h3> <table class="table"> <tr> <th>Array</th> <th>Linked list</th> </tr> <tr> <td>Arrays have a defined size.</td> <td>The size of the linked list is variable.</td> </tr> <tr> <td>Inserting a new element is difficult.</td> <td>Insertion and deletion are simpler.</td> </tr> <tr> <td>Access is permitted at random.</td> <td>No random access is possible.</td> </tr> <tr> <td>Elements are in relatively close or contiguous.</td> <td>The elements are not contiguous.</td> </tr> <tr> <td>No additional room is required for the following pointer.</td> <td>The following pointer requires additional memory.</td> </tr> </table> <h3>Functionality</h3> <p>Since linked lists and arrays are both linear data structures that hold objects, they can be utilised in similar ways for the majority of applications.</p> <p>The following are some examples of linked list applications:</p> <ul> <li>Stacks and queues can be implemented using linked lists.</li> <li>When we need to express graphs as adjacency lists, we can use a linked list to implement them.</li> <li>We can also use a linked list to contain a mathematical polynomial.</li> <li>In the case of hashing, linked lists are employed to implement the buckets.</li> <li>When a programme requires dynamic memory allocation, we can utilize a linked list because linked lists are more efficient in this instance.</li> </ul> <h2>Conclusion</h2> <p>Linked lists are data structures used to hold data elements in a linear but non-contiguous form. A linked list is made up of nodes with two components each. The first component is made up of data, while the second half has a pointer that stores the memory address of the following member of the list.</p> <p>As a sign that the linked list has ended, the last item in the list has its next pointer set to NULL. The Head is the first item on the list. The linked list allows for a variety of actions such as insertion, deletion, traversal, and so on. Linked lists are favoured over arrays for dynamic memory allocation.</p> <p>Linked lists are hard to print or traverse because we can&apos;t access the elements randomly like arrays. When compared to arrays, insertion-deletion procedures are less expensive.</p> <p>In this tutorial, we learned everything there is to know about linear linked lists. Linked lists can also be doubly linked or circular. In our forthcoming tutorials, we will go through these lists in detail.</p> <hr></data>

Broj čvorova

Tijekom obilaska povezane liste može se izvršiti proces brojanja čvorova. U prethodnom pristupu vidjeli smo da ako trebamo umetnuti/izbrisati čvor ili prikazati sadržaj povezanog popisa, moramo proći povezani popis od početka.

Postavljanjem brojača i inkrementiranjem, kao i obilaženjem svakog čvora, dobit ćemo broj čvorova na povezanom popisu.

Razlike između polja i povezanog popisa:

Niz Povezani popis
Nizovi imaju definiranu veličinu. Veličina povezanog popisa je promjenjiva.
Umetanje novog elementa je teško. Umetanje i brisanje su jednostavniji.
Pristup je dopušten nasumično. Nasumični pristup nije moguć.
Elementi su relativno blizu ili susjedni. Elementi nisu susjedni.
Nije potrebna dodatna soba za sljedeći pokazivač. Sljedeći pokazivač zahtijeva dodatnu memoriju.

Funkcionalnost

Budući da su povezani popisi i nizovi linearne podatkovne strukture koje sadrže objekte, mogu se koristiti na sličan način za većinu aplikacija.

Slijedi nekoliko primjera aplikacija povezanih popisa:

  • Stogovi i redovi čekanja mogu se implementirati pomoću povezanih popisa.
  • Kada trebamo izraziti grafove kao popise susjedstva, možemo koristiti povezani popis da ih implementiramo.
  • Također možemo koristiti povezani popis da sadrži matematički polinom.
  • U slučaju raspršivanja, povezani popisi koriste se za implementaciju spremnika.
  • Kada program zahtijeva dinamičku dodjelu memorije, možemo upotrijebiti povezani popis jer su povezani popisi u ovom slučaju učinkovitiji.

Zaključak

Povezani popisi su podatkovne strukture koje se koriste za držanje podatkovnih elemenata u linearnom, ali nesusjednom obliku. Povezani popis sastoji se od čvorova sa po dvije komponente. Prvu komponentu čine podaci, dok druga polovica ima pokazivač koji pohranjuje memorijsku adresu sljedećeg člana liste.

Kao znak da je povezana lista završila, posljednja stavka na listi ima sljedeći pokazivač postavljen na NULL. Glava je prva stavka na popisu. Povezani popis omogućuje različite radnje kao što su umetanje, brisanje, obilaženje i tako dalje. Povezani popisi imaju prednost nad nizovima za dinamičku dodjelu memorije.

Povezane popise teško je ispisati ili preći jer elementima ne možemo pristupiti nasumično kao nizovima. U usporedbi s nizovima, postupci umetanja-brisanja su jeftiniji.

U ovom vodiču naučili smo sve što treba znati o linearno povezanim popisima. Povezane liste također mogu biti dvostruko povezane ili kružne. U našim nadolazećim tutorijalima detaljno ćemo proći kroz te popise.