954,498 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Singly Linked List Implementation

This program just demonstrate how a node can be added,deleted,searched,counted,and printed using Singly Linked List.
An easy code to understand :)

//////////////////////////////////////////////////////////////
//////////        -:   Singly Link list   :-        /////////
////////////////////////////////////////////////////////////

/* reference : Understandng pointer though c - Y karnetkar.
*/

//////////////////////////////////////////////////////////
//////////     Programmer : Harsh chandra     ///////////
////////////////////////////////////////////////////////

# include<stdio.h>
# include<conio.h>
# include<alloc.h>
# include<stdlib.h>
struct node
{  int data;
	struct node *link;
};
void append(struct node **,int);
void in_begin(struct node **,int);
void del(struct node **,int);
void in_middle(struct node **,int,int);
int count(struct node *);
void display(struct node *);

void main()
{   struct node *p;  /* p can be said as the head or a start ptr */
	 p=NULL;
	 /* Printing the menu */
	 int num,loc;
	 char choice;
	 do
	 { clrscr();
		printf("PROGRAM TO IMPLEMENT SINGLY LINKED LIST ");
		printf("\n=====================================");
		printf("\n\n1.Create \\ Appending The List");
		printf("\n2.Insert Node At Begining");
		printf("\n3.Insert Node In Middle");
		printf("\n4.Deleting a  Node");
		printf("\n5.Counting The No Of Nodes");
		printf("\n6.Displaying the list");
		printf("\n7.Exit");
		oper:
		gotoxy(1,15);printf("                                          ");
		gotoxy(1,11);printf("\n\nEnter ur Choice : ");
		choice=getch();
		switch(choice)
		{   case '1':
			  char ans;
			  do
			 {  printf("Enter any number : ");
				 scanf("%d",&num);
				 append(&p,num);
				 printf("Enter more (y/n) :");
				 fflush(stdin);
				 ans=getchar();
			  }while(ans !='n');
			 break;
			 case '2':
			 printf("Enter The Data : ");
			 scanf("%d",&num);
			 in_begin(&p,num);
			 break;

			 case '3':
			 printf("\nEnter The Position :");
			 scanf("%d",&loc);
			 printf("\nEnter The Data : ");
			 scanf("%d",&num);
			 in_middle(&p,loc,num);
			 break;

			 case '4':
			 printf("\nEnter The Data u Want To Delete : ");
			 scanf("%d",&num);
			 del(&p,num);
			 break;

			 case '5':
			 printf("\nThe No Of Nodes Are %d",count(p));
			 getch();
			 break;

			 case '6':
			 display(p);
			 getch();
			 break;

			 case '7':
			 printf("\n\nQuiting.......");
			 getch();
			 exit(0);
			 break;

			 default:
			 gotoxy(1,15);printf("Invalid choice.Please Enter Correct Choice");
			 getch();
			 goto oper;

		}

	 }while(choice !=7);

}

void append(struct node **q,int num)
{   struct node *temp,*r;
	 temp = *q;
	 if(*q==NULL)
	 {   temp = (struct node *)malloc(sizeof(struct node));
		  temp->data=num;
		  temp->link=NULL;
		  *q=temp;
	 }
	 else
	 {  temp = *q;
		 while(temp->link !=NULL)
		 {  temp=temp->link;
		 }
		 r = (struct node *)malloc(sizeof(struct node));
		 r->data=num;
		 r->link=NULL;
		 temp->link=r;
	 }
}

void display(struct node *q)
{     if(q==NULL)
		{  printf("\n\nEmpty Link List.Can't Display The Data");
			getch();
			goto last;
		}
		 while(q!=NULL)
	 {  printf("\n%d",q->data);
		 q=q->link;
	 }
	 last:
}

int count(struct node *q)
{  int c=0;
	if(q==NULL)
	{ printf("Empty Link List.\n");
	  getch();
	  goto last;
	}
	while(q!=NULL)
	{   c++;
		 q=q->link;
	}
	last:
	return c;

}

void in_begin(struct node **q,int num)
{  struct node *temp;
	if(*q==NULL)
	{  printf("Link List Is Empty.Can't Insert.");
		getch();
		goto last;
	}
	else
	{   temp=(struct node *)malloc(sizeof(struct node));
		 temp->data=num;
		 temp->link=*q;
		 *q=temp;  /* pointing to the first node */
	 }
	 last:
	 getch();
}

void in_middle(struct node **q,int loc,int num)
{  struct node *temp,*n;
	int c=1,flag=0;
	temp=*q;
	if(*q==NULL)
	{  printf("\n\nLink List Is Empty.Can't Insert.");
		getch();
		goto last;
	}
	else
	while(temp!=NULL)
	{  if(c==loc)
		{  n = (struct node *)malloc(sizeof(struct node));
			n->data=num;
			n->link=temp->link;
			temp->link=n;
			flag=1;
		}
		c++;
		temp=temp->link;
	 }
	 if(flag==0)
	 { printf("\n\nNode Specified Doesn't Exist.Cant Enter The Data");
		getch();
	 }
	 else
	 { printf("Data Inserted");
		getch();
	 }
	 last:
	 getch();
}

void del(struct node**q,int num)
{    if(*q==NULL)
	  {  printf("\n\nEmpty Linked List.Cant Delete The Data.");
		  getch();
		  goto last;
	  }
	  else
	  {
	  struct node *old,*temp;
	  int flag=0;
	  temp=*q;
	  while(temp!=NULL)
	  {  if(temp->data==num)
		  {   if(temp==*q)         /* First Node case */
				*q=temp->link;  /* shifted the header node */
				else
				old->link=temp->link;

				free(temp);
				flag=1;
			}
			else
			{  old=temp;
				temp=temp->link;
			}
		 }
		 if(flag==0)
			printf("\nData Not Found...");
		 else
			  printf("\nData Deleted...Tap a key to continue");
			  getch();
		}
		last:
		getch();
	  }
harshchandra
Junior Poster in Training
68 posts since Nov 2004
Reputation Points: 7
Solved Threads: 1
 

nice1 harshchandra! I have a snippet with a doubly linked list if you are interested!

1o0oBhP
Posting Pro in Training
445 posts since Dec 2004
Reputation Points: 16
Solved Threads: 6
 

and im impressed with the **, you dont see that often :)

1o0oBhP
Posting Pro in Training
445 posts since Dec 2004
Reputation Points: 16
Solved Threads: 6
 

Would have been better if it were a template class.

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

Awesome thanks a lot :D

Q8iEnG
Junior Poster
171 posts since Jun 2008
Reputation Points: 10
Solved Threads: 2
 

Your code is really awesome, I've personally tested and almost everything works great... Just one thing generates an error...
And I wanna show you how I fixed it...



if(temp->data==num)

{ if(temp==*q) /* First Node case */

*q=temp->link; /* shifted the header node */

//If I want to delete the first node, the code will blow up and I use the follow lines to fix it
free(temp);
flag = 1;
//Just the same thing that you show after the else
else

old->link=temp->link;

Thanks...!

Lug16
Newbie Poster
1 post since Oct 2008
Reputation Points: 10
Solved Threads: 0
 

Hi,

can you send me the snippet for doubly linked list?

pushpa.gangu
Newbie Poster
1 post since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

Hi Harsh ..
The code is awesome . thanks for posting it . I tested it on Dev C Compiler .

But I got an error in the delete function .

Since there is no break statement , the program goes in a while loop . I just modified the code as below and it worked :-)


if(temp->data == num)
{

if(temp == *q)
{
*q=temp->link;
free(temp);
flag = 1;
break;
}
else
{
old->link = temp->link;
free(temp);
flag = 1;
break;
}
}

ashishju
Newbie Poster
1 post since May 2009
Reputation Points: 10
Solved Threads: 0
 

dudes, i compiled this program in gcc compiler but i gotta error msg while passing &p to append function. error message is "incompatible pointer type","expected to be struct node ** but it is struct node **". please anyone help me out.

neo_and22
Newbie Poster
1 post since Jul 2009
Reputation Points: 10
Solved Threads: 0
 

please explain the concept of accessing reference pointers, in append function
temp=*q , /what does it mean/
why not we can use, temp = q.

arushi agarwal
Newbie Poster
2 posts since Aug 2009
Reputation Points: 10
Solved Threads: 0
 

thanks for this program .
i have searched a lot and at last i found that this is the only link where linked list is explained completely and clearly along with the program .
i want to know, what is the difference between array implementation and dynamic implementation of linked list.

arushi agarwal
Newbie Poster
2 posts since Aug 2009
Reputation Points: 10
Solved Threads: 0
 

thanks a lot

dstripathi
Newbie Poster
1 post since Nov 2010
Reputation Points: 10
Solved Threads: 0
 

thanks to the original coder and the editor...

Samqiu
Newbie Poster
1 post since Jun 2011
Reputation Points: 10
Solved Threads: 0
 

Hi!
I made some correction your code!
The problems:
-if somebody change the struct node for example:

struct node { int data; struct node *link; char *somethink;}

it may do some mistake. Runtime error or don't delete either of node, if you have same nodes.

-couldn't delete the last node without a error

void del(struct node**q,int num)
{
    if(*q==NULL)
    {
	printf("\n\nEmpty Linked List.Cant Delete The Data.\n");
	getchar();
	//goto last; //don't need it...
    }
    else
    {
	struct node *old,*temp;
	int flag=0, delhead=0;
	temp=*q;
	while(temp!=NULL)
	{
	    printf("temp: %p temp->data: %d\n", temp, temp->data);
	    if(temp->data==num)
	    {
		printf("*q: %p\n", *q);
		if(temp==*q) /* First Node case */
		{
		    *q=temp->link; /* shifted the header node */
		    printf("*q: %p\n", *q);
		    free(temp);
		    temp=*q;
		    delhead=1;
		}
		else
		{
		    printf("old->link: %p temp->link: %p\n",old->link, temp->link);
		    old->link=temp->link;
		    free(temp);
		    temp=old;
		}
    		//free(temp);
		flag=1;
	    }
    	    //else
    	    //{
		old=temp;
		if(delhead == 0)
		{
		    printf("old: %p\n",old);
		    printf("temp: %p temp->link: %p\n", temp, temp->link);
		    temp=temp->link;
		}
		else
		{
		    delhead=0;
		}
	    //}
	}
	if(flag==0)
	{
	    printf("\nData Not Found...\n");
	}
	else
	{
	    printf("\nData Deleted...Tap a key to continue\n");
	}
	getchar();
    }
    //last:
    getchar();
}
Sysqa
Newbie Poster
1 post since Jul 2011
Reputation Points: 10
Solved Threads: 0
 

Hi Harsh,

The code is awesome. But I have a question. Look at the below function.

void append(struct node **q,int num){
   struct node *temp,*r;
	 temp = *q;
	 if(*q==NULL)
	 {
   temp = (struct node *)malloc(sizeof(struct node));
		  temp->data=num;
		  temp->link=NULL;	
	  *q=temp;	 }

	 else	 {
  temp = *q;
		 while(temp->link !=NULL)
		 {
  temp=temp->link;		 }
		 
r = (struct node *)malloc(sizeof(struct node));
		 r->data=num;
		 r->link=NULL;
		 temp->link=r;
	 }
}


Why is that temp = *q done inside else loop too? It is already done outside the loop only.

FelixKingsley
Newbie Poster
1 post since Aug 2011
Reputation Points: 10
Solved Threads: 0
 
The code is awesome.


That's debatable.Why is that temp = *q done inside else loop too?
An oversight most likely (given the quality of the rest of the code). Good luck getting harshchandra to reply though, last activity from that account is from 2007.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

hi........ nice but in this small error that is .... u must get the choice it should print then that gotoxy is one of the function ... that is oly enough no need for label and all

yogeshwari
Newbie Poster
1 post since Dec 2011
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You