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();
	  }

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

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

Would have been better if it were a template class.

Awesome thanks a lot :D

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...

<code>

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;
</code>

Thanks...!

Hi,

can you send me the snippet for doubly linked list?

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;     
                      }    
         }

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.

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

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.

thanks to the original coder and the editor...

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();
}

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.

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.

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

this is very easy implentation given, thanks .

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.