Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 26
2.
Doubly linked list
Doubly linked list is a complex type of linked list in which a node contains a pointer to the previous as well as the next node in the sequence. Therefore, in a doubly linked list, a node consists of three parts: node data, pointer to the next node in sequence (next pointer) , pointer to the previous node (previous pointer). A sample node in a doubly linked list is shown in the figure. /* Node of a doubly linked list */ struct Node { int data; struct Node* next; // Pointer to next node in DLL struct Node* prev; // Pointer to previous node in DLL };
struct Node *head, *newnode;
A sample node in a doubly linked list is shown in the figure.
A doubly linked list containing three nodes having numbers
from 1 to 3 in their data part, is shown in the following image. In C, structure of a node in doubly linked list can be given as : struct node { struct node *prev; int data; struct node *next; } The prev part of the first node and the next part of the last node will always contain null indicating end in each direction.
In a singly linked list, we could traverse only in one direction,
because each node contains address of the next node and it doesn't have any record of its previous nodes. However, doubly linked list overcome this limitation of singly linked list. Due to the fact that, each node of the list contains the address of its previous node, we can find all the details about the previous node as well by using the previous address stored inside the previous part of each node. Memory Representation of a doubly linked list Memory Representation of a doubly linked list is shown in the following image. Generally, doubly linked list consumes more space for every node and therefore, causes more expansive basic operations such as insertion and deletion. However, we can easily manipulate the elements of the list since the list maintains pointers in both the directions (forward and backward). In the following image, the first element of the list that is i.e. 13 stored at address 1. The head pointer points to the starting address 1. Since this is the first element being added to the list therefore the prev of the list contains null. The next node of the list resides at address 4 therefore the first node contains 4 in its next pointer. We can traverse the list in this way until we find any node containing null or -1 in its next part. Operations on doubly linked list Node Creation struct node { struct node *prev; int data; struct node *next; }; struct node *head; Insertion at Begining Allocate the space for the new node in the memory. This will be done by using the following statement. ptr = (struct node *)malloc(sizeof(struct node)); Check whether the list is empty or not. The list is empty if the condition head == NULL holds. In that case, the node will be inserted as the only node of the list and therefore the prev and the next pointer of the node will point to NULL and the head pointer will point to this node. ptr->next = NULL; ptr->prev=NULL; ptr->data=item; head=ptr; the condition head != NULL and the node will be inserted in beginning. The next pointer of the node will point to the existing head pointer of the node. The prev pointer of the existing head will point to the new node being inserted. ptr->next = head; head→prev=ptr; Since, the node being inserted is the first node of the list and therefore it must contain NULL in its prev pointer. Hence assign null to its previous part and make the head point to this node. ptr→prev =NULL head = ptr Insertion in doubly linked list at the end In order to insert a node in doubly linked list at the end, we must make sure whether the list is empty or it contains any element. Use the following steps in order to insert the node in doubly linked list at the end. 1. When head==NULL refer slide no: 8 2. The condition head != NULL then • new node will be inserted as the last node of the list. For this purpose, we have to traverse the whole list in order to reach the last node of the list. Initialize the pointer temp to head and traverse the list by using this pointer. temp = head; while (temp != NULL) { temp = temp → next; } the pointer temp point to the last node at the end of this while loop. Now, we just need to make a few pointer adjustments to insert the new node ptr to the list. 1.First, make the next pointer of temp point to the new node being inserted i.e. ptr. 2. make the previous pointer of the node ptr point to the existing last node of the list i.e. temp. 3. make the next pointer of the node ptr point to the null as it will be the new last node of the list. temp→next =ptr; ptr → prev = temp; ptr → next = NULL; Insertion in doubly linked list after Specified node In order to insert a node after the specified node in the list, we need to skip the required number of nodes in order to reach the mentioned node and then make the pointer adjustments as required. • Allocate the memory for the new node. ptr = (struct node *)malloc(sizeof(struct node)); • Traverse the list by using the pointer temp to skip the required number of nodes in order to reach the specified node. temp=head; for(i=0;i<loc;i++) { temp = temp->next; } The temp would point to the specified node at the end of the for loop. Then 1. Make the next pointer of ptr point to the next node of temp. 2. make the prev of the new node ptr point to temp. 3. Make the next pointer of temp point to the new node ptr. 4. make the previous pointer of the next node of temp point to the new node. ptr → next = temp → next; ptr → prev = temp; temp → next = ptr; temp → next → prev = ptr; Deletion at beginning Deletion in doubly linked list at the beginning is the simplest operation. We just need to copy the head pointer to pointer ptr and shift the head pointer to its next. ptr = head; head = head → next; now make the prev of this new head node point to NULL. head → prev = NULL Now free the pointer ptr by using the free function. free(ptr) Delete at end Deletion of the last node in a doubly linked list needs traversing the list in order to reach the last node of the list and then make pointer adjustments at that position. • If the list is already empty then the condition head == NULL will become true and therefore the operation can not be carried on. • If there is only one node in the list then the condition head → next == NULL become true. In this case, we just need to assign the head of the list to NULL and free head in order to completely delete the list. • Otherwise, just traverse the list to reach the last node of the list. This will be done by using the following statements. ptr = head; while(ptr->next != NULL) { ptr = ptr -> next; } The ptr would point to the last node of the is at the end of the for loop. Just make the next pointer of the previous node of ptr to NULL. ptr → prev → next = NULL free the pointer as this the node which is to be deleted. free(ptr) Deletion in doubly linked list after the specified node 1. Copy the head pointer into a temporary pointer temp. temp = head 2. Traverse the list until we find the desired data value. while(temp -> data != val) temp = temp -> next; 3. Check if the node which is to be deleted, is the last node of the list, if it so then we have to make the next pointer of this node point to null so that it can be the new last node of the list. if(temp -> next -> next == NULL) { temp ->next = NULL; } Otherwise, 4. make the pointer ptr point to the node which is to be deleted. 5. Make the next of temp point to the next of ptr. 6. Make the previous of next node of ptr point to temp. 7. free the ptr. ptr = temp -> next; temp -> next = ptr -> next; ptr -> next -> prev = temp; free(ptr); Traversing in doubly linked list 1. For this purpose, copy the head pointer in any of the temporary pointer ptr. ptr = head 2. then, traverse through the list by using while loop. Keep shifting value of pointer variable ptr until we find the last node. The last node contains null in its next part. while(ptr != NULL) { printf("%d\n",ptr->data); ptr=ptr->next; } Thank you
Applied Longitudinal Data Analysis for Medical Science: A Practical Guide 3rd Edition Twisk - Download the ebook in PDF with all chapters to read anytime