Monday, June 13, 2005

adding in ascending order in a double linked list

#include <stdio.h>

#include <stdlib.h>

/*

#include <conio.h>

*/

struct dnode

{

   struct dnode *prev;

   struct dnode *next;

   int data;

};

 

 

void display(struct dnode *p);

void append (struct dnode **s, int num);

void free_all (struct dnode *p);

 

int main (void)

{

   struct dnode *p=NULL;

   append(&p, 2);

   append(&p, 5);

   append(&p, 7);

   append(&p, 6);

   append(&p, 8);

   append(&p, 9);

   append(&p, 3);

   append(&p, 1);

   append(&p, 4);

   append(&p, 0);

   display(p);

 

 

   free_all(p);

/*

   getch();

*/

   return 0;

}

void display(struct dnode *p)

{

   while(p)

   {

     printf("%d\n", p->data);

     p=p->next;

   }

   printf("\n");

}

void append(struct dnode **s, int num)

{

   struct dnode *r;

 

   if (!s)

     return;

 

 

   r = (struct dnode*)malloc(sizeof *r);

   if (!r)

   {

     fprintf(stderr, "Cannot allocate storage for dnode **s\n");

     display(*s);

     free_all(*s);

     exit(EXIT_FAILURE);

   }

 

 

   r->next=NULL;

   r->prev=NULL;

   r->data=num;

 

 

   if (*s == NULL)

   {

     /* first and only node: initialise list head */

     *s = r;

   }

   else if ((*s)->data > num)

   {

     /* r already is in the right place, so add links

     ** and set r to be the new list head. */

     r->next    = *s;

     (*s)->prev = r;

 

 

     *s = r;

   }

   else

   {

     /* iterate until the right position for r is

     ** found, then link it in. */

     struct dnode *p;

 

 

     for (p=*s; p->next; p=p->next)

     {

       if (p->next->data > num)

       {

         p->next->prev = r;

         break;

       }

     }

     r->prev = p;

     r->next = p->next;

     p->next = r;

   }

 

 

 

}

 

 

void free_all (struct dnode *p)

{

   struct dnode *tmp;

 

   if (p && p->next)

     for (tmp = p->next; tmp; )

     {

       if (tmp->next)

       {

         tmp = tmp->next;

         free(tmp->prev);

       }

       else

       {

         free(tmp);

         tmp = NULL;

       }

     }

   if (p && p->prev)

     for (tmp = p->prev; tmp; )

     {

       if (tmp->prev)

       {

         tmp = tmp->prev;

         free(tmp->next);

       }

       else

       {

         free(tmp);

         tmp = NULL;

       }

     }

   free(p);

}

 

Pradyut
http://pradyut.tk
http://groups.yahoo.com/group/d_dom/
http://groups-beta.google.com/group/oop_programming
India

 

No comments: