0% found this document useful (0 votes)
27 views

Singly Linked List

This document describes functions to implement a singly linked list data structure in C including functions to insert nodes at the beginning, end, or middle of the list; delete nodes from the beginning, end, or by key; display, traverse, and search the list. It provides a main function with a menu to test the linked list functions by adding, removing, and searching for nodes.

Uploaded by

singharijit2218
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
27 views

Singly Linked List

This document describes functions to implement a singly linked list data structure in C including functions to insert nodes at the beginning, end, or middle of the list; delete nodes from the beginning, end, or by key; display, traverse, and search the list. It provides a main function with a menu to test the linked list functions by adding, removing, and searching for nodes.

Uploaded by

singharijit2218
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

Experiment-3

Singly Linked List


#include <stdio.h>

#include <stdlib.h>

struct Node {

int data;

struct Node* next;

};

struct Node* insertAtBeginning(struct Node* head, int value) {

struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

newNode->data = value;

newNode->next = head;

head = newNode;

return head;

struct Node* insertAtEnd(struct Node* head, int value) {

struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

newNode->data = value;

newNode->next = NULL;
if (head == NULL) {

return newNode;

struct Node* current = head;

while (current->next != NULL) {

current = current->next;

current->next = newNode;

return head;

struct Node* insertInMiddle(struct Node* head, int key, int value) {

struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

newNode->data = value;

if (head == NULL) {

return newNode;

struct Node* current = head;

struct Node* previous = NULL;


while (current != NULL && current->data != key) {

previous = current;

current = current->next;

if (previous == NULL) {

newNode->next = head;

head = newNode;

} else {

newNode->next = current;

previous->next = newNode;

return head;

struct Node* deleteAtBeginning(struct Node* head) {

if (head == NULL) {

printf("List is empty. Cannot delete from the beginning.\n");

return NULL;

struct Node* temp = head;


head = head->next;

free(temp);

return head;

struct Node* deleteAtEnd(struct Node* head) {

if (head == NULL) {

printf("List is empty. Cannot delete from the end.\n");

return NULL;

if (head->next == NULL) {

free(head);

return NULL;

struct Node* current = head;

struct Node* previous = NULL;

while (current->next != NULL) {

previous = current;

current = current->next;

}
free(current);

previous->next = NULL;

return head;

struct Node* deleteInMiddle(struct Node* head, int key) {

if (head == NULL) {

printf("List is empty. Cannot delete from the middle.\n");

return NULL;

struct Node* current = head;

struct Node* previous = NULL;

while (current != NULL && current->data != key) {

previous = current;

current = current->next;

if (current == NULL) {

printf("Element %d not found in the list.\n", key);

return head;
}

if (previous == NULL) {

head = head->next;

} else {

previous->next = current->next;

free(current);

return head;

void display(struct Node* head) {

struct Node* current = head;

while (current != NULL) {

printf("%d -> ", current->data);

current = current->next;

printf("NULL\n");

void traverse(struct Node* head) {

struct Node* current = head;


while (current != NULL) {

printf("%d ", current->data);

current = current->next;

printf("\n");

int search(struct Node* head, int key) {

struct Node* current = head;

int position = 0;

while (current != NULL) {

if (current->data == key) {

return position;

current = current->next;

position++;

return -1;

int main() {
struct Node* head = NULL;

int choice, value, key, position;

do {

printf("\nMenu:\n");

printf("1. Insert at the Beginning\n");

printf("2. Insert at the End\n");

printf("3. Insert in the Middle\n");

printf("4. Delete at the Beginning\n");

printf("5. Delete at the End\n");

printf("6. Delete in the Middle\n");

printf("7. Display Linked List\n");

printf("8. Traverse Linked List\n");

printf("9. Search in Linked List\n");

printf("0. Exit\n");

printf("Enter your choice: ");

scanf("%d", &choice);

switch (choice) {

case 1:

printf("Enter the value to insert at the beginning: ");

scanf("%d", &value);

head = insertAtBeginning(head, value);


break;

case 2:

printf("Enter the value to insert at the end: ");

scanf("%d", &value);

head = insertAtEnd(head, value);

break;

case 3:

printf("Enter the key after which to insert in the middle: ");

scanf("%d", &key);

printf("Enter the value to insert in the middle: ");

scanf("%d", &value);

head = insertInMiddle(head, key, value);

break;

case 4:

head = deleteAtBeginning(head);

break;

case 5:

head = deleteAtEnd(head);

break;

case 6:

printf("Enter the key to delete in the middle: ");

scanf("%d", &key);

head = deleteInMiddle(head, key);

break;
case 7:

printf("Linked List: ");

display(head);

break;

case 8:

printf("Traversing Linked List: ");

traverse(head);

break;

case 9:

printf("Enter the element to search: ");

scanf("%d", &key);

position = search(head, key);

if (position != -1) {

printf("Element %d found at position %d\n", key, position);

} else {

printf("Element %d not found in the list\n", key);

break;

case 0:

printf("Exiting the program.\n");

break;

default:

printf("Invalid choice. Please enter a valid option.\n");

}
} while (choice != 0);

return 0;

You might also like