C program to implement doubly linked list

Posted: April 1, 2012 in Linked list
Tags: , ,
#include <stdio.h>
#include <stdlib.h>
       void  create_list(int);
      void addatbeg(int);
void       del(int);
     void addafter(int,int);
void       display(void);
void       count(void);
void       rev(void);
struct node
{
  struct node *prev;
  int info;
  struct node *next;
}*start;
 
 int main()
{
  int choice=1,n,m,po,i;
  start=NULL;
  while(choice!=8)
  {
    printf("1.Create List\n");
    printf("2.Add at begining\n");
    printf("3.Add after\n");
    printf("4.Delete\n");
    printf("5.Display\n");
    printf("6.Count\n");
    printf("7.Reverse\n");
    printf("8.exit\n");
    printf("Enter your choice : ");
    scanf("%d",&choice);
    switch(choice)
    {
     case 1:
      printf("How many nodes you want : ");
      scanf("%d",&n);
      for(i=0;i<n;i++)
      {
        printf("Enter the element : ");
        scanf("%d",&m);
        create_list(m);
      }
      break;
     case 2:
      printf("Enter the element : ");
      scanf("%d",&m);
      addatbeg(m);
      break;
     case 3:
      printf("Enter the element : ");
      scanf("%d",&m);
      printf("Enter the position after which this element is inserted : ");
      scanf("%d",&po);
      addafter(m,po);
      break;
     case 4:
      printf("Enter the element for deletion : ");
      scanf("%d",&m);
      del(m);
      break;
     case 5:
      display();
      break;
     case 6:
      count();
      break;
     case 7:
      rev();
      break;
     case 8:
				break;
     default:
      printf("Wrong choice\n");
  }/*End of switch*/
   }/*End of while*/
}/*End of main()*/
 
void create_list(int num)
{
struct node *q,*tmp;
tmp= (struct node *) malloc(sizeof(struct node));

tmp->info=num;
tmp->next=NULL;
if(start==NULL)
{
printf("Creating the first node of Linked List \n");
tmp->prev=NULL;
//start->prev=tmp;
start=tmp;
}
else
{
printf("Inserting the nodes after the head node/other nodes\n");
q=start;
while(q->next!=NULL)
q=q->next;
q->next=tmp;
tmp->prev=q;
}
}/*End of create_list()*/ 
void addatbeg(int num)
{
  struct node *tmp;
  tmp=malloc(sizeof(struct node));
  tmp->prev=NULL;
  tmp->info=num;
  tmp->next=start;
  start->prev=tmp;
  start=tmp;
}/*End of addatbeg()*/
 
void addafter(int num,int c)
{
  struct node *tmp,*q;
  int i;
  q=start;
  for(i=0;i<c-1;i++)
  {
    q=q->next;
    if(q==NULL)
    {
      printf("There are less than %d elements\n",c);
      return;
    }
  }
  tmp=malloc(sizeof(struct node) );
  tmp->info=num;
  q->next->prev=tmp;
  tmp->next=q->next;
  tmp->prev=q;
  q->next=tmp;
}/*End of addafter() */
 
void del(int num)
{
  struct node *tmp,*q;
  if(start->info==num)
  {
    tmp=start;
    start=start->next;  /*first element deleted*/
    start->prev = NULL;
    free(tmp);
    return;
  }
  q=start;
  while(q->next->next!=NULL)
  {
    if(q->next->info==num)     /*Element deleted in between*/
    {
      tmp=q->next;
      q->next=tmp->next;
      tmp->next->prev=q;
      free(tmp);
      return;
    }
    q=q->next;
  }
  if(q->next->info==num)    /*last element deleted*/
  {   tmp=q->next;
    free(tmp);
    q->next=NULL;
    return;
  }
  printf("Element %d not found\n",num);
}/*End of del()*/
 
void display()
{
  struct node *q;
  if(start==NULL)
  {
    printf("List is empty\n");
    return;
  }
  q=start;
  printf("List is :\n");
  while(q!=NULL)
  {
    printf("%d ", q->info);
    q=q->next;
  }
  printf("\n");
}/*End of display() */
 
void count()
{   struct node *q=start;
  int cnt=0;
  while(q!=NULL)
  {
    q=q->next;
    cnt++;
  }
  printf("Number of elements are %d\n",cnt);
}/*End of count()*/
 
void rev(void)
{
  struct node *p1,*p2;
  p1=start;
  p2=p1->next;
  p1->next=NULL;
  p1->prev=p2;
  while(p2!=NULL)
  {
    p2->prev=p2->next;
    p2->next=p1;
    p1=p2;
    p2=p2->prev; /*next of p2 changed to prev */
  }
  start=p1;
}/*End of rev()*/
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s