/**
******************************************************************************
* @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作爲函數指針數組下標,直接調用函數指針,對於多種情況判斷過程能明顯提高運算速度。