/* File: qsort2.c Demonstrating use of callback functions in qsort(). This time use bigger data sizes. */ #include #include #include typedef int (* COMP_FUNC_PTR) (const void *, const void *) ; typedef struct { char realname[32] ; char nickname[16] ; char alignment[20] ; char role[20] ; int points ; int level ; } Player ; Player records[25] = { {"Allen, Kevin P.", "kallen1", "neutral good", "Paladin", 6721, 6}, {"Baker, Matthew R.", "mbaker5", "true neutral", "Thief", 4313, 4}, {"Chandlee, Richard C.", "rchand1", "lawful evil", "Ranger", 3196, 3}, {"Cloud, Clinton E.", "ccloud2", "chaotic good", "Magician", 9583, 9}, {"Cobb, Milton T.", "cobb", "lawful neutral", "Fighter", 9169, 9}, {"Frankle, Alan E.", "frankle1", "chaotic good", "Fighter", 8924, 9}, {"Fu, David E.", "dfu1", "chaotic good", "Ranger", 10011, 12}, {"Helton, Robert L.", "helton1", "true neutral", "Paladin", 3034, 3}, {"Joshua, Aimee", "ajoshu1", "chaotic evil", "Thief", 3733, 4}, {"Macdonald, Matthew S.", "matmacd1", "chaotic good", "Fighter", 3797, 5}, {"Mcelvaney, Erin L.", "emcelv1", "lawful neutral", "Cleric", 9896, 11}, {"Mitchell, Susan M.", "smitchel", "neutral good", "Fighter", 9740, 10}, {"Mittal, Sandeep K.", "smitta1", "chaotic good", "Cleric", 2706, 2}, {"Moore, Brian A.", "bmoore1", "lawful evil", "Ranger", 4016, 4}, {"Napier, Matthew A.", "mnapie1", "true neutral", "Magician", 4539, 5}, {"Nguyen, Michael D.", "mnguyen1", "chaotic good", "Ranger", 9490, 9}, {"Orticke, Alecia G.", "aortic1", "chaotic good", "Cleric", 2048, 4}, {"Palewicz, David E.", "dpalew1", "chaotic good", "Thief", 765, 3}, {"Raby, Adam M.", "araby1", "lawful neutral", "Magician", 8814, 9}, {"Roberts, Eric J.", "erober3", "neutral good", "Fighter", 7765, 7}, {"Rusinko, Nicholas D.", "nrusin1", "lawful good", "Thief", 5095, 5}, {"Seo, Maximilian", "mseo1", "chaotic evil", "Ranger", 3205, 3}, {"Shenvi, Shilpa P.", "shenvi1", "neutral good", "Thief", 9573, 10}, {"Szrom, Michelle L.", "mszrom1", "chaotic good", "Cleric", 9660, 9}, {"Tuveson, Eric A.", "etuves1", "chaotic evil", "Thief", 9245, 7} } ; void PrintPlayer(Player *p) { printf("%32s (%16s) %20s %20s(%3d) %10d\n", p->realname, p->nickname, p->alignment, p->role, p->level, p->points) ; } int byPoints(Player *p1, Player *p2) { return p1->points - p2->points ; } int byNickname(Player *p1, Player *p2) { return strcmp(p1->nickname, p2->nickname) ; } int byAlignment(Player *p1, Player *p2) { return strcmp(p1->alignment, p2->alignment) ; } int main () { int i ; printf("Original list:\n") ; for (i = 0 ; i < 25 ; i++) { PrintPlayer(&records[i]) ; } qsort(records, 25, sizeof(Player), (COMP_FUNC_PTR) &byPoints) ; printf("\n\nSorted by points:\n") ; for (i = 0 ; i < 25 ; i++) { PrintPlayer(&records[i]) ; } qsort(records, 25, sizeof(Player), (COMP_FUNC_PTR) &byNickname) ; printf("\n\nSorted by nickname:\n") ; for (i = 0 ; i < 25 ; i++) { PrintPlayer(&records[i]) ; } qsort(records, 25, sizeof(Player), (COMP_FUNC_PTR) &byAlignment) ; printf("\n\nSorted by alignment:\n") ; for (i = 0 ; i < 25 ; i++) { PrintPlayer(&records[i]) ; } return 0 ; }