Source code:
#include <stdio.h>
#define MAX 10
#define NULL_INDEX -1
struct Node {
int data;
int next;
};
struct Node node[MAX];
int head = NULL_INDEX;
int free_list = 0;
void initialize() {
for (int i = 0; i < MAX - 1; i++)
node[i].next = i + 1;
node[MAX - 1].next = NULL_INDEX;
}
int get_free_node() {
if (free_list == NULL_INDEX)
return NULL_INDEX;
int index = free_list;
free_list = node[free_list].next;
return index;
}
void free_node(int index) {
node[index].next = free_list;
free_list = index;
}
// Insert at beginning
void insert_beginning(int item) {
int new_node = get_free_node();
if (new_node == NULL_INDEX) {
printf("Overflow\n");
return;
}
node[new_node].data = item;
node[new_node].next = head;
head = new_node;
}
// Insert at end
void insert_end(int item) {
if (head == NULL_INDEX) {
insert_beginning(item);
return;
}
int new_node = get_free_node();
if (new_node == NULL_INDEX) {
printf("Overflow\n");
return;
}
node[new_node].data = item;
node[new_node].next = NULL_INDEX;
int temp = head;
while (node[temp].next != NULL_INDEX)
temp = node[temp].next;
node[temp].next = new_node;
}
// Insert after a specific element
void insert_after(int key, int item) {
int temp = head;
while (temp != NULL_INDEX && node[temp].data != key)
temp = node[temp].next;
if (temp == NULL_INDEX) {
printf("Element not found\n");
return;
}
int new_node = get_free_node();
if (new_node == NULL_INDEX) {
printf("Overflow\n");
return;
}
node[new_node].data = item;
node[new_node].next = node[temp].next;
node[temp].next = new_node;
}
// Delete from beginning
void delete_beginning() {
if (head == NULL_INDEX) {
printf("Underflow\n");
return;
}
int temp = head;
head = node[head].next;
free_node(temp);
}
// Delete from end
void delete_end() {
if (head == NULL_INDEX) {
printf("Underflow\n");
return;
}
if (node[head].next == NULL_INDEX) {
free_node(head);
head = NULL_INDEX;
return;
}
int temp = head;
while (node[node[temp].next].next != NULL_INDEX)
temp = node[temp].next;
int del = node[temp].next;
node[temp].next = NULL_INDEX;
free_node(del);
}
// Delete after a specific element
void delete_after(int key) {
int temp = head;
while (temp != NULL_INDEX && node[temp].data != key)
temp = node[temp].next;
if (temp == NULL_INDEX || node[temp].next == NULL_INDEX) {
printf("No node after given element\n");
return;
}
int del = node[temp].next;
node[temp].next = node[del].next;
free_node(del);
}
// Display list
void display() {
int temp = head;
printf("List: ");
while (temp != NULL_INDEX) {
printf("%d -> ", node[temp].data);
temp = node[temp].next;
}
printf("NULL\n");
}
int main() {
int choice, item, key;
initialize();
while (1) {
printf("\nMenu:\n");
printf("1. Insert at Beginning\n");
printf("2. Insert at End\n");
printf("3. Insert After Element\n");
printf("4. Delete from Beginning\n");
printf("5. Delete from End\n");
printf("6. Delete After Element\n");
printf("7. Display\n");
printf("8. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter item: ");
scanf("%d", &item);
insert_beginning(item);
break;
case 2:
printf("Enter item: ");
scanf("%d", &item);
insert_end(item);
break;
case 3:
printf("Enter element after which to insert: ");
scanf("%d", &key);
printf("Enter item: ");
scanf("%d", &item);
insert_after(key, item);
break;
case 4:
delete_beginning();
break;
case 5:
delete_end();
break;
case 6:
printf("Enter element after which to delete: ");
scanf("%d", &key);
delete_after(key);
break;
case 7:
display();
break;
case 8:
return 0;
default:
printf("Invalid choice\n");
}
}
}