home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_04 / 1104109b < prev    next >
Text File  |  1993-02-05  |  2KB  |  72 lines

  1. /* sort4.c: Sort structures via pointers */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define NELEMS 4
  8.  
  9. struct person
  10. {
  11.     char last[16];
  12.     char first[11];
  13.     char phone[13];
  14.     int age;
  15. };
  16.  
  17. static int name_comp(const void *, const void *);
  18. static int age_comp(const void *, const void *);
  19.  
  20. main()
  21. {
  22.     size_t i;
  23.     static struct person some_people[NELEMS] =
  24.       {{"Lincoln","Abraham","555-1865",161},
  25.        {"Ford","Henry","555-1903",98},
  26.        {"Ford","Edsel","555-1965",53},
  27.        {"Trump","Donald","555-1988",49}};
  28.     struct person *some_ptrs[NELEMS] =
  29.       {some_people,some_people+1,some_people+2,some_people+3};
  30.  
  31.     qsort(some_ptrs, NELEMS, sizeof some_ptrs[0], name_comp);
  32.  
  33.     puts("By name:");
  34.     for (i = 0; i < NELEMS; ++i)
  35.         printf("%s, %s, %s %d\n",
  36.           some_ptrs[i]->last,
  37.           some_ptrs[i]->first,
  38.           some_ptrs[i]->phone,
  39.           some_ptrs[i]->age);
  40.  
  41.     qsort(some_ptrs, NELEMS, sizeof some_ptrs[0], age_comp);
  42.  
  43.     puts("\nBy age:");
  44.     for (i = 0; i < NELEMS; ++i)
  45.         printf("%s, %s, %s %d\n",
  46.           some_ptrs[i]->last,
  47.           some_ptrs[i]->first,
  48.           some_ptrs[i]->phone,
  49.           some_ptrs[i]->age);
  50.     return 0;
  51. }
  52.  
  53. static int name_comp(const void *p1, const void *p2)
  54. {
  55.     struct person *sp1 = * (struct person **) p1;
  56.     struct person *sp2 = * (struct person **) p2;
  57.     int order = strcmp(sp1->last,sp2->last);
  58.  
  59.     if (order == 0)
  60.        order = strcmp(sp1->first,sp2->first);
  61.     return order;
  62. }
  63.  
  64. static int age_comp(const void *p1, const void *p2)
  65. {
  66.     struct person *sp1 = * (struct person **) p1;
  67.     struct person *sp2 = * (struct person **) p2;
  68.  
  69.     return sp1->age - sp2->age;
  70. }
  71.  
  72.