top of page
Writer's pictureStrofl

What is Linked List Data Structure?- Qpidi

Welcome to the world of C linked lists, learn how to create, manage, and traverse nodes in a our guide!


Linked List
Linked List

What is Linked List Data Structure?

A linked list in C is a fundamental data structure that is used to store a sequence of elements. It is a collection of nodes, where each node contains data and a pointer to the next node in the sequence. Unlike arrays, linked lists are dynamic, and their size can grow or shrink during the execution of a program. Here's a step-by-step explanation of how linked lists work in C


Step 1. Define the Node Structure

First, you need to define the structure of a node. A node typically contains at least two parts: the data section (which holds the value) and a pointer to the next node.


Step 1. Example Code

Here, we present a simple structure definition for a node in a linked list.


typedef struct node {
    int data;           // The data part
    struct node *next;  // Pointer to the next node
} Node;

Step 1. Code Explanation

Following the code explanation, we understand how to define a node for use in a linked list, focusing on the essential components that make up the node structure.


  • typedef struct node: This line starts the definition of a new data type that is a structure. typedef is used to create an alias (Node) for easier reference to this struct type later on.

  • int data;: Inside the structure, data is declared as an int. This is the part of the node that actually holds the value.

  • struct node *next;: This declares a pointer named next of type struct node. This pointer is used to link this node to the next node in the list. If this node is the last one in the list, next will be NULL.


Step 2. Create a New Node

To add elements to the linked list, you first need to create new nodes. Here's a function that creates a new node with a given value and returns a pointer to it.


Step 2. Example Code

This segment details a function that dynamically allocates memory for a new node, initializes its value, and sets the next pointer to NULL, indicating the end of the list or readiness for linking.


Node* createNode(int value) {
    Node* newNode = (Node*) malloc(sizeof(Node)); // Allocate memory for the new node
    if (newNode == NULL) { // Check if memory allocation was successful
        exit(1); // Exit if memory allocation fails
    }
    newNode->data = value; // Set the data part of the node
    newNode->next = NULL;  // Initially, this node does not point to any other node
    return newNode;
}

Step 2. Code Explanation

Here we explore how to dynamically allocate and initialize a node, a fundamental operation for building and expanding linked lists.



  • Node* createNode(int value) {: Defines a function createNode that takes an integer value as input and returns a pointer to a newly created Node.

  • Node* newNode = (Node*) malloc(sizeof(Node));: Allocates memory for a new node of size Node using malloc and casts the returned pointer to (Node*). The variable newNode will point to this new memory.

  • if (newNode == NULL) {: Checks if malloc failed to allocate memory (which would result in newNode being NULL).

  • exit(1);: If memory allocation fails, the program exits with an error code 1.

  • newNode->data = value;: Sets the data field of the new node to the specified value.

  • newNode->next = NULL;: Initializes the next pointer of the new node to NULL, indicating that it does not yet link to another node.

  • return newNode;: Returns a pointer to the newly created node.


Step 3. Inserting a Node

There are several ways to insert a new node into a linked list, such as at the beginning, at the end, or after a specific node. Here's a simple example of inserting a node at the beginning of the list:


Step 3. Example Code

This part illustrates a straightforward function for inserting a new node at the beginning of the linked list.


void insertAtBeginning(Node** head, int value) {
    Node* newNode = createNode(value); // Create a new node
    newNode->next = *head; // Point the new node to the current first node of the list
    *head = newNode;       // Update the head to point to the new node
}

Step 3. Code Explanation

Now, we delve into how to insert a new node at the beginning of the list, demonstrating the manipulation of pointers to integrate new elements seamlessly.



  • void insertAtBeginning(Node** head, int value) {: Defines a function to insert a new node at the beginning of the list. It takes a double pointer to the head of the list (Node** head) and an integer value.

  • Node* newNode = createNode(value);: Creates a new node with the given value.

  • newNode->next = *head;: Sets the next pointer of the new node to point to the current head of the list, effectively placing it at the beginning.

  • *head = newNode;: Updates the head pointer to point to the new node, making it the new head of the list.


Step 4. Traversing the List

To display or operate on the elements of a linked list, you need to traverse it. Here's how you can traverse a linked list and print its elements:


Step 4. Example Code

A function is shown here for traversing a linked list and printing the data of each node, illustrating the sequential access pattern inherent to linked lists.


void printList(Node* head) {
    Node* temp = head; // Temporary pointer to iterate through the list
    while(temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next; // Move to the next node
    }
    printf("NULL\n"); // Mark the end of the list
}

Step 4. Code Explanation

Next, we examine the method for traversing a linked list, highlighting how to access and display the data contained in each node.



  • void printList(Node* head) {: Defines a function that takes a pointer to the head of the list and prints each element in the list.

  • Node* temp = head;: Creates a temporary pointer to traverse the list, starting from the head.

  • while(temp != NULL) {: Iterates over the list until the end is reached (temp becomes NULL).

  • printf("%d -> ", temp->data);: Prints the data of the current node followed by an arrow.

  • temp = temp->next;: Moves the temporary pointer to the next node in the list.

  • printf("NULL\n");: After reaching the end of the list, prints "NULL" to indicate the end of the list.


Step 5. Deleting a Node

To remove a node from the list, you must adjust the pointers so that the node is excluded from the chain. Here's an example of deleting the first node:

Step 5. Example Code

Here, we describe a method for removing the first node from a linked list, a common operation that involves special consideration of the list's head.


void deleteFirstNode(Node** head) {
    if (*head == NULL) return; // Check if the list is empty
    Node* temp = *head;        // Temporary pointer to the first node
    *head = (*head)->next;     // Update the head to point to the second node
    free(temp);                // Free the memory of the original first node
}

Step 5. Code Explanation

Following this, we look into how to remove a node from a linked list, specifically focusing on the first node, and the importance of proper pointer management and memory freeing techniques.


Step 5. Deleting a Node
Step 5. Deleting a Node

  • void deleteFirstNode(Node** head) {: Defines a function to delete the first node from the list.

  • if (*head == NULL) return;: Checks if the list is empty. If it is, the function returns immediately without doing anything.

  • Node* temp = *head;: Stores the current head node in a temporary variable.

  • head = (head)->next;: Updates the head pointer to point to the second node, effectively removing the first node from the list.

  • free(temp);: Frees the memory allocated for the removed node to avoid memory leaks.


Step 6. Freeing the List

Finally, when you're done with the linked list, you should free the allocated memory to prevent memory leaks.


Step 6. Example Code

A function is provided to systematically free the memory of each node in the linked list, thereby preventing memory leaks and ensuring efficient resource use.


void freeList(Node** head) {
    Node* temp;
    while (*head != NULL) {
        temp = *head;
        *head = (*head)->next; // Move head to the next node
        free(temp);            // Free the current node
    }
}

Step 6. Code Explanation

Finally, we cover the critical task of freeing the entire linked list, detailing the process of releasing memory back to the system to maintain efficient and effective resource use.



  • void freeList(Node** head) {: Defines a function to free the entire list.

  • Node* temp;: Declares a temporary pointer.

  • while (*head != NULL) {: Iterates over the list as long as there are nodes left.

  • temp = *head;: Temporarily stores the current head node in temp.

  • head = (head)->next;: Updates the head pointer to the next node, effectively moving along the list.

  • free(temp);: Frees the memory for the node stored in temp.

 

Through these steps and explanations, the operation and management of linked lists in C are clarified, illustrating their utility and efficiency in dynamic data handling.

8 views0 comments

Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
bottom of page