Dvojitě propojený seznam je komplexní typ propojeného seznamu, ve kterém uzel obsahuje ukazatel na předchozí i další uzel v sekvenci. V dvojitě propojeném seznamu se proto uzel skládá ze tří částí: data uzlu, ukazatel na další uzel v pořadí (další ukazatel) , ukazatel na předchozí uzel (předchozí ukazatel). Vzorový uzel ve dvojitě propojeném seznamu je znázorněn na obrázku.
Dvojitě propojený seznam obsahující tři uzly s čísly od 1 do 3 ve své datové části je znázorněn na následujícím obrázku.
V C může být struktura uzlu ve dvojitě propojeném seznamu uvedena jako:
struct node { struct node *prev; int data; struct node *next; }
The předchozí část prvního uzlu a další část posledního uzlu bude vždy obsahovat nulu označující konec v každém směru.
V jednoduše propojeném seznamu jsme mohli procházet pouze jedním směrem, protože každý uzel obsahuje adresu dalšího uzlu a ten nemá žádný záznam o svých předchozích uzlech. Dvojitě propojený seznam však překonává toto omezení jednoduše propojeného seznamu. Vzhledem k tomu, že každý uzel seznamu obsahuje adresu svého předchozího uzlu, můžeme najít všechny podrobnosti o předchozím uzlu také pomocí předchozí adresy uložené v předchozí části každého uzlu.
Paměťová reprezentace dvojitě propojeného seznamu
Paměťová reprezentace dvojitě propojeného seznamu je zobrazena na následujícím obrázku. Obecně platí, že dvojitě propojený seznam spotřebovává více místa pro každý uzel, a proto způsobuje rozsáhlejší základní operace, jako je vkládání a mazání. S prvky seznamu však můžeme snadno manipulovat, protože seznam udržuje ukazatele v obou směrech (dopředu i dozadu).
Na následujícím obrázku je první prvek seznamu, tj. 13 uložený na adrese 1. Ukazatel záhlaví ukazuje na počáteční adresu 1. Protože se jedná o první prvek přidávaný do seznamu, předchozí seznamu obsahuje nula. Další uzel seznamu se nachází na adrese 4, proto první uzel obsahuje 4 ve svém dalším ukazateli.
Tímto způsobem můžeme procházet seznamem, dokud nenajdeme v další části jakýkoli uzel obsahující null nebo -1.
Operace na dvojitě propojeném seznamu
Vytvoření uzlu
struct node { struct node *prev; int data; struct node *next; }; struct node *head;
Všechny zbývající operace týkající se dvojitě propojeného seznamu jsou popsány v následující tabulce.
SN | Úkon | Popis |
---|---|---|
1 | Vložení na začátku | Přidání uzlu do propojeného seznamu na začátku. |
2 | Vložení na konec | Přidání uzlu do propojeného seznamu na konec. |
3 | Vložení za zadaný uzel | Přidání uzlu do propojeného seznamu za zadaný uzel. |
4 | Smazání na začátku | Odstranění uzlu ze začátku seznamu |
5 | Smazání na konci | Odebrání uzlu z konce seznamu. |
6 | Odstranění uzlu s danými daty | Odstranění uzlu, který je přítomen hned za uzlem obsahujícím daná data. |
7 | Hledání | Porovnání dat každého uzlu s položkou, která má být prohledána, a vrácení umístění položky v seznamu, pokud položka nalezená jinak vrátí hodnotu null. |
8 | Procházení | Návštěva každého uzlu seznamu alespoň jednou za účelem provedení určité operace, jako je vyhledávání, řazení, zobrazení atd. |
Program řízený menu v C pro implementaci všech operací dvojitě propojeného seznamu
#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ýstup
*********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..