A spojový seznam je druh lineární dynamické datové struktury, kterou používáme k ukládání datových prvků. Pole jsou také typem lineární datové struktury, kde jsou datové položky uloženy v souvislých paměťových blocích.
Na rozdíl od polí nemusí propojený seznam ukládat datové prvky v souvislých paměťových oblastech nebo blocích.
A spojový seznam se skládá z prvků známých jako 'Nodes', které jsou rozděleny do dvou částí. První komponenta je část, kde ukládáme skutečná data, a druhá je část, kde ukládáme ukazatel na další uzel. Tento typ struktury je známý jako „ jednotlivě propojený seznam .'
Propojený seznam v C++
Tento výukový program podrobně projde jednotlivě propojený seznam.
jak převést int na řetězec java
Struktura jednoduše propojeného seznamu je znázorněna na obrázku níže
- Jak jsme viděli ve výše uvedené části, první uzel propojeného seznamu se nazývá „hlava“, zatímco poslední uzel se nazývá „ocas“. Je to proto, že v posledním uzlu není zadána žádná adresa paměti, bude mít konečný uzel propojeného seznamu nulový další ukazatel.
- Protože každý uzel obsahuje ukazatel na další uzel, datové prvky v propojeném seznamu nemusí být uchovávány v souvislých umístěních. Uzly mohou být rozptýleny po celé paměti. Protože každý uzel má adresu toho následujícího, můžeme k uzlům přistupovat, kdykoli chceme.
- Můžeme rychle přidávat a odebírat datové položky z připojeného seznamu. V důsledku toho se může propojený seznam dynamicky zvětšovat nebo zmenšovat. Propojený seznam nemá žádné maximální množství datových položek, které může obsahovat. V důsledku toho můžeme do propojeného seznamu přidat libovolný počet datových položek, pokud je k dispozici RAM.
- Protože nemusíme předem specifikovat, kolik položek potřebujeme v propojeném seznamu, propojený seznam šetří místo v paměti a navíc se snadno vkládá a maže. Propojený seznam využívá pouze místo k uložení ukazatele na další uzel, což zvyšuje náklady.
Poté projdeme různé operace, které lze provést na propojeném seznamu.
1) Vložení
Propojený seznam se rozšíří přidáním do něj. Ačkoli by se to zdálo jednoduché, vzhledem ke struktuře propojeného seznamu víme, že pokaždé, když je přidána datová položka, musíme změnit další ukazatele předchozího a dalšího uzlů nové položky, kterou jsme přidali.
Kam bude nová datová položka vložena, je druhý aspekt, na který je třeba myslet.
Existují tři místa, kam lze přidat datovou položku do propojeného seznamu.
A. Počínaje propojeným seznamem
Níže je připojen seznam čísel 2->4->6->8->10. Hlavička směřující na uzel 2 bude nyní ukazovat na uzel 1 a další ukazatel na uzel 1 bude mít paměťovou adresu uzlu 2, jak je znázorněno na obrázku níže, pokud přidáme nový uzel 1 jako první uzel v seznamu. .
Výsledkem je, že nový propojený seznam je 1->2->4->6->8->10.
b. Po daném Node
V tomto případě dostaneme uzel a za něj musíme přidat nový uzel. Propojený seznam bude vypadat následovně, pokud uzel f přidáte do propojeného seznamu a->b->c->d->e za uzel c:
menu nastavení pro android
Zkontrolujeme proto, zda je zadaný uzel ve výše uvedeném diagramu přítomen. Pokud je přítomen, vytvoří se nový uzel f. Poté nasměrujeme další ukazatel uzlu c na zcela nový uzel f. Další ukazatel uzlu f nyní ukazuje na uzel d.
C. Poslední položka Linked List
Ve třetím případě se na konec propojeného seznamu přidá nový uzel. Vezměte v úvahu níže propojený seznam: a->b->c->d->e, s přidáním uzlu f na konci. Po přidání uzlu se propojený seznam zobrazí takto.
Výsledkem je vytvoření nového uzlu f. Koncový ukazatel vedoucí k null je pak nasměrován na f a další ukazatel uzlu f je nasměrován na null. V níže uvedeném programovacím jazyce jsme vygenerovali všechny tři typy funkcí vkládání.
rhel vs centos
Propojený seznam lze deklarovat jako strukturu nebo jako třídu v C++. Propojený seznam deklarovaný jako struktura je klasický příkaz ve stylu C. Propojený seznam se používá jako třída v moderním C++, hlavně při použití standardní knihovny šablon.
Struktura byla použita v následující aplikaci k deklaraci a generování propojeného seznamu. Jeho členy budou data a ukazatel na následující prvek.
Program C++:
#include using namespace std; struct Node { int data; struct Node *next; }; void push ( struct Node** head, int nodeData ) { struct Node* newNode1 = new Node; newNode1 -> data = nodeData; newNode1 -> next = (*head); (*head) = newNode1; } void insertAfter ( struct Node* prevNode, int nodeData ) { if ( prevNode == NULL ) { cout <data = nodedata; newnode1 -> next = prevNode -> next; prevNode -> next = newNode1; } void append ( struct Node** head, int nodeData ) { struct Node* newNode1 = new Node; struct Node *last = *head; newNode1 -> data = nodeData; newNode1 -> next = NULL; if ( *head == NULL ) { *head = newNode1; return; } while ( last -> next != NULL ) last = last -> next; last -> 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-->25-->55-->15-->45-->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'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's initial node and deleting the list's last node. We begin by adding nodes to the head of the list. The list'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 -> next; delete tempNode; return head; } Node* removingLastNode ( struct Node* head ) { if ( head == NULL ) return NULL; if ( head -> next == NULL ) { delete head; return NULL; } Node* secondLast = head; while ( secondLast -> next -> next != NULL ) secondLast = secondLast->next; delete ( secondLast -> next ); secondLast -> next = NULL; return head; } void push ( struct Node** head, int newData ) { struct Node* newNode1 = new Node; newNode1 -> data = newData; newNode1 -> next = ( *head ); ( *head ) = newNode1; } int main() { Node* head = NULL; push ( &head, 25 ); push ( &head, 45 ); push ( &head, 65); push ( &head, 85 ); push ( &head, 95 ); Node* temp; cout << 'Linked list created ' < 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-->85-->65-->45-->25-->NULL Linked list after deleting head node 85-->65-->45-->25-->NULL Linked list after deleting last node 85-->65-->45-->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'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) Vymazání
Podobně jako u vkládání vyžaduje odstranění uzlu z propojeného seznamu mnoho bodů, ze kterých by mohl být uzel odstraněn. První, poslední nebo k-tý uzel propojeného seznamu můžeme odstranit náhodně. Musíme správně aktualizovat další ukazatel a všechny ostatní ukazatele propojeného seznamu, aby byl propojený seznam zachován i po odstranění.
V následující implementaci C++ máme dvě metody odstranění: odstranění počátečního uzlu seznamu a odstranění posledního uzlu seznamu. Začneme přidáním uzlů na začátek seznamu. Po každém přidání a odstranění se pak zobrazí obsah seznamu.
Program C++:
#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 -> next; delete tempNode; return head; } Node* removingLastNode ( struct Node* head ) { if ( head == NULL ) return NULL; if ( head -> next == NULL ) { delete head; return NULL; } Node* secondLast = head; while ( secondLast -> next -> next != NULL ) secondLast = secondLast->next; delete ( secondLast -> next ); secondLast -> next = NULL; return head; } void push ( struct Node** head, int newData ) { struct Node* newNode1 = new Node; newNode1 -> data = newData; newNode1 -> next = ( *head ); ( *head ) = newNode1; } int main() { Node* head = NULL; push ( &head, 25 ); push ( &head, 45 ); push ( &head, 65); push ( &head, 85 ); push ( &head, 95 ); Node* temp; cout << 'Linked list created ' < 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-->85-->65-->45-->25-->NULL Linked list after deleting head node 85-->65-->45-->25-->NULL Linked list after deleting last node 85-->65-->45-->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'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>
Počet uzlů
Při procházení propojeného seznamu lze provést proces počítání počtu uzlů. V předchozím přístupu jsme viděli, že pokud jsme potřebovali vložit/smazat uzel nebo zobrazit obsah propojeného seznamu, museli jsme propojený seznam procházet od začátku.
Nastavení počítadla a inkrementace, stejně jako procházení každého uzlu, nám poskytne počet uzlů v propojeném seznamu.
Rozdíly mezi Array a Linked listem:
Pole | Spojový seznam |
---|---|
Pole mají definovanou velikost. | Velikost propojeného seznamu je variabilní. |
Vložení nového prvku je obtížné. | Vkládání a mazání je jednodušší. |
Přístup je povolen náhodně. | Žádný náhodný přístup není možný. |
Prvky jsou relativně blízko nebo sousedí. | Prvky nejsou souvislé. |
Pro následující ukazatel není potřeba žádný další prostor. | Následující ukazatel vyžaduje další paměť. |
Funkčnost
Vzhledem k tomu, že propojené seznamy a pole jsou lineární datové struktury, které obsahují objekty, lze je použít podobným způsobem pro většinu aplikací.
Následuje několik příkladů aplikací propojených seznamů:
c# datum a čas
- Zásobníky a fronty lze implementovat pomocí propojených seznamů.
- Když potřebujeme vyjádřit grafy jako seznamy sousedství, můžeme k jejich implementaci použít propojený seznam.
- Můžeme také použít propojený seznam, který obsahuje matematický polynom.
- V případě hašování se k implementaci segmentů používají propojené seznamy.
- Když program vyžaduje dynamické přidělování paměti, můžeme použít propojený seznam, protože propojené seznamy jsou v tomto případě efektivnější.
Závěr
Propojené seznamy jsou datové struktury používané k uchovávání datových prvků v lineární, ale nesouvislé formě. Propojený seznam se skládá z uzlů, z nichž každý má dvě složky. První komponenta je tvořena daty, zatímco druhá polovina má ukazatel, který ukládá paměťovou adresu následujícího člena seznamu.
Jako znamení, že propojený seznam skončil, má poslední položka v seznamu další ukazatel nastaven na hodnotu NULL. Hlava je první položkou na seznamu. Propojený seznam umožňuje různé akce, jako je vkládání, mazání, procházení a tak dále. Propojené seznamy jsou upřednostňovány před poli pro dynamické přidělování paměti.
Propojené seznamy se obtížně tisknou nebo procházejí, protože k prvkům nemůžeme přistupovat náhodně jako k polím. Ve srovnání s poli jsou postupy vkládání a mazání levnější.
V tomto tutoriálu jsme se naučili vše, co je třeba vědět o lineárních propojených seznamech. Propojené seznamy mohou být také dvojitě propojené nebo kruhové. V našich připravovaných tutoriálech si tyto seznamy podrobně projdeme.