257 lines
6.0 KiB
C
257 lines
6.0 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;
|
||
|
}
|