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;
 | 
						|
}
 |