logo

Dvojnásobne prepojený zoznam

Dvojito prepojený zoznam je komplexný typ prepojeného zoznamu, v ktorom uzol obsahuje ukazovateľ na predchádzajúci aj nasledujúci uzol v poradí. Preto sa v dvojito prepojenom zozname uzol skladá z troch častí: údaje uzla, ukazovateľ na nasledujúci uzol v poradí (ďalší ukazovateľ), ukazovateľ na predchádzajúci uzol (predchádzajúci ukazovateľ). Vzorový uzol v dvojito prepojenom zozname je znázornený na obrázku.


Dvojnásobne prepojený zoznam

Dvojito prepojený zoznam obsahujúci tri uzly s číslami od 1 do 3 vo svojej dátovej časti je znázornený na nasledujúcom obrázku.


Dvojnásobne prepojený zoznam

V C môže byť štruktúra uzla v dvojito prepojenom zozname uvedená ako:

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

The predch časť prvého uzla a Ďalšie časť posledného uzla bude vždy obsahovať nulu označujúcu koniec v každom smere.

V jednoducho prepojenom zozname sme mohli prechádzať iba jedným smerom, pretože každý uzol obsahuje adresu nasledujúceho uzla a nemá žiadne záznamy o svojich predchádzajúcich uzloch. Dvojité prepojené zoznamy však prekonávajú toto obmedzenie jednoducho prepojeného zoznamu. Vzhľadom na to, že každý uzol zoznamu obsahuje adresu svojho predchádzajúceho uzla, môžeme nájsť všetky podrobnosti aj o predchádzajúcom uzle pomocou predchádzajúcej adresy uloženej v predchádzajúcej časti každého uzla.

Pamäťová reprezentácia dvojito prepojeného zoznamu

Pamäťová reprezentácia dvojito prepojeného zoznamu je znázornená na nasledujúcom obrázku. Vo všeobecnosti dvojito prepojený zoznam zaberá viac miesta pre každý uzol, a preto spôsobuje rozsiahlejšie základné operácie, ako je vkladanie a mazanie. S prvkami zoznamu však môžeme ľahko manipulovať, pretože zoznam zachováva ukazovatele v oboch smeroch (dopredu aj dozadu).

Na nasledujúcom obrázku je prvý prvok zoznamu, t. j. 13 uložený na adrese 1. Hlavný ukazovateľ ukazuje na počiatočnú adresu 1. Keďže ide o prvý prvok, ktorý sa pridáva do zoznamu, predch zoznamu obsahuje nulový. Ďalší uzol zoznamu sa nachádza na adrese 4, preto prvý uzol obsahuje 4 vo svojom ďalšom ukazovateli.

Týmto spôsobom môžeme prechádzať zoznamom, kým nenájdeme akýkoľvek uzol obsahujúci null alebo -1 v jeho ďalšej časti.


Dvojnásobne prepojený zoznam

Operácie na dvojitom prepojenom zozname

Vytvorenie uzla

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

Všetky zostávajúce operácie týkajúce sa dvojito prepojeného zoznamu sú popísané v nasledujúcej tabuľke.

SN Prevádzka Popis
1 Vloženie na začiatok Pridanie uzla do prepojeného zoznamu na začiatku.
2 Vloženie na koniec Pridanie uzla do prepojeného zoznamu na koniec.
3 Vloženie za určený uzol Pridanie uzla do prepojeného zoznamu za zadaný uzol.
4 Vymazanie na začiatku Odstránenie uzla zo začiatku zoznamu
5 Vymazanie na konci Odstránenie uzla z konca zoznamu.
6 Vymazanie uzla s danými údajmi Odstránenie uzla, ktorý sa nachádza hneď za uzlom obsahujúcim dané údaje.
7 Hľadá sa Porovnanie údajov každého uzla s položkou, ktorá sa má vyhľadať, a vrátenie umiestnenia položky v zozname, ak položka nájdená inak, vráti hodnotu null.
8 Prechádzanie Návšteva každého uzla zoznamu aspoň raz s cieľom vykonať určitú špecifickú operáciu, ako je vyhľadávanie, triedenie, zobrazenie atď.

Program riadený menu v C na implementáciu všetkých operácií dvojito prepojeného zoznamu

 #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
'); } } } 

Výkon

 *********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..