1,105,177 Community Members

Singly Linked List Implementation

Member Avatar
harshchandra
Junior Poster in Training
68 posts since Nov 2004
Reputation Points: -3 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

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();
	  }
Member Avatar
1o0oBhP
Posting Pro in Training
445 posts since Dec 2004
Reputation Points: 4 [?]
Q&As Helped to Solve: 6 [?]
Skill Endorsements: 0 [?]
 
1
 

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

Member Avatar
1o0oBhP
Posting Pro in Training
445 posts since Dec 2004
Reputation Points: 4 [?]
Q&As Helped to Solve: 6 [?]
Skill Endorsements: 0 [?]
 
0
 

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

Member Avatar
Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 25 [?]
Q&As Helped to Solve: 3 [?]
Skill Endorsements: 0 [?]
 
0
 

Would have been better if it were a template class.

Member Avatar
Q8iEnG
Junior Poster
189 posts since Jun 2008
Reputation Points: 0 [?]
Q&As Helped to Solve: 2 [?]
Skill Endorsements: 0 [?]
 
0
 

Awesome thanks a lot :D

Member Avatar
Lug16
Newbie Poster
1 post since Oct 2008
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

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

Member Avatar
pushpa.gangu
Newbie Poster
1 post since Apr 2009
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hi,

can you send me the snippet for doubly linked list?

Member Avatar
ashishju
Newbie Poster
1 post since May 2009
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
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;     
                      }    
         }
Member Avatar
neo_and22
Newbie Poster
1 post since Jul 2009
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
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.

Member Avatar
arushi agarwal
Newbie Poster
2 posts since Aug 2009
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
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.

Member Avatar
arushi agarwal
Newbie Poster
2 posts since Aug 2009
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
-1
 

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.

Member Avatar
dstripathi
Newbie Poster
1 post since Nov 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

thanks a lot

Member Avatar
Samqiu
Newbie Poster
1 post since Jun 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

thanks to the original coder and the editor...

Member Avatar
Sysqa
Newbie Poster
1 post since Jul 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
1
 

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();
}
Member Avatar
FelixKingsley
Newbie Poster
1 post since Aug 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
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.

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 80 [?]
Team Colleague
 
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.

Member Avatar
yogeshwari
Newbie Poster
1 post since Dec 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

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

Member Avatar
rioeduardo
Newbie Poster
5 posts since Feb 2013
Reputation Points: -3 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

I already tried yours but I always found any errors. And you have to make 3 files to code like this so your code will be structured. Try this one http://www.fansonnote.com/2012/01/single-linked-list/ Hope it will help. Thanks.

Member Avatar
hanumant113
Newbie Poster
1 post since Feb 2014
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

this is very easy implentation given, thanks .

You
Post:
Start New Discussion
Tags Related to this Article