取最大值的通用函数(void指针),struct和int数组的最大值

源代码:(文件已合并,2代码+1Makefile)

  1 // Linux C程序设计大全
  2 
  3 /*
  4  * FILE: p110_call_main.c
  5  * DATE: 20180108
  6  * --------------
  7  * DESCRIPTION: 分别比较出struct和int指针数组最大值
  8  * void通用指针,函数指针
  9  */
 10 
 11 #include <stdio.h>
 12 #include <stdlib.h>
 13 #include <string.h>
 14 
 15 #define NUMBER 4 
 16 
 17 struct book{
 18         int id;
 19         char name[10];
 20 };
 21 
 22 extern void *max(void *array[], int len, int (*func)(void *, void *));
 23 extern int cmp_int(void *p, void *q);
 24 extern int cmp_struct(void *p, void *q);
 25 
 26 int insert_struct(struct book **p, int id, char *name);
 27 int insert_int(int **p, int val);
 28 
 29 int main(int argc, char *argv[])
 30 {
 31         // 指针数组
 32         struct book *array_book[NUMBER], *res_book;
 33         int *array_int[NUMBER], *res_int;
 34         int i;
 35         for(i=0; i<NUMBER; i++)
 36         {
 37                 int id;
 38                 char name[10];
 39                 int val;
 40 
 41                 printf("input info of book: \n");
 42                 scanf("%d", &id);
 43                 scanf("%s", name);
 44                 insert_struct(array_book+i, id, name);
 45 
 46                 printf("input int: \n");
 47                 scanf("%d", &val);
 48                 insert_int(array_int+i, val);
 49         }
 50         for(i=0; i<NUMBER; i++)
 51         {
 52                 printf("=== id %d, name %s\n", (array_book[i])->id, (array_book[i]->name));
 53                 printf("=== int %d\n", *array_int[i]);
 54         }
 55         res_book = (struct book *)max((void *)array_book, NUMBER, cmp_struct);
 56         res_int = (int *)max((void *)array_int, NUMBER, cmp_int);
 57 
 58         printf("the max of books: %d, %s\n", res_book->id, res_book->name);
 59         printf("the max of int: %d\n", *res_int);
 60         return 0;
 61 }
 62 
 63 int insert_struct(struct book **p, int id, char *name)
 64 {
 65         *p = (struct book *)malloc(sizeof(struct book));
 66         if(*p == NULL)
 67         {
 68                 perror("ERROR: malloc, fail to apply memory");
 69                 return -1;
 70         }
 71         (*p)->id = id;
 72         strcpy((*p)->name, name);
 73         return 0;
 74 }
 75 
 76 int insert_int(int **p, int value)
 77 {
 78         *p = (int *)malloc(sizeof(int));
 79         **p = value;
 80         return 0;
 81 }
 82 
 83 
 84 
 85 /*
 86  * FILE: p110_call_cmp.c
 87  * DATE: 20180108
 88  * --------------
 89  * DESCRITPION: void指针
 90  */
 91 
 92 struct book{
 93         int id;
 94         char name[10];
 95 };
 96 
 97 int cmp_int(void *p, void *q);
 98 int cmp_struct(void *p, void *q);
 99 
100 /* 根据传入的函数指针,调用相应的函数 */
101 void *max(void *array[], int len, int (*func)(void *, void *))
102 {
103         int i;
104         void *tmp = array[0];
105         for(i=1; i<len; i++)
106         {
107                 if((*func)(tmp, array[i]) < 0)
108                         tmp = array[i];
109         }
110         return tmp;
111 }
112 
113 /* 大于则返回1,小于则返回-1,等于则返回0 */
114 int cmp_struct(void *p, void *q)
115 {
116         // 将void指针强制类型转换,否则编译警告warning
117         struct book *a = (struct book *)p;
118         struct book *b = (struct book *)q;
119         if(a->id > b->id)
120                 return 1;
121         else if(a->id < b->id)
122                 return -1;
123         else
124                 return 0;
125 }
126 
127 int cmp_int(void *p, void *q)
128 {
129         int *a = (int *)p;
130         int *b = (int *)q;
131         if(*a > *b)
132                 return 1;
133         else if(*a < *b)
134                 return -1;
135         else
136                 return 0;
137 }
138 
139 
140 
141 # FILE: Makefile
142 # DATE: 20180108
143 # ==============
144 
145 OBJECTS = p110_call_main.o p110_call_cmp.o
146 
147 build: $(OBJECTS)
148         gcc -o build $(OBJECTS)
149 
150 p110_call_main.o: p110_call_main.c
151         gcc -c p110_call_main.c
152 
153 p110_call_cmp.o: p110_call_cmp.c
154         gcc -c p110_call_cmp.c
155 
156 .PHONY: clean
157 clean:
158         rm build $(OBJECTS)
159 
编译运行:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值