首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请教:在C语言当中,怎么实现枚举类型和对应的数据的一个结构的可维护性

2012-03-30 
请问:在C语言当中,如何实现枚举类型和对应的数据的一个结构的可维护性?是这样,我在编程当中,经常要将一个

请问:在C语言当中,如何实现枚举类型和对应的数据的一个结构的可维护性?
是这样,我在编程当中,经常要将一个枚举型和一个对应该枚举型的数据进行操作,因为该枚举型的数据的加入如果是随机的话,那么我一直用查找来进行的,比如有这样一个枚举型
enum 
{
  member1,
  member2,
  ...
  membern,
}enum_a;
因为对应这些枚举型,有对应的数据,为了操作,一般我将枚举型和对应的数据糅合在一起定义为结构,比如这样
struct data_str data_process[]=
{  
  {member4,data1},
  {member5,data2},
  {member6,data3},
  ...
};
这样定义以后,为了在数组当中引用到对应的data,我用查找对应的枚举常量,来找出对应的数据data。但是,这样找的话,很费时间,因为要查询。
另外,如果是规则的定义的话,比如:
struct data_str data_process[]=
{  
  {member1,data1},
  {member2,data2},
  {member3,data3},
  ...
};
不用查询,很快,但是维护并不方便,因为也许有一天我要删除其中的一个数据,那么必须删除对应的枚举列表当中的成员以及该数组当中的条目,另外,枚举列表很大的话,很容易对错。请问一下,在C语言当中有没有即不用管枚举列表,也不用查询的方法,如果能这样实现就好了。

PS:类似于能构在一个数组当中直接定义对应的枚举型列表,那样看起来也方便,也不用维护这个枚举列表了。

[解决办法]
路过,学习
[解决办法]
根据关键字 membern 求出hash值:
hashValue = hashFunc(membern);

按照这个hashValue把{membern,datan}放在数组data_process[]中
要用的时候再重新求一次hashValue

hashFunc需要根据你的数据特点找一个合适的hash算法。

其实你第一种查找也可以接受了,membern是递增的,用折半查找,复杂度也自由log(n)/lon(2)

[解决办法]
什么是hash表?
简单来说,hash就是找到一种数据内容和数据存放地址之间的映射关系。比如,由若干字符串要存放到一个哈西表中,希望能够在O(1)的时间内在表中定位某个特定的字符串,我们可以用数组来实现哈西表,找到某种函数sting -> integer,记为 p = f(s),其中p是一个整数,s是一个字符串,p就是字符串s在数组中的下标。这样如果需要在数组中定位s,只要直接根据函数p=f(s)就可以计算s的位置。在哈西表中添加一个字符串也类似,根据字符串的值计算出其应该存放在数组中的位置,然后将字符串放入。但是这种函数(称为哈西函数)很难找,找到一个一一对应的函数几乎不可能,所以经常采用非一一对应的哈西函数。比如对于上面的例子,我们可以设计一个简单的哈西函数,我们设f(s)定义为s的各个字符的Ascii码的和除以n的余数,这里n是我们的数组的长度,我们假设了哈西表中最多需要存储n个元素。但是这个哈西函数有个显而易见的缺点,比如对于字符串s1= "abc"和s2="acb",显然计算出来的哈西函数值都是一样的,但是一个位置上只能存放一个元素,如果先将s1放入哈西表的位置p1,再将s2放入哈西表,这时候因为计算出p2=f(s2) = p1,所以s2应该放置的位置已经被s1占据了,所以就出现了麻烦。这就叫做“冲突”。解决这个冲突的一个简单的办法是,因为p1已经被s1占据,我们就看p1+1,如果该位置为空,则放入s2,否则继续看p1+2,……一直找到一个空位。假设我们将s2放在p1+1,但是这时候要加入s3,而f(s3)恰好等于p1+1,s3的位置又被s2占据了,我们可以继续看p1+2,p1+3……是否为空,直到找到一个空位放入s3,依此类推。在查找s2的时候,我们先根据f(s2)计算出s2应该在p1位置上,然后我们看p1位置上的元素,发现不是s2(该位置上是s1),于是我们继续看p1+1,p1+2,……一直到找到s2,或者到表尾,或者发现一个空位就可以中止了,后两种情况表示s2不在表中。显而易见,如果冲突发生的太多的话,哈西表的效率会下降。事实上我刚才举的例子中的哈西函数很不好,所以冲突发生的可能性很大。如果找一个比较好的哈西函数,哈西表的效率还是很高的。至于找哈西函数的方法,要根据具体的数据类型和应用场合来分析,也有一些原则,这里就不一一介绍了~~
---来自CSDN文档中心 

[解决办法]
同意三楼的gr。推荐用switch....case。这样偶感觉简单,维护程序也方便。

热点排行