Link list

/* linked list example */

#include <stdio.h>

#include <alloc.h>

#include <stdlib.h>

#include <conio.h>

#include <ctype.h>

#include <string.h>



/* function prototypes */

struct node * initnode( char *, int );

void printnode( struct node * );

void printlist( struct node * );

void add( struct node * );

struct node * searchname( struct node *, char * );

void deletenode( struct node * );

void insertnode( struct node * );

void deletelist( struct node * );



/* definition of a data node for holding student information */

struct node {

   char name[20];

   int  id;

   struct node *next;

};



/* head points to first node in list, end points to last node in list */

/* initialise both to NULL, meaning no nodes in list yet */

struct node *head = (struct node *) NULL;

struct node *end = (struct node *) NULL;



/* this initialises a node, allocates memory for the node, and returns   */

/* a pointer to the new node. Must pass it the node details, name and id */

struct node * initnode( char *name, int id )

{

   struct node *ptr;

   ptr = (struct node *) calloc( 1, sizeof(struct node ) );

   if( ptr == NULL )                       /* error allocating node?      */

       return (struct node *) NULL;        /* then return NULL, else      */

   else {                                  /* allocated node successfully */

       strcpy( ptr->name, name );          /* fill in name details        */

       ptr->id = id;                       /* copy id details             */

       return ptr;                         /* return pointer to new node  */

   }

}



/* this prints the details of a node, eg, the name and id                 */

/* must pass it the address of the node you want to print out             */

void printnode( struct node *ptr )

{

   printf("Name ->%s/n", ptr->name );

   printf("ID   ->%d/n", ptr->id );

}



/* this prints all nodes from the current address passed to it. If you    */

/* pass it 'head', then it prints out the entire list, by cycling through */

/* each node and calling 'printnode' to print each node found             */

void printlist( struct node *ptr )

{

   while( ptr != NULL )           /* continue whilst there are nodes left */

   {

      printnode( ptr );           /* print out the current node           */

      ptr = ptr->next;            /* goto the next node in the list       */

   }

}



/* this adds a node to the end of the list. You must allocate a node and  */

/* then pass its address to this function                                 */

void add( struct node *new )  /* adding to end of list */

{

   if( head == NULL )      /* if there are no nodes in list, then         */

       head = new;         /* set head to this new node                   */

   end->next = new;        /* link in the new node to the end of the list */

   new->next = NULL;       /* set next field to signify the end of list   */

   end = new;              /* adjust end to point to the last node        */

}



/* search the list for a name, and return a pointer to the found node     */

/* accepts a name to search for, and a pointer from which to start. If    */

/* you pass the pointer as 'head', it searches from the start of the list */

struct node * searchname( struct node *ptr, char *name )

{

    while( strcmp( name, ptr->name ) != 0 ) {    /* whilst name not found */

       ptr = ptr->next;                          /* goto the next node    */

       if( ptr == NULL )                         /* stop if we are at the */

          break;                                 /* of the list           */

    }

    return ptr;                                  /* return a pointer to   */

}                                                /* found node or NULL    */



/* deletes the specified node pointed to by 'ptr' from the list           */

void deletenode( struct node *ptr )

{

   struct node *temp, *prev;

   temp = ptr;    /* node to be deleted */

   prev = head;   /* start of the list, will cycle to node before temp    */



   if( temp == prev ) {                    /* are we deleting first node  */

       head = head->next;                  /* moves head to next node     */

       if( end == temp )                   /* is it end, only one node?   */

          end = end->next;                 /* adjust end as well          */

       free( temp );                       /* free space occupied by node */

   }

   else {                                  /* if not the first node, then */

       while( prev->next != temp ) {       /* move prev to the node before*/

           prev = prev->next;              /* the one to be deleted       */

       }

       prev->next = temp->next;            /* link previous node to next  */

       if( end == temp )                   /* if this was the end node,   */

           end = prev;                     /* then reset the end pointer  */

       free( temp );                       /* free space occupied by node */

   }

}



/* inserts a new node, uses name field to align node as alphabetical list */

/* pass it the address of the new node to be inserted, with details all   */

/* filled in                                                              */

void insertnode( struct node *new )

{

   struct node *temp, *prev;                /* similar to deletenode      */



   if( head == NULL ) {                     /* if an empty list,          */

       head = new;                          /* set 'head' to it           */

       end = new;

       head->next = NULL;                   /* set end of list to NULL    */

       return;                              /* and finish                 */

   }



   temp = head;                             /* start at beginning of list */

                      /* whilst currentname < newname to be inserted then */

   while( strcmp( temp->name, new->name) < 0 ) {

          temp = temp->next;                /* goto the next node in list */

          if( temp == NULL )                /* dont go past end of list   */

              break;

   }



   /* we are the point to insert, we need previous node before we insert  */

   /* first check to see if its inserting before the first node!          */

   if( temp == head ) {

      new->next = head;             /* link next field to original list   */

      head = new;                   /* head adjusted to new node          */

   }

   else {     /* okay, so its not the first node, a different approach    */

      prev = head;   /* start of the list, will cycle to node before temp */

      while( prev->next != temp ) {

          prev = prev->next;

      }

      prev->next = new;             /* insert node between prev and next  */

      new->next = temp;

      if( end == prev )             /* if the new node is inserted at the */

         end = new;                 /* end of the list the adjust 'end'   */

   }

}



/* this deletes all nodes from the place specified by ptr                 */

/* if you pass it head, it will free up entire list                       */

void deletelist( struct node *ptr )

{

   struct node *temp;



   if( head == NULL ) return;   /* dont try to delete an empty list       */



   if( ptr == head ) {      /* if we are deleting the entire list         */

       head = NULL;         /* then reset head and end to signify empty   */

       end = NULL;          /* list                                       */

   }

   else {

       temp = head;          /* if its not the entire list, readjust end  */

       while( temp->next != ptr )         /* locate previous node to ptr  */

           temp = temp->next;

       end = temp;                        /* set end to node before ptr   */

   }



   while( ptr != NULL ) {   /* whilst there are still nodes to delete     */

      temp = ptr->next;     /* record address of next node                */

      free( ptr );          /* free this node                             */

      ptr = temp;           /* point to next node to be deleted           */

   }

}



/* this is the main routine where all the glue logic fits                 */

main()

{

   char name[20];

   int id, ch = 1;

   struct node *ptr;



   clrscr();

   while( ch != 0 ) {

      printf("1 add a name /n");

      printf("2 delete a name /n");

      printf("3 list all names /n");

      printf("4 search for name /n");

      printf("5 insert a name /n");

      printf("0 quit/n");

      scanf("%d", &ch );

      switch( ch )

      {

          case 1:  /* add a name to end of list */

                   printf("Enter in name -- ");

                   scanf("%s", name );

                   printf("Enter in id -- ");

                   scanf("%d", &id );

                   ptr = initnode( name, id );

                   add( ptr );

                   break;

          case 2:  /* delete a name */

                   printf("Enter in name -- ");

                   scanf("%s", name );

                   ptr = searchname( head, name );

                   if( ptr ==NULL ) {

                       printf("Name %s not found/n", name );

                   }

                   else

                      deletenode( ptr );

                   break;



          case 3:  /* list all nodes */

                   printlist( head );

                   break;



          case 4:  /* search and print name */

                   printf("Enter in name -- ");

                   scanf("%s", name );

                   ptr = searchname( head, name );

                   if( ptr ==NULL ) {

                       printf("Name %s not found/n", name );

                   }

                   else

                      printnode( ptr );

                   break;

          case 5:  /* insert a name in list */

                   printf("Enter in name -- ");

                   scanf("%s", name );

                   printf("Enter in id -- ");

                   scanf("%d", &id );

                   ptr = initnode( name, id );

                   insertnode( ptr );

                   break;



      }

   }

   deletelist( head );

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值