/**
******************************************************************************
* @Copyright (c) 2015,march_bobo
* @file delegata.c
* @author march_bobo
* @version V1.0
* @date 2015/2/11 13:32:21
* @brief 测试函数指针的用法
******************************************************************************
* @attention
* 函数指针数组通过查表的方式实现switch或if的判断后调用函数的功能,使得程序
* 机构更加清晰调理,更具有适应性。
*
* All rights reserved.
******************************************************************************
*/
#include<stdio.h>
#define SWITCH_ON 1
#define MAXSIZE 100
typedef int ElemType;
typedef struct Node
{
ElemType data[MAXSIZE];
int length;
}SqList, * LinkList;
void max(LinkList L);
void min(LinkList L);
void (*handle[2])(LinkList L) = {max, min};
/**
* @brief 创建线性表
* @param SqList *L 顺序表
* @param int n 顺序表长度
* @retval void
* @attention
*/
void Great_SqList(LinkList L, int n)
{
int i=0;
L->length = n;
printf("请输入 %d 数据:\n",n);
while(i<n)
{
scanf("%d",&L->data[i]);
i++;
}
}
/**
* @brief 求线性表最大值
* @param SqList结构体
* @retval void
* @attention
*/
void max(LinkList L)
{
int max, i;
max = L->data[0];
for(i=1;i<L->length;i++)
max = (max > L->data[i]) ? max:L->data[i];
printf("max= %d\n",max);
}
/**
* @brief 求线性表最小值
* @param SqList结构体
* @retval void
* @attention
*/
void min(LinkList L)
{
int min, i;
min = L->data[0];
for(i=1;i<L->length;i++)
min = (min > L->data[i]) ? L->data[i]:min;
printf("min= %d\n",min);
}
int main(void)
{
SqList L;
int n,i;
printf("请输入 n : ");
scanf("%d",&n);
Great_SqList(&L, n);
printf("请输入:\n[0]:最大值\n[1]:最小值\n");
scanf("%d",&i);
while((i < 0)||(i > 1))
{
printf("请输入:\n[0]:最大值\n[1]:最小值\n");
scanf("%d",&i);
}
#ifdef SWITCH_ON//switch 判断
printf("switch判断模式结果");
switch(i)
{
case 0:
{
max(&L);
}
break;
case 1:
{
min(&L);
}
break;
default:
break;
}
#else//函数指针数组
printf("函数指针数组模式结果");
(*handle[i])(&L);
#endif
}
测试结果:
图1.注释掉#define SWITCH_ON 1 测试结果 图2. 添加#define SWITCH_ON 1测试结果
总结:此处只是完成两个case情况的替换,并不能明显体现出函数指针数组的强大,但是当case情况达20多个甚至更多,或者多个函数需要如此处理,那么就能非常明显的体现出函数指针数组的优势。首先最明显的操作是减少了case语句对每种情况的列举,减少了编写代码时的工作量;其次程序运行过程中去除了判断情况的过程,将输入值i作为函数指针数组下标,直接调用函数指针,对于多种情况判断过程能明显提高运算速度。