logo

Dvigubai susietas sąrašas

Dvigubai susietas sąrašas yra sudėtingas susieto sąrašo tipas, kuriame mazge yra rodyklė į ankstesnį ir kitą sekos mazgą. Todėl dvigubai susietame sąraše mazgas susideda iš trijų dalių: mazgo duomenų, rodyklės į kitą iš eilės mazgą (kitas žymeklis) , žymeklis į ankstesnį mazgą (ankstesnis rodyklė). Pavyzdinis mazgas dvigubai susietame sąraše parodytas paveikslėlyje.


Dvigubai susietas sąrašas

Dvigubai susietas sąrašas, kuriame yra trys mazgai, kurių duomenų dalyje yra skaičiai nuo 1 iki 3, parodytas kitame paveikslėlyje.


Dvigubai susietas sąrašas

C kalboje mazgo struktūra dvigubai susietame sąraše gali būti pateikta kaip:

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

The ankstesnė pirmojo mazgo dalis ir Kitas paskutinio mazgo dalyje visada bus nulis, nurodantis pabaigą kiekviena kryptimi.

Atskirai susietame sąraše galėtume eiti tik viena kryptimi, nes kiekviename mazge yra kito mazgo adresas ir jame nėra ankstesnių mazgų įrašų. Tačiau dvigubai susietas sąrašas įveikia šį atskirai susieto sąrašo apribojimą. Dėl to, kad kiekviename sąrašo mazge yra ankstesnio mazgo adresas, galime rasti visą informaciją apie ankstesnį mazgą, naudodami ankstesnį adresą, saugomą ankstesnėje kiekvieno mazgo dalyje.

Atmintis Dvigubai susieto sąrašo vaizdavimas

Atmintis Dvigubai susieto sąrašo atvaizdas parodytas kitame paveikslėlyje. Paprastai dvigubai susietas sąrašas užima daugiau vietos kiekvienam mazgui, todėl atliekamos platesnės pagrindinės operacijos, tokios kaip įterpimas ir ištrynimas. Tačiau galime lengvai manipuliuoti sąrašo elementais, nes sąraše išlaikomos rodyklės abiem kryptimis (pirmyn ir atgal).

Toliau pateiktame paveikslėlyje pirmasis sąrašo elementas, t. y. 13, saugomas 1 adresu. Antraštės žymeklis nurodo pradinį adresą 1. Kadangi tai yra pirmasis elementas, įtrauktas į sąrašą, todėl ankstesnė sąrašo yra nulinis. Kitas sąrašo mazgas yra adresu 4, todėl pirmojo mazgo kitame žymeklyje yra 4.

Galime pereiti sąrašą tokiu būdu, kol kitoje jo dalyje rasime bet kurį mazgą, kuriame yra nulis arba -1.


Dvigubai susietas sąrašas

Operacijos dvigubai susietame sąraše

Mazgo kūrimas

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

Visos likusios operacijos, susijusios su dvigubai susietu sąrašu, aprašytos šioje lentelėje.

SN Operacija apibūdinimas
1 Įterpimas pradžioje Mazgo įtraukimas į susietą sąrašą pradžioje.
2 Įterpimas gale Mazgo įtraukimas į susietą sąrašą iki galo.
3 Įterpimas po nurodyto mazgo Mazgo įtraukimas į susietą sąrašą po nurodyto mazgo.
4 Ištrynimas pradžioje Mazgo pašalinimas iš sąrašo pradžios
5 Ištrynimas pabaigoje Mazgo pašalinimas iš sąrašo pabaigos.
6 Duomenis pateikusio mazgo ištrynimas Pašalinamas mazgas, esantis iškart po mazgo, kuriame yra nurodyti duomenys.
7 Ieškoma Palyginus kiekvieno mazgo duomenis su ieškomu elementu ir grąžinus elemento vietą sąraše, jei rastas elementas kitaip, grąžina nulį.
8 Traversavimas Bent kartą apsilankykite kiekviename sąrašo mazge, kad atliktumėte tam tikrą operaciją, pvz., paiešką, rūšiavimą, rodymą ir kt.

Meniu valdoma programa C, kad įgyvendintų visas dvigubai susieto sąrašo operacijas

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

Išvestis

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