Day 4 of DSA in C
Write a menu driven C program to create a single linked list and perform the insertion, deletion and display functions on it.
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* head = NULL;
struct Node* createNode(int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
void insertAtBeginning(int value) {
struct Node* newNode = createNode(value);
newNode->next = head;
head = newNode;
printf("Inserted %d at the beginning.\n", value);
}
void insertAtEnd(int value) {
struct Node* newNode = createNode(value);
if (head == NULL) {
head = newNode;
} else {
struct Node* temp = head;
while (temp->next != NULL)
temp = temp->next;
temp->next = newNode;
}
printf("Inserted %d at the end.\n", value);
}
void insertAtPosition(int value, int pos) {
if (pos < 1) {
printf("Invalid position!\n");
return;
}
if (pos == 1) {
insertAtBeginning(value);
return;
}
struct Node* newNode = createNode(value);
struct Node* temp = head;
for (int i = 1; i < pos - 1 && temp != NULL; i++)
temp = temp->next;
if (temp == NULL) {
printf("Position out of range!\n");
free(newNode);
} else {
newNode->next = temp->next;
temp->next = newNode;
printf("Inserted %d at position %d.\n", value, pos);
}
}
void insertAfterKey(int key, int value) {
struct Node* temp = head;
while (temp != NULL && temp->data != key)
temp = temp->next;
if (temp == NULL) {
printf("Key %d not found!\n", key);
return;
}
struct Node* newNode = createNode(value);
newNode->next = temp->next;
temp->next = newNode;
printf("Inserted %d after key %d.\n", value, key);
}
void deleteBeginning() {
if (head == NULL) {
printf("List is empty!\n");
return;
}
struct Node* temp = head;
head = head->next;
printf("Deleted %d from beginning.\n", temp->data);
free(temp);
}
void deleteEnd() {
if (head == NULL) {
printf("List is empty!\n");
return;
}
if (head->next == NULL) {
printf("Deleted %d from end.\n", head->data);
free(head);
head = NULL;
return;
}
struct Node* temp = head;
while (temp->next->next != NULL)
temp = temp->next;
printf("Deleted %d from end.\n", temp->next->data);
free(temp->next);
temp->next = NULL;
}
void deletePosition(int pos) {
if (head == NULL) {
printf("List is empty!\n");
return;
}
if (pos < 1) {
printf("Invalid position!\n");
return;
}
if (pos == 1) {
deleteBeginning();
return;
}
struct Node* temp = head;
for (int i = 1; i < pos - 1 && temp != NULL; i++)
temp = temp->next;
if (temp == NULL || temp->next == NULL) {
printf("Position out of range!\n");
} else {
struct Node* del = temp->next;
temp->next = del->next;
printf("Deleted %d from position %d.\n", del->data, pos);
free(del);
}
}
void deleteByKey(int key) {
if (head == NULL) {
printf("List is empty!\n");
return;
}
if (head->data == key) {
struct Node* temp = head;
head = head->next;
printf("Deleted node with key %d.\n", key);
free(temp);
return;
}
struct Node* temp = head;
while (temp->next != NULL && temp->next->data != key)
temp = temp->next;
if (temp->next == NULL) {
printf("Key %d not found!\n", key);
} else {
struct Node* del = temp->next;
temp->next = del->next;
printf("Deleted node with key %d.\n", key);
free(del);
}
}
void display() {
if (head == NULL) {
printf("List is empty!\n");
return;
}
struct Node* temp = head;
printf("Linked List: ");
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
int choice, value, pos, key;
while (1) {
printf("\n---- MENU ----\n");
printf("1. Insert at Beginning\n");
printf("2. Insert at End\n");
printf("3. Insert at Position\n");
printf("4. Insert After a Key\n");
printf("5. Delete from Beginning\n");
printf("6. Delete from End\n");
printf("7. Delete from Position\n");
printf("8. Delete by Key\n");
printf("9. Display\n");
printf("10. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter value: ");
scanf("%d", &value);
insertAtBeginning(value);
break;
case 2:
printf("Enter value: ");
scanf("%d", &value);
insertAtEnd(value);
break;
case 3:
printf("Enter value and position: ");
scanf("%d %d", &value, &pos);
insertAtPosition(value, pos);
break;
case 4:
printf("Enter key and value: ");
scanf("%d %d", &key, &value);
insertAfterKey(key, value);
break;
case 5:
deleteBeginning();
break;
case 6:
deleteEnd();
break;
case 7:
printf("Enter position: ");
scanf("%d", &pos);
deletePosition(pos);
break;
case 8:
printf("Enter key: ");
scanf("%d", &key);
deleteByKey(key);
break;
case 9:
display();
break;
case 10:
printf("Exiting...\n");
exit(0);
default:
printf("Invalid choice! Try again.\n");
}
}
return 0;
}
Comments