Skip to main content

Linked List | Set 1 (Introduction)

 

Linked List | Set 1 (Introduction)

Like arrays, Linked List is a linear data structure. Unlike arrays, linked list elements are not stored at a contiguous location; the elements are linked using pointers.

linkedlist

Why Linked List?
Arrays can be used to store linear data of similar types, but arrays have the following limitations.
1) The size of the arrays is fixed: So we must know the upper limit on the number of elements in advance. Also, generally, the allocated memory is equal to the upper limit irrespective of the usage.
2) Inserting a new element in an array of elements is expensive because the room has to be created for the new elements and to create room existing elements have to be shifted.

For example, in a system, if we maintain a sorted list of IDs in an array id[].

id[] = [1000, 1010, 1050, 2000, 2040].

And if we want to insert a new ID 1005, then to maintain the sorted order, we have to move all the elements after 1000 (excluding 1000).
Deletion is also expensive with arrays until unless some special techniques are used. For example, to delete 1010 in id[], everything after 1010 has to be moved.

Advantages over arrays
1) Dynamic size
2) Ease of insertion/deletion

Drawbacks:
1) Random access is not allowed. We have to access elements sequentially starting from the first node. So we cannot do binary search with linked lists efficiently with its default implementation. Read about it here.
2) Extra memory space for a pointer is required with each element of the list.
3) Not cache friendly. Since array elements are contiguous locations, there is locality of reference which is not there in case of linked lists.

Representation:
A linked list is represented by a pointer to the first node of the linked list. The first node is called the head. If the linked list is empty, then the value of the head is NULL.
Each node in a list consists of at least two parts:
1) data
2) Pointer (Or Reference) to the next node
In C, we can represent a node using structures. Below is an example of a linked list node with integer data.
In Java or C#, LinkedList can be represented as a class and a Node as a separate class. The LinkedList class contains a reference of Node class type.


// A linked list node 

struct Node { 

int data; 

struct Node* next; 

}; 

First Simple Linked List in C Let us create a simple linked list with 3 nodes.
// A simple C program to introduce 
// a linked list 
#include <stdio.h> 
#include <stdlib.h> 

struct Node { 
int data; 
struct Node* next; 
}; 

// Program to create a simple linked 
// list with 3 nodes 
int main() 
struct Node* head = NULL; 
struct Node* second = NULL; 
struct Node* third = NULL; 

// allocate 3 nodes in the heap 
head = (struct Node*)malloc(sizeof(struct Node)); 
second = (struct Node*)malloc(sizeof(struct Node)); 
third = (struct Node*)malloc(sizeof(struct Node)); 

/* Three blocks have been allocated dynamically. 
We have pointers to these three blocks as head, 
second and third  
head second third 
| |
| |
+---+-----+ +----+----+ +----+----+ 
| # | # | | # | # | | # | # | 
+---+-----+ +----+----+ +----+----+ 
# represents any random value. 
Data is random because we haven’t assigned 
anything yet */

head->data = 1; // assign data in first node 
head->next = second; // Link first node with 
// the second node 

/* data has been assigned to the data part of the first 
block (block pointed by the head). And next 
pointer of first block points to second. 
So they both are linked. 

head second third 
| |
| |
+---+---+ +----+----+ +-----+----+ 
| 1 | o----->| # | # | | # | # | 
+---+---+ +----+----+ +-----+----+  
*/

// assign data to second node 
second->data = 2; 

// Link second node with the third node 
second->next = third; 

/* data has been assigned to the data part of the second 
block (block pointed by second). And next 
pointer of the second block points to the third 
block. So all three blocks are linked. 
head second third 
| |
| |
+---+---+ +---+---+ +----+----+ 
| 1 | o----->| 2 | o-----> | # | # | 
+---+---+ +---+---+ +----+----+ */

third->data = 3; // assign data to third node 
third->next = NULL; 

/* data has been assigned to data part of third 
block (block pointed by third). And next pointer 
of the third block is made NULL to indicate 
that the linked list is terminated here. 

We have the linked list ready. 

head  
+---+---+ +---+---+ +----+------+ 
| 1 | o----->| 2 | o-----> | 3 | NULL | 
+---+---+ +---+---+ +----+------+  
Note that only head is sufficient to represent 
the whole list. We can traverse the complete 
list by following next pointers. */

return 0; 

Linked List Traversal
In the previous program, we have created a simple linked list with three nodes. Let us traverse the created list and print the data of each node. For traversal, let us write a general-purpose function printList() that prints any given list.

We strongly recommend that you click here and practice it, before moving on to the solution.

// A simple C program for traversal of a linked list 
#include <stdio.h> 
#include <stdlib.h> 

struct Node { 
int data; 
struct Node* next; 
}; 

// This function prints contents of linked list starting from 
// the given node 
void printList(struct Node* n) 
while (n != NULL) { 
printf(" %d ", n->data); 
n = n->next; 

int main() 
struct Node* head = NULL; 
struct Node* second = NULL; 
struct Node* third = NULL; 

// allocate 3 nodes in the heap 
head = (struct Node*)malloc(sizeof(struct Node)); 
second = (struct Node*)malloc(sizeof(struct Node)); 
third = (struct Node*)malloc(sizeof(struct Node)); 

head->data = 1; // assign data in first node 
head->next = second; // Link first node with second 

second->data = 2; // assign data to second node 
second->next = third; 

third->data = 3; // assign data to third node 
third->next = NULL; 

printList(head); 

return 0; 
}

Output:

    1 2 3 


Comments

Popular posts from this blog

Information Gathering Tool (System Analysis and Design)

  Information gathering tools... Introduction Information Gathering is a very key part of the feasibility analysis process. Information gathering is both an art and a science. It is a science because it requires a proper methodology and tools in order to be effective. It is an art too, because it requires a sort of mental dexterity to achieve the best results. In this article we will explore the various tools available for it, and which tool would be best used depending on the situation. Information Gathering Tools There is no standard procedures defined when it comes to the gathering of information. However, an important rule that must be followed is the following: information must be acquired accurately and methodically, under the right conditions and with minimum interruption to the individual from whom the information is sought. 1. Review of Procedural Forms These are a very good starting point for gathering information. Procedural manuals can give a good picture of the system to b

Doubly Linked List - Data Structure

                           Doubly Linked List A doubly linked list is a  linked list data structure that includes a link back to the previous node in each node in the structure . This is contrasted with a singly linked list where each node only has a link to the next node in the list. List is a variation of Linked list in which navigation is possible in both ways, either forward and backward easily as compared to Single Linked List. Following are the important terms to understand the concept of doubly linked list. Link  − Each link of a linked list can store a data called an element. Next  − Each link of a linked list contains a link to the next link called Next. Prev  − Each link of a linked list contains a link to the previous link called Prev. LinkedList  − A Linked List contains the connection link to the first link called First and to the last link called Last. Doubly Linked List Representation As per the above illustration, following are the important points to be considered. Dou

CPP Programming

  1. Program for declaring function inside the class, declaring the objects and calling functions //Simple Program for declaring functions inside the class #include<iostream.h> #include<conio.h> class TestSimple { int x,y,s; //Three member variables public: void getdata() // function to store values on member variables { cout<<"\nEnter two numbers "; cin>>x>>y; } void sum() { s=x+y; // adding the values ov x and y } void putdata() { cout<<"\nSum of "<<x<<" and "<<y<<" is "<<s; // displaying the values of variables } }; void main() { TestSimple t; //Object declaration t.getdata(); // Function Call t.sum(); t.putdata(); getdata(); } 2. Program for declaring function outside the class //Simple Program for functions outside the class #inclu