The linked list that can be represented by arrays is called static linked list.In this section we will discuss in detail how exactly the list can be represented using arrays.Basically list is a collection of elements.
Array based Implementation
• The
linked list that can be represented by arrays is called static linked list.
• In
this section we will discuss in detail how exactly the list can be represented
using arrays.
• Basically
list is a collection of elements.
• To
show the list using arrays we will have 'data' and 'link' fields in the array.
• The
array can be created as array of structure as
struct node
{
int
data;
int
next;
} a[10];
• For
instance: Consider a list of (10,20,30,40,50). We can store it in arrays as :
•
Various operations that can be performed on static linked list are -
1.
Creation of list.
2.
Display of list.
3.
Insertion of any element in the list.
4.
Deletion of any element from the list.
5.
Searching of desired element in the list.
Let us
understand each operation one by one.
1. Creation of list
The list
can be created by placing the node of list in an array. Each node consists of
two fields 'data' and 'next' pointer. We need to give the address of starting
node which is to be placed in the array.
Thus the
list can be created as follows
While
creating the list we have to first enter the location in an array where the
first node is placed and then input the pair: Data and next.
Int Create()
{
int
head,i;
printf("\n
Enter the index for first node");
scanf("%d",
&i);
head=i;
while(i!=
-1)/*means terminate*/
{
printf("\n
Enter the data and index of the first element");
scanf("%d
%d",&a[i].data,&a[i].next);
i=a[i].next;
}
return
head;
}
2. Display
After
creation we can display the list. Normally when the list is displayed simply
the data fields are to be displayed.
After
creation we can display the list. Normally when the list is displayed simply
the data fields are to be displayed.
void
Display(int i).
{
printf("(");
while(i!=
-1)
{
if(a[i].data==-1)/*no
data item present at a[i]*/
printf("
");
else
{
printf("%d
",a[i].data);
}
i=a[i].next;
}
printf("
NULL)");
}
In
Insert function, consider that we have already created a list (10, 20, 30, 40)
as
Suppose
we want to insert value 21 after 20 then
Now
using for loop we will search 'temp' in array 'a'. When we get the value 'temp'
we will come out of loop by using break statement and check for whether the
next location is empty or not.
The list
after insertion of 21 will look like this
3. Deletion of a node
While
deleting a node from the list we simply manipulate the next pointer of previous
node in the list. And the data field of the node to be deleted is initialized
to - 1.
Consider
that the list is
Let us
see a C program based on it
Implementation
of various List operations using arrays
************
#include<stdio.h>
#include<stdlib.h>
#include
<string.h>
#include<conio.h>
/*data
structure for list using array*/
struct
node
{
int
data;
int
next;
}a[10];
void
main()
{
char
ans;
int
i,head, choice;
int
Create();
void
Display(int);
void
Insert();
void
Delete();
void
Search();
do
{
clrscr();
printf("\n
Main Menu");
printf("\n1.
Creation");
printf("\n2.
Display");
printf("\n3.
Insertion of element in the list");
printf("\n4.
Deletion of element from the list");
printf("\n5.
Searching of element from the list");
printf("\n6.
Exit");
printf("\n
Enter Your choice");
scanf("%d",
&choice);
switch(choice)
{
case
1:for(i=0;i<10;i++)
{
a[i].data
= -1;
}
head=Create();
break;
case
2:Display(head);
break;
case
3:Insert();
break;
case
4:Delete();
break;
case
5:Search();
break;
case
6:exit(0);
}
printf("\n
Do you Wish to go to Main Menu?");
ans=getch();
} while
(ans=='y' || ans == 'Y');
getch();
int
Create()
{
int
head,i;
printf("\n
Enter the index for first node");
scanf("%d",
&i);
head=i;
while(i!=
-1)
{
printf("\n
Enter the data and index of the first element");
scanf("%d
%d",&a[i].data,&a[i].next);
i=a[i].next;
}
return
head;
}
void
Display(int i)
{
printf("(");
while(i!=
-1)
{
if(a[i].data==-1)
printf("
");
else
{
printf("%d,
",a[i].data);
}
i=a[i].next;
}
printf("
NULL)");
}
void
Insert()
{
int
i,new_data,temp;
printf("\n
Enter the new data which is to be inserted");
scanf("%d", &new_data);
printf("\n
Enter the data after which you want to insert");
scanf("%d", &temp);
for(i=0;i<10;i++)
{
if(a[i].data==temp)
break;
}
if(a[i+1].data==-1)/*next
location is empty*/
{
a[i+1].next=a[i].next;
a[i].next=i+1;
a[i+1].data=new_data;
}
}
void
Delete()
{
int
i,temp,current,new_next;
printf("\n
Enter The node to be deleted");
scanf("%d",
&temp);
for(i=0;i<10;i++)
{
if(a[i].data==temp)
{
if(a[i].next==-1)
{
a[i].data=-1;/*writing
-1 means deleting the element*/
}
current=i;/*marking
the index of an array at which record is placed*/ new_next=a[i].next;/*storing
the next pointer value at that index*/
}
}
for(i=0;i<10;i++)
{
if(a[i].next==
current)
{
a[i].next=new_next;
a[current].data
= -1;
}
}
}
void
Search()
{
int
i,temp,flag=0;
printf("\n
Enter the node to be searched ");
scanf("%d",
&temp);
for(i=0;i<10;i++)
{
if(a[i].data==temp)
{
flag=1; /*flag
1 means the element is present*/
break;
}
}
if(flag==1)
printf("\n
The %d node is present in the list",temp);
else
printf("\n
The node is not present ");
Output
Main
Menu
1.
Creation
2.
Display
3.
Insertion of element in the list
4.
Deletion of element from the list
5.
Searching of element from the list
6. Exit
Enter
Your choice1
Enter
the index for first node4
Enter
the data and index of the first element10 1
Enter
the data and index of the first element20 6
Enter the data and index of the first
element30 7
Enter the data and index of the first
element40 -1
Do you
Wish to go to Main Menu?
Main
Menu
1.
Creation an amouf
2.
Display
3. Insertion
of element in the list
4.
Deletion of element from the list
5.
Searching of element from the list
6. Exit
Enter
Your choice2
(10, 20,
30, 40, NULL)
Do you
Wish to go to Main Menu?
Main
Menu
1.
Creation
2.
Display
3.
Insertion of element in the list
4.
Deletion of element from the list
5.
Searching of element from the list 6. Exit
Enter
Your choice6
Although
this type of implementation is possible using arrays, it is usually not
preferred to have list implementation using arrays because of two main reasons
-
Limitations
1. There
is a limitation on the number of nodes in the list because of fixed size of
array. Hence sometimes memory may get wasted because of less elements in the
list or there may be large number of nodes in the list and we could not store
some elements in the array.
2.
Insertions and deletions of elements in the array(list) is complicated (Just
refer the functions Insert() and Delete() and feel how complicated they are!)
Hence we
will go for dynamic memory allocation for implementing the list.
Key
Point: The list creation using dynamic memory management is called linked list.
Ex. 1.4.1: Consider an array A[1:n]. Given a
position, write an algorithm to insert an element in the array. If the position
is empty, the element is inserted easily. If the position is already occupied
the element should be inserted with the minimum number of shifts.
(Note: The elements can shift to the left or to
the right to make the minimum number of moves)
Sol. :
Algorithm for Insertion of Element in array
Step 1: Enter the number of elements
present in the array. Also enter the elements in the array.
printf("\n
How many elements are present in the array?");
scanf("%d", &n);
printf("\n
Enter the elements (Type -99 for empty location): ");
for(c=0;c<n;c++)
scanf("%d",&array[c]);
Step 2: Enter the value of the
element which is to be inserted in the array, say Key_Element. Also enter the
position at which this element is to be inserted.Say Key_Position.
printf("\n
Enter the element to be inserted 2in the array: ");
scanf("%d",
&Key_Element);
printf("\n
Enter the position at which the element is to be inserted: ");
scanf("%d", &Key_Postion);
Step 3:
//If the
Key_Position is empty then insert the Key_Element at that position.
if(array[Key_Postion] ==-99)
array[Key_Position]
=Key_Element;
Step 4:
//Otherwise,
Count the number of elements present left and right to this Key_Element. We
call it as LeftElementCount and RightElementCount.
for(i=0;i<=Key_Position-1;i++);
//note the semicolon after this for loop
LeftElementCount=i;
for(j=n-1;j>=Key_Position;j-);
RightElementCount=j;
Step 5: If Left ElementCount <
RightElementCount then
{
Search
for empty location in this left sublist.
If empty
location is present then move the elements to the left by creating space at
Key_Position then
Insert
Key Element at Key_Position.
else
goto
step 8
}
Step 6: If Left ElementCount>
RightElementCount then
{
Search
for empty location in this right sublist.
If empty
location is present then move the elements to the right by creating space at
Key_Position then
Insert
Key_Element at Key_Position.
else
goto
step 8
}
Step 7:
//Create
the space at Key_Position by shifting the last position elements to the
rightmost
//empty
space.
for(k=n-1;k>=Key_Position-1;k--)
{
array[k+1]=array[k];
array[Key_Position-1]=Key_Element;
}
Step 8: Display the list of elements
in the array
for(c=0;c<=n;c++)
printf("%d",
array[c]);
Review Question
Data Structure: Unit I: Lists : Tag: : Lists operation with Example C Programs | Data Structure - Array Based Implementation
Data Structure
CS3301 3rd Semester CSE Dept | 2021 Regulation | 3rd Semester CSE Dept 2021 Regulation