logo

Dvojno vezan seznam

Dvojno povezani seznam je zapletena vrsta povezanega seznama, v katerem vozlišče vsebuje kazalec na prejšnje in naslednje vozlišče v zaporedju. Zato je na dvojno povezanem seznamu vozlišče sestavljeno iz treh delov: podatkov o vozlišču, kazalca na naslednje vozlišče v zaporedju (naslednji kazalec) , kazalca na prejšnje vozlišče (prejšnji kazalec). Vzorčno vozlišče v dvojno povezanem seznamu je prikazano na sliki.


Dvojno vezan seznam

Dvojno povezan seznam, ki vsebuje tri vozlišča s številkami od 1 do 3 v svojem podatkovnem delu, je prikazan na naslednji sliki.


Dvojno vezan seznam

V C je struktura vozlišča na dvojno povezanem seznamu lahko podana kot:

 struct node { struct node *prev; int data; struct node *next; } 

The prev del prvega vozlišča in Naslednji del zadnjega vozlišča bo vedno vseboval nič, ki označuje konec v vsaki smeri.

V enojno povezanem seznamu bi lahko prečkali samo eno smer, ker vsako vozlišče vsebuje naslov naslednjega vozlišča in nima nobenega zapisa svojih prejšnjih vozlišč. Vendar dvojno povezani seznam preseže to omejitev enojno povezanega seznama. Ker vsako vozlišče seznama vsebuje naslov prejšnjega vozlišča, lahko najdemo vse podrobnosti o prejšnjem vozlišču tudi z uporabo prejšnjega naslova, shranjenega v prejšnjem delu vsakega vozlišča.

Predstavitev spomina dvojno povezanega seznama

Predstavitev pomnilnika dvojno povezanega seznama je prikazana na naslednji sliki. Na splošno dvojno povezani seznam porabi več prostora za vsako vozlišče in zato povzroči obsežnejše osnovne operacije, kot sta vstavljanje in brisanje. Vendar pa lahko enostavno manipuliramo z elementi seznama, saj seznam ohranja kazalce v obe smeri (naprej in nazaj).

Na naslednji sliki je prvi element seznama, tj. 13, shranjen na naslovu 1. Glavni kazalec kaže na začetni naslov 1. Ker je to prvi element, ki je dodan na seznam, je prev seznama vsebuje nič. Naslednje vozlišče seznama se nahaja na naslovu 4, zato prvo vozlišče vsebuje 4 v naslednjem kazalcu.

Na ta način lahko prečkamo seznam, dokler ne najdemo vozlišča, ki v svojem naslednjem delu vsebuje nič ali -1.


Dvojno vezan seznam

Operacije na dvojno povezanem seznamu

Ustvarjanje vozlišča

 struct node { struct node *prev; int data; struct node *next; }; struct node *head; 

Vse preostale operacije glede dvojno povezanega seznama so opisane v naslednji tabeli.

SN Delovanje Opis
1 Vstavljanje na začetku Dodajanje vozlišča na povezani seznam na začetku.
2 Vložek na koncu Dodajanje vozlišča v povezani seznam do konca.
3 Vstavljanje po določenem vozlišču Dodajanje vozlišča na povezani seznam za navedenim vozliščem.
4 Izbris na začetku Odstranjevanje vozlišča z začetka seznama
5 Izbris na koncu Odstranjevanje vozlišča s konca seznama.
6 Izbris vozlišča, ki je dalo podatke Odstranjevanje vozlišča, ki je prisotno takoj za vozliščem, ki vsebuje dane podatke.
7 Iskanje Primerjava podatkov vsakega vozlišča z elementom, ki ga je treba preiskati, in vrnitev lokacije elementa na seznamu, če najdeni element sicer vrne nič.
8 Prečenje Vsako vozlišče seznama obiščete vsaj enkrat, da izvedete določeno operacijo, kot je iskanje, razvrščanje, prikaz itd.

Menijski program v C za izvajanje vseh operacij dvojno povezanega seznama

 #include #include struct node { struct node *prev; struct node *next; int data; }; struct node *head; void insertion_beginning(); void insertion_last(); void insertion_specified(); void deletion_beginning(); void deletion_last(); void deletion_specified(); void display(); void search(); void main () { int choice =0; while(choice != 9) { printf('
*********Main Menu*********
'); printf('
Choose one option from the following list ...
'); printf('
===============================================
'); printf('
1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
 5.Delete from last
6.Delete the node after the given data
7.Search
8.Show
9.Exit
'); printf('
Enter your choice?
'); scanf('
%d',&choice); switch(choice) { case 1: insertion_beginning(); break; case 2: insertion_last(); break; case 3: insertion_specified(); break; case 4: deletion_beginning(); break; case 5: deletion_last(); break; case 6: deletion_specified(); break; case 7: search(); break; case 8: display(); break; case 9: exit(0); break; default: printf('Please enter valid choice..'); } } } void insertion_beginning() { struct node *ptr; int item; ptr = (struct node *)malloc(sizeof(struct node)); if(ptr == NULL) { printf('
OVERFLOW'); } else { printf('
Enter Item value'); scanf('%d',&item); if(head==NULL) { ptr->next = NULL; ptr->prev=NULL; ptr->data=item; head=ptr; } else { ptr->data=item; ptr->prev=NULL; ptr->next = head; head->prev=ptr; head=ptr; } printf('
Node inserted
'); } } void insertion_last() { struct node *ptr,*temp; int item; ptr = (struct node *) malloc(sizeof(struct node)); if(ptr == NULL) { printf('
OVERFLOW'); } else { printf('
Enter value'); scanf('%d',&item); ptr->data=item; if(head == NULL) { ptr->next = NULL; ptr->prev = NULL; head = ptr; } else { temp = head; while(temp->next!=NULL) { temp = temp->next; } temp->next = ptr; ptr ->prev=temp; ptr->next = NULL; } } printf('
node inserted
'); } void insertion_specified() { struct node *ptr,*temp; int item,loc,i; ptr = (struct node *)malloc(sizeof(struct node)); if(ptr == NULL) { printf('
 OVERFLOW'); } else { temp=head; printf('Enter the location'); scanf('%d',&loc); for(i=0;inext; if(temp == NULL) { printf('
 There are less than %d elements', loc); return; } } printf('Enter value'); scanf('%d',&item); ptr->data = item; ptr->next = temp->next; ptr -> prev = temp; temp->next = ptr; temp->next->prev=ptr; printf('
node inserted
'); } } void deletion_beginning() { struct node *ptr; if(head == NULL) { printf('
 UNDERFLOW'); } else if(head->next == NULL) { head = NULL; free(head); printf('
node deleted
'); } else { ptr = head; head = head -> next; head -> prev = NULL; free(ptr); printf('
node deleted
'); } } void deletion_last() { struct node *ptr; if(head == NULL) { printf('
 UNDERFLOW'); } else if(head->next == NULL) { head = NULL; free(head); printf('
node deleted
'); } else { ptr = head; if(ptr->next != NULL) { ptr = ptr -> next; } ptr -> prev -> next = NULL; free(ptr); printf('
node deleted
'); } } void deletion_specified() { struct node *ptr, *temp; int val; printf('
 Enter the data after which the node is to be deleted : '); scanf('%d', &val); ptr = head; while(ptr -> data != val) ptr = ptr -> next; if(ptr -> next == NULL) { printf('
Can't delete
'); } else if(ptr -> next -> next == NULL) { ptr ->next = NULL; } else { temp = ptr -> next; ptr -> next = temp -> next; temp -> next -> prev = ptr; free(temp); printf('
node deleted
'); } } void display() { struct node *ptr; printf('
 printing values...
'); ptr = head; while(ptr != NULL) { printf('%d
',ptr->data); ptr=ptr->next; } } void search() { struct node *ptr; int item,i=0,flag; ptr = head; if(ptr == NULL) { printf('
Empty List
'); } else { printf('
Enter item which you want to search?
'); scanf('%d',&item); while (ptr!=NULL) { if(ptr->data == item) { printf('
item found at location %d ',i+1); flag=0; break; } else { flag=1; } i++; ptr = ptr -> next; } if(flag==1) { printf('
Item not found
'); } } } 

Izhod

 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 8 printing values... *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 1 Enter Item value12 Node inserted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 1 Enter Item value123 Node inserted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 1 Enter Item value1234 Node inserted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 8 printing values... 1234 123 12 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 2 Enter value89 node inserted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 3 Enter the location1 Enter value12345 node inserted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 8 printing values... 1234 123 12345 12 89 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 4 node deleted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 5 node deleted *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 8 printing values... 123 12345 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 6 Enter the data after which the node is to be deleted : 123 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 8 printing values... 123 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 7 Enter item which you want to search? 123 item found at location 1 *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 6 Enter the data after which the node is to be deleted : 123 Can't delete *********Main Menu********* Choose one option from the following list ... =============================================== 1.Insert in begining 2.Insert at last 3.Insert at any random location 4.Delete from Beginning 5.Delete from last 6.Delete the node after the given data 7.Search 8.Show 9.Exit Enter your choice? 9 Exited..