//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 #include 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; }