⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklist.c

📁 里面包含很多c语言的源码
💻 C
字号:
/*========================================================*
 * Program:  listlist.c                                   *
 * Book:     Sams Teach Yourself C in 21 Days             *
 * Purpose:  Implementing a linked list                   *
 *========================================================*/
#include <stdio.h>
#include <stdlib.h>

#ifndef NULL
  #define NULL 0
#endif

/* List data structure */
struct list
{
  int    ch;     /* using an int to hold a char */
  struct list *next_rec;
};

/* Typedefs for the structure and pointer. */
typedef struct list LIST;
typedef LIST *LISTPTR;

/* Function prototypes. */
LISTPTR add_to_list( int, LISTPTR );
void show_list(LISTPTR);
void free_memory_list(LISTPTR);

int main( void )
{
   LISTPTR first = NULL;  /* head pointer */
   int i = 0;
   int ch;
   char trash[256];       /* to clear stdin buffer. */

   while ( i++ < 5 )      /* build a list based on 5 items given */
   {
      ch = 0;
      printf("\nEnter character %d, ", i);

      do
      {
          printf("\nMust be a to z: ");
          ch = getc(stdin);  /* get next char in buffer  */
          gets(trash);       /* remove trash from buffer */
      } while( (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z'));

      first = add_to_list( ch, first );
   }

   show_list( first );           /* Dumps the entire list */
   free_memory_list( first );    /* Release all memory */
   return 0;
}

/*========================================================*
 * Function: add_to_list()
 * Purpose : Inserts new link in the list
 * Entry   : int ch = character to store
 *           LISTPTR first = address of original head pointer
 * Returns : Address of head pointer (first)
 *========================================================*/

LISTPTR add_to_list( int ch, LISTPTR first )
{
   LISTPTR new_rec = NULL;       /* Holds address of new rec */
   LISTPTR tmp_rec = NULL;       /* Hold tmp pointer         */
   LISTPTR prev_rec = NULL;

   /* Allocate memory. */
   new_rec = (LISTPTR)malloc(sizeof(LIST));
   if (!new_rec)      /* Unable to allocate memory */
   {
      printf("\nUnable to allocate memory!\n");
      exit(1);
   }

   /* set new link's data */
   new_rec->ch = ch;
   new_rec->next_rec = NULL;

   if (first == NULL)   /* adding first link to list */
   {
       first = new_rec;
       new_rec->next_rec = NULL;  /* redundant but safe */
   }
   else    /* not first record */
   {
      /* see if it goes before the first link */
      if ( new_rec->ch < first->ch)
      {
         new_rec->next_rec = first;
         first = new_rec;
      }
      else   /* it is being added to the middle or end */
      {
         tmp_rec = first->next_rec;
         prev_rec = first;

         /* Check to see where link is added. */

         if ( tmp_rec == NULL )
         {
             /* we are adding second record to end */
             prev_rec->next_rec = new_rec;
         }
         else
         {
            /* check to see if adding in middle */
            while (( tmp_rec->next_rec != NULL))
            {
               if( new_rec->ch < tmp_rec->ch )
               {
                  new_rec->next_rec = tmp_rec;
                  if (new_rec->next_rec != prev_rec->next_rec)
                  {
                     printf("ERROR");
                     getc(stdin);
                     exit(0);
                  }
                  prev_rec->next_rec = new_rec;
                  break;   /* link is added; exit while */
               }
               else
               {
                 tmp_rec = tmp_rec->next_rec;
                 prev_rec = prev_rec->next_rec;
               }
            }

            /* check to see if adding to the end */
            if (tmp_rec->next_rec == NULL)
            {
               if (new_rec->ch < tmp_rec->ch ) /* 1 b4 end */
               {
                  new_rec->next_rec = tmp_rec;
                  prev_rec->next_rec = new_rec;
               }
               else  /* at the end */
               {
                  tmp_rec->next_rec = new_rec;
                  new_rec->next_rec = NULL;  /* redundant */
               }
            }
         }
      }
   }
   return(first);
}

/*========================================================*
 * Function: show_list
 * Purpose : Displays the information current in the list
 *========================================================*/

void show_list( LISTPTR first )                                                   
{
   LISTPTR cur_ptr;
   int counter = 1;

   printf("\n\nRec addr  Position  Data  Next Rec addr\n");
   printf("========  ========  ====  =============\n");

   cur_ptr = first;
   while (cur_ptr != NULL )
   {
      printf("  %X   ", cur_ptr );
      printf("     %2i       %c", counter++, cur_ptr->ch);
      printf("      %X   \n",cur_ptr->next_rec);
      cur_ptr = cur_ptr->next_rec;
   }
}

/*========================================================*
 * Function: free_memory_list
 * Purpose : Frees up all the memory collected for list
 *========================================================*/

void free_memory_list(LISTPTR first)
{
   LISTPTR cur_ptr, next_rec;
   cur_ptr = first;                 /* Start at beginning */

   while (cur_ptr != NULL)          /* Go while not end of list */
   {
      next_rec = cur_ptr->next_rec; /* Get address of next record */
      free(cur_ptr);                /* Free current record */
      cur_ptr = next_rec;           /* Adjust current record*/
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -