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