Why Linked list
When a program needs to smoothly handle dynamic operations like adding, updating, and removing data-linked lists with a good solution at that time. It provides a flexible way to manage information, making it easier to insert, update, or delete data elements in our program.
Structure of a Linked list
Components of Linked List
struct Node { int data; struct Node* next; };
Insert in Linked List
// Create a new node struct Node* newNode = malloc(sizeof(struct Node)); newNode->data = newData; // Update pointers newNode->next = head; head = newNode;
Insert in the middle
// Create a new node struct Node* newNode = malloc(sizeof(struct Node)); newNode->data = newData; // Update pointers newNode->next = temp->next; temp->next = newNode;
Insert in the end
struct Node* newNode = malloc(sizeof(struct Node)); newNode->data = newData; newNode->next = NULL; // Update pointers if (head == NULL) { head = newNode; } else { struct Node* temp = head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; }
Linked List Traverse
struct Node* current = head; while (current != NULL) { // Access data at the current node printf("%d -> ", current->data); // Move to the next node current = current->next; }
Real life example of Linked list
#include <stdio.h> #include <stdlib.h> #include <string.h> // Node structure for the linked list struct Task { int taskID; char description[100]; struct Task* next; }; // Function to add a new task to the to-do list struct Task* insertTask(struct Task* head, int id, const char* desc) { // Allocate memory for the new task struct Task* newTask = (struct Task*)malloc(sizeof(struct Task)); // Set the task details newTask->taskID = id; strncpy(newTask->description, desc, sizeof(newTask->description)); newTask->next = NULL; // If the list is empty, make the new task the head if (head == NULL) { head = newTask; } else { // Otherwise, add the new task to the end of the list struct Task* current = head; while (current->next != NULL) { current = current->next; } current->next = newTask; } return head; } // Function to traverse and display the to-do list void traverseToDoList(struct Task* head) { if (head == NULL) { printf("To-Do List is empty.\n"); return; } // Initialize a pointer to the head of the list struct Task* current = head; // Iterate through the tasks while (current != NULL) { // Display task details printf("Task %d: %s\n", current->taskID, current->description); // Move to the next task current = current->next; } } // Function to remove a task from the to-do list struct Task* deleteTask(struct Task* head, int id) { // If the list is empty, nothing to delete if (head == NULL) { printf("To-Do List is empty. Cannot delete.\n"); return head; } // If the task to be deleted is the head if (head->taskID == id) { struct Task* newHead = head->next; free(head); return newHead; } // Search for the task to be deleted struct Task* current = head; struct Task* previous = NULL; while (current != NULL && current->taskID != id) { previous = current; current = current->next; } // If the task is not found if (current == NULL) { printf("Task %d not found. Cannot delete.\n", id); return head; } // Remove the task from the list previous->next = current->next; free(current); return head; } int main() { // Initialize an empty to-do list struct Task* toDoList = NULL; // Insert tasks toDoList = insertTask(toDoList, 1, "Complete assignment"); toDoList = insertTask(toDoList, 2, "Buy groceries"); toDoList = insertTask(toDoList, 3, "Attend meeting"); // Display the to-do list printf("Initial To-Do List:\n"); traverseToDoList(toDoList); // Delete a task toDoList = deleteTask(toDoList, 2); // Display the updated to-do list printf("\nUpdated To-Do List after deletion:\n"); traverseToDoList(toDoList); return 0; }
This is just the beginning of the Linked list.
If you need more examples and detailed learning, deleting, and many more Please go through this article with many practical examples and learning - https://devsenv.com/tutorials/linked-list
Top comments (0)