256 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| //Write a menu driven program to perform the following on a doubly linked list
 | |
| //DS LAB MANUAL
 | |
| // i.) Insert an element at the rear end of the list
 | |
| // ii.) Delete an element from the rear end of the list
 | |
| // iii.) Insert an element at a given position of the list
 | |
| // iv.) Delete an element from a given position of the list
 | |
| // v.) Insert an element after another element
 | |
| // vi.) Insert an element before another element
 | |
| // vii.) Traverse the list
 | |
| // viii.) Reverse the list
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| struct Node {
 | |
|     int data;
 | |
|     struct Node* prev;
 | |
|     struct Node* next;
 | |
| };
 | |
| 
 | |
| struct Node* head = NULL;
 | |
| 
 | |
| void insertRear(int data) {
 | |
|     struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
 | |
|     newNode->data = data;
 | |
|     newNode->next = NULL;
 | |
| 
 | |
|     if (head == NULL) {
 | |
|         newNode->prev = NULL;
 | |
|         head = newNode;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     struct Node* temp = head;
 | |
|     while (temp->next != NULL)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     temp->next = newNode;
 | |
|     newNode->prev = temp;
 | |
| }
 | |
| 
 | |
| void deleteRear() {
 | |
|     if (head == NULL) {
 | |
|         printf("List is empty\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (head->next == NULL) {
 | |
|         free(head);
 | |
|         head = NULL;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     struct Node* temp = head;
 | |
|     while (temp->next != NULL)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     temp->prev->next = NULL;
 | |
|     free(temp);
 | |
| }
 | |
| 
 | |
| void insertPosition(int data, int position) {
 | |
|     struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
 | |
|     newNode->data = data;
 | |
| 
 | |
|     if (position == 1) {
 | |
|         newNode->prev = NULL;
 | |
|         newNode->next = head;
 | |
|         if (head != NULL)
 | |
|             head->prev = newNode;
 | |
|         head = newNode;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     struct Node* temp = head;
 | |
|     for (int i = 1; i < position - 1 && temp != NULL; i++)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     if (temp == NULL) {
 | |
|         printf("Position out of range\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     newNode->next = temp->next;
 | |
|     newNode->prev = temp;
 | |
|     if (temp->next != NULL)
 | |
|         temp->next->prev = newNode;
 | |
|     temp->next = newNode;
 | |
| }
 | |
| 
 | |
| void deletePosition(int position) {
 | |
|     if (head == NULL) {
 | |
|         printf("List is empty\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     struct Node* temp = head;
 | |
| 
 | |
|     if (position == 1) {
 | |
|         head = head->next;
 | |
|         if (head != NULL)
 | |
|             head->prev = NULL;
 | |
|         free(temp);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     for (int i = 1; i < position && temp != NULL; i++)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     if (temp == NULL) {
 | |
|         printf("Position out of range\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     temp->prev->next = temp->next;
 | |
|     if (temp->next != NULL)
 | |
|         temp->next->prev = temp->prev;
 | |
|     free(temp);
 | |
| }
 | |
| 
 | |
| void insertAfter(int data, int key) {
 | |
|     struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
 | |
|     newNode->data = data;
 | |
| 
 | |
|     struct Node* temp = head;
 | |
|     while (temp != NULL && temp->data != key)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     if (temp == NULL) {
 | |
|         printf("Key not found\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     newNode->next = temp->next;
 | |
|     newNode->prev = temp;
 | |
|     if (temp->next != NULL)
 | |
|         temp->next->prev = newNode;
 | |
|     temp->next = newNode;
 | |
| }
 | |
| 
 | |
| void insertBefore(int data, int key) {
 | |
|     struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
 | |
|     newNode->data = data;
 | |
| 
 | |
|     if (head == NULL) {
 | |
|         printf("List is empty\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (head->data == key) {
 | |
|         newNode->next = head;
 | |
|         newNode->prev = NULL;
 | |
|         head->prev = newNode;
 | |
|         head = newNode;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     struct Node* temp = head;
 | |
|     while (temp->next != NULL && temp->next->data != key)
 | |
|         temp = temp->next;
 | |
| 
 | |
|     if (temp->next == NULL) {
 | |
|         printf("Key not found\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     newNode->next = temp->next;
 | |
|     newNode->prev = temp;
 | |
|     temp->next->prev = newNode;
 | |
|     temp->next = newNode;
 | |
| }
 | |
| 
 | |
| void traverse() {
 | |
|     struct Node* temp = head;
 | |
|     while (temp != NULL) {
 | |
|         printf("%d ", temp->data);
 | |
|         temp = temp->next;
 | |
|     }
 | |
|     printf("\n");
 | |
| }
 | |
| 
 | |
| void reverse() {
 | |
|     struct Node* temp = NULL;
 | |
|     struct Node* current = head;
 | |
| 
 | |
|     while (current != NULL) {
 | |
|         temp = current->prev;
 | |
|         current->prev = current->next;
 | |
|         current->next = temp;
 | |
|         current = current->prev;
 | |
|     }
 | |
| 
 | |
|     if (temp != NULL)
 | |
|         head = temp->prev;
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     int choice, data, position, key;
 | |
| 
 | |
|     while (1) {
 | |
|         printf("\n1. Insert at rear\n2. Delete from rear\n3. Insert at position\n");
 | |
|         printf("4. Delete from position\n5. Insert after element\n6. Insert before element\n");
 | |
|         printf("7. Traverse\n8. Reverse\n9. Exit\n");
 | |
|         printf("Enter your choice: ");
 | |
|         scanf("%d", &choice);
 | |
| 
 | |
|         switch (choice) {
 | |
|             case 1:
 | |
|                 printf("Enter data to insert: ");
 | |
|                 scanf("%d", &data);
 | |
|                 insertRear(data);
 | |
|                 break;
 | |
|             case 2:
 | |
|                 deleteRear();
 | |
|                 break;
 | |
|             case 3:
 | |
|                 printf("Enter data to insert: ");
 | |
|                 scanf("%d", &data);
 | |
|                 printf("Enter position: ");
 | |
|                 scanf("%d", &position);
 | |
|                 insertPosition(data, position);
 | |
|                 break;
 | |
|             case 4:
 | |
|                 printf("Enter position to delete: ");
 | |
|                 scanf("%d", &position);
 | |
|                 deletePosition(position);
 | |
|                 break;
 | |
|             case 5:
 | |
|                 printf("Enter data to insert: ");
 | |
|                 scanf("%d", &data);
 | |
|                 printf("Enter element after which to insert: ");
 | |
|                 scanf("%d", &key);
 | |
|                 insertAfter(data, key);
 | |
|                 break;
 | |
|             case 6:
 | |
|                 printf("Enter data to insert: ");
 | |
|                 scanf("%d", &data);
 | |
|                 printf("Enter element before which to insert: ");
 | |
|                 scanf("%d", &key);
 | |
|                 insertBefore(data, key);
 | |
|                 break;
 | |
|             case 7:
 | |
|                 traverse();
 | |
|                 break;
 | |
|             case 8:
 | |
|                 reverse();
 | |
|                 break;
 | |
|             case 9:
 | |
|                 exit(0);
 | |
|             default:
 | |
|                 printf("Invalid choice\n");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | 
