Implimentation of linked lists in C

Saturday, 10 March 2012
The code works out as follows :
# include
#include
struct Node
{
int Data;
struct Node *Next;
}*Head;
//Set HEAD as NULL
// Adding a Node at the Beginning of the List
// Counting number of elements in the List

int length()
{
struct Node *cur_ptr;
int count=0;

cur_ptr=Head;

while(cur_ptr != NULL)
{
cur_ptr=cur_ptr->Next;
count++;
}
return(count);
}
void addBeg(int num)
{
struct Node *temp;

temp=(struct Node *)malloc(sizeof(struct Node));
temp->Data = num;

if (Head == NULL)
{
//List is Empty
Head=temp;
Head->Next=NULL;
}
else
{
temp->Next=Head;
Head=temp;
}
}
//Adding a Node at the end of the list

void addEnd(int num)
{
struct Node *temp1, *temp2;

temp1=(struct Node *)malloc(sizeof(struct Node));
temp1->Data=num;

// Copying the Head location into another node.
temp2=Head;

if(Head == NULL)
{
// If List is empty we create First Node.
Head=temp1;
Head->Next=NULL;
}
else
{
// Traverse down to end of the list.
while(temp2->Next != NULL)
temp2=temp2->Next;

// Append at the end of the list.
temp1->Next=NULL;
temp2->Next=temp1;
}
}
// Adding a new Node at specified position

void addAt(int num, int loc)
{
int i;
struct Node *temp, *prev_ptr, *cur_ptr;

cur_ptr=Head;

if(loc > (length()+1) || loc <= 0) { printf("\nInsertion at given location is not possible\n "); } else { // If the location is starting of the list if (loc == 1) { addBeg(num); } else { for(i=1;iNext;
}

temp=(struct Node *)malloc(sizeof(struct Node));
temp->Data=num;

prev_ptr->Next=temp;
temp->Next=cur_ptr;
}
}
}

// Deleting a node from List depending upon the data in the node.

int delNodeData(int num)
{
struct Node *prev_ptr, *cur_ptr;

cur_ptr=Head;

while(cur_ptr != NULL)
{
if(cur_ptr->Data == num)
{
if(cur_ptr==Head)
{
Head=cur_ptr->Next;
free(cur_ptr);
return 0;
}
else
{
prev_ptr->Next=cur_ptr->Next;
free(cur_ptr);
return 0;
}
}
else
{
prev_ptr=cur_ptr;
cur_ptr=cur_ptr->Next;
}
}

printf("\nElement %d is not found in the List", num);
return 1;
}
// Deleting a node from List depending upon the location in the list.

int delNodeLoc(int loc)
{
struct Node *prev_ptr, *cur_ptr;
int i;

cur_ptr=Head;

if(loc > (length()) || loc <= 0) { printf("\nDeletion of Node at given location is not possible\n "); } else { // If the location is starting of the list if (loc == 1) { Head=cur_ptr->Next;
free(cur_ptr);
return 0;
}
else
{
for(i=1;iNext;
}

prev_ptr->Next=cur_ptr->Next;
free(cur_ptr);
}
}
return 1;
}
// Displaying list contents

void display()
{
struct Node *cur_ptr;

cur_ptr=Head;

if(cur_ptr==NULL)
{
printf("\nList is Empty");
}
else
{
printf("Elements in the List: ");
//traverse the entire linked list
while(cur_ptr!=NULL)
{
printf(" -> %d ",cur_ptr->Data);
cur_ptr=cur_ptr->Next;
}
printf("\n");
}
}
//Reversesing a Linked List

void reverse()
{
struct Node *prev_ptr, *cur_ptr, *temp;

cur_ptr=Head;
prev_ptr=NULL;

while(cur_ptr != NULL)
{
temp=prev_ptr;
prev_ptr=cur_ptr;

cur_ptr=cur_ptr->Next;
prev_ptr->Next=temp;
}

Head=prev_ptr;
}
int main()
{
Head=NULL;
while(1){
printf("1.addbeg 2.addend 3.addat 4.reverse 5.display 6.deletenum 7.length 8.exit");
int i;
scanf("%d",&i);
switch(i){
case 1:int num;scanf("%d",&num);
addBeg(num);
break;
case 2: num=0;scanf("%d",&num);
addEnd(num);
break;
case 3: num=0;scanf("%d",&num);
int loc;scanf("%d",&loc);
addAt(num,loc);
break;
case 4:reverse();
break;
case 5:display();
break;
case 6:num=0;scanf("%d",&num);
delNodeData(num);
break;
case 7:printf("%d\n",length());
break;
case 8:return 0;
default:printf("not valid\n");
}
}
return 0;
}

Copyright @ 2013 code-craft. Designed by Templateism | MyBloggerLab