home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tyc / list1511.c < prev    next >
C/C++ Source or Header  |  1993-10-16  |  2KB  |  108 lines

  1. /* Inputs a list of strings from the keyboard, sorts them */
  2. /* in ascending or descending order, then displays them */
  3. /* on the screen. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7.  
  8. #define MAXLINES 25
  9.  
  10. int get_lines(char *lines[]);
  11. void sort(char *p[], int n, int sort_type);
  12. void print_strings(char *p[], int n);
  13. int alpha(char *p1, char *p2);
  14. int reverse(char *p1, char *p2);
  15.  
  16. char *lines[MAXLINES];
  17.  
  18. main()
  19. {
  20.     int number_of_lines, sort_type;
  21.  
  22.     /* Read in the lines from the keyboard. */
  23.  
  24.     number_of_lines = get_lines(lines);
  25.  
  26.     if ( number_of_lines < 0 )
  27.     {
  28.         puts("Memory allocation error");
  29.         exit(-1);
  30.     }
  31.  
  32.     puts("Enter 0 for reverse order sort, 1 for alphabetical: ");
  33.     scanf("%d", &sort_type);
  34.  
  35.     sort(lines, number_of_lines, sort_type);
  36.     print_strings(lines, number_of_lines);
  37.  
  38. }
  39.  
  40. int get_lines(char *lines[])
  41. {
  42.     int n = 0;
  43.     char buffer[80];    /* Temporary storage for each line. */
  44.  
  45.     puts("Enter one line at a time; enter a blank when done.");
  46.  
  47.     while (n < MAXLINES && gets(buffer) != 0 && buffer[0] != '\0')
  48.     {
  49.         if ((lines[n] = (char *)malloc(strlen(buffer)+1)) == NULL)
  50.             return -1;
  51.         strcpy( lines[n++], buffer );
  52.     }
  53.  
  54.     return n;
  55.  
  56. }    /* End of get_lines() */
  57.  
  58. void sort(char *p[], int n, int sort_type)
  59. {
  60.     int a, b;
  61.     char *x;
  62.  
  63.     /* The pointer to function. */
  64.  
  65.     int (*compare)(char *s1, char *s2);
  66.  
  67.     /* Initialize the pointer to point to the proper comparison */
  68.     /* function depending on the argument sort_type. */
  69.  
  70.     compare = (sort_type) ? reverse : alpha;
  71.  
  72.     for ( a = 1; a < n; a++)
  73.     {
  74.         for ( b = 0; b < n-1; b++ )
  75.         {
  76.             if (compare(p[b], p[b+1]) > 0)
  77.             {
  78.             x = p[b];
  79.             p[b] = p[b+1];
  80.             p[b+1] = x;
  81.             }
  82.         }
  83.     }
  84. }    /* End of sort() */
  85.  
  86. void print_strings(char *p[], int n)
  87. {
  88.     int count;
  89.  
  90.     for (count = 0; count < n; count++)
  91.         printf("\n%s ", p[count]);
  92. }
  93.  
  94. int alpha(char *p1, char *p2)
  95. /* Alphabetical comparison. */
  96. {
  97.     return(strcmp(p2, p1));
  98. }
  99.  
  100. int reverse(char *p1, char *p2)
  101. /* Reverse alphabetical comparison. */
  102. {
  103.     return(strcmp(p1, p2));
  104. }
  105.  
  106.  
  107.  
  108.