C语言如何实现通用数据结构中的通用集合
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这是在通用链表的基础上实现的集合,关于链表的实现参见:
千家信息网最后更新 2025年11月07日C语言如何实现通用数据结构中的通用集合
本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表
注意集合中只存储了指针,没有储存实际的数据。
对于新的数据类型来说,需要自定义HashCode函数和equal函数。
下面还给出了几个常见的hashCode函数和equal函数。
(1)HashCode函数
头文件
/**************************** File myHashCode.h**************************/#ifndef MYHASHCODE_H_INCLUDED#define MYHASHCODE_H_INCLUDED #include#define HASHCODE_MULT 31 //默认的hashCodeint myHashCodeDefault(void * a); //int类型hashCodeint myHashCodeInt(void * a); //char类型的hashCodeint myHashCodeChar(void * a); //string类型的hashCodeint myHashCodeString(void * a); #endif // MYHASHCODE_H_INCLUDED
源文件
/**************************** File myHashCode.c**************************/#include "myHashCode.h" //默认的hashCodeint myHashCodeDefault(void * a){ return (int) a;} //int类型hashCodeint myHashCodeInt(void * a){ int * aa = (int *) a; return *aa;} //char类型的hashCodeint myHashCodeChar(void * a){ char *aa = (char *) a; return *aa;} //string类型的hashCodeint myHashCodeString(void * a){ int re = 0; char *aa = (char *) a; while (*aa) { re += HASHCODE_MULT * *aa; aa++; } return re;}(2)equal函数
头文件
/**************************** File myEqual.h**************************/#ifndef MYEQUAL_H_INCLUDED#define MYEQUAL_H_INCLUDED //默认的相等的方法int myEqualDefault(void * a, void *b); //int类型相等的方法int myEqualInt(void * a, void *b); //char类型相等的方法int myEqualChar(void * a, void *b); //string类型相等的方法int myEqualString(void * a, void *b); #endif // MYEQUAL_H_INCLUDED
源文件
/**************************** File myEqual.c**************************/#include "myEqual.h"#include//默认的相等的方法int myEqualDefault(void * a, void *b){ return a == b;} //int类型相等的方法int myEqualInt(void * a, void *b){ int *aa = (int*) a; int *bb = (int *) b; return *aa == *bb;} //char类型相等的方法int myEqualChar(void * a, void *b){ char *aa = (char *) a; char *bb = (char *) b; return *aa = *bb;} //string类型相等的方法int myEqualString(void * a, void *b){ char *aa = (char *) a; char *bb = (char *) b; return strcmp(aa, bb)==0;}
(3)HashSet
头文件
#ifndef MYHASHSET_H_INCLUDED#define MYHASHSET_H_INCLUDED # include "myHashMap.h" typedef struct myHashSet{ int size; //大小 int initialCapacity; //初始容量 float loadFactor; //加载因子 int (*hashCode)(void *data); int (*equal)(void *data1, void *data2); MyList ** dataList;} MyHashSet; typedef struct myHashSetIterator{ int index; //第几个链表 MyHashSet *set; MyNode *current; int count; //第几个数据} MyHashSetIterator; //创建HashSetMyHashSet *createMyHashSet(int (*hashCode)(void *data),int (*equal)(void *data1,void *data2)); //使用全部参数创建HashSetMyHashSet *createMyHashSetForAll(int initialCapacity,float loadFactor,int (*hashCode)(void *data),int (*equal)(void *data1,void *data2)); //释放HashSetvoid freeMyHashSet(MyHashSet * set); //是否包含某个dataint myHashSetContains(MyHashSet * const set, void * const data); //增加一条数据,返回是否添加成功int myHashSetAddData(MyHashSet * const set, void * const data); //数据的容量int myHashSetGetSize(const MyHashSet * const set); //创建迭代器MyHashSetIterator* createMyHashSetIterator(MyHashSet * const set); //释放迭代器void freeMyHashSetIterator(MyHashSetIterator* iterator); //迭代器是否有下一个int myHashSetIteratorHasNext(MyHashSetIterator* iterator); //遍历下一个元素void* myHashSetIteratorNext(MyHashSetIterator* iterator); //删除一条数据,返回是否删除成功int myHashSetRemoveData(MyHashSet * const set, void * const data); //将第二个Set的全部对象加入到第一个,返回增加的个数int myHashSetAddAllSet(MyHashSet * set,MyHashSet *other); //复制HashSetMyHashSet* myHashSetCopy(MyHashSet * set); //遍历void myHashSetOutput(MyHashSet *set, void(*pt)(void*)); #endif // MYHASHSET_H_INCLUDED源文件
# include "myHashSet.h"#include//创建HashSetMyHashSet *createMyHashSet(int(*hashCode)(void *data), int(*equal)(void *data1, void *data2)){ MyHashSet *re = malloc(sizeof(MyHashSet)); re->size = 0; re->loadFactor = DEFAULT_LOAD_FACTOR; re->initialCapacity = DEFAULT_INITIAL_CAPACITY; re->dataList = (MyList **) malloc(sizeof(MyList*) * re->initialCapacity); re->hashCode = hashCode; re->equal = equal; for (int i = 0; i < re->initialCapacity; i++) { re->dataList[i] = createMySearchList(equal); } return re;} //使用全部参数创建HashSetMyHashSet *createMyHashSetForAll(int initialCapacity, float loadFactor, int(*hashCode)(void *data), int(*equal)(void *data1, void *data2)){ MyHashSet *re = createMyHashSet(hashCode, equal); re->initialCapacity = initialCapacity; re->loadFactor = loadFactor; return re;} //释放HashSetvoid freeMyHashSet(MyHashSet * set){ for (int i = 0; i < set->initialCapacity; i++) { freeMyList(set->dataList[i]); } free(set->dataList); free(set);} //是否包含某个dataint myHashSetContains(MyHashSet * const set, void * const data){ int hasCode = (*(set->hashCode))(data); hasCode %= set->initialCapacity; if (hasCode<0) hasCode+=set->initialCapacity; int re = myListFindDataIndex(set->dataList[hasCode], data); return re > -1;} void rebuildMyHashSet(MyHashSet * set){ int newSize = set->initialCapacity * 2; MyList **newdataList = (MyList **) malloc(sizeof(MyList*) * newSize); for (int i = 0; i < newSize; i++) { newdataList[i] = createMyList(); } MyHashSetIterator* it = createMyHashSetIterator(set); while (myHashSetIteratorHasNext(it)) { void * data = myHashSetIteratorNext(it); int hasCode = (*(set->hashCode))(data); hasCode %= newSize; myListInsertDataAtLast(newdataList[hasCode], data); } freeMyHashSetIterator(it); for (int i = 0; i < set->initialCapacity; i++) { freeMyList(set->dataList[i]); } free(set->dataList); set->dataList = newdataList; set->initialCapacity = newSize;} //增加一条数据,返回是否添加成功int myHashSetAddData(MyHashSet * const set, void * const data){ int hasCode = (*(set->hashCode))(data); hasCode %= set->initialCapacity; if (hasCode<0) hasCode+=set->initialCapacity; int re = myListFindDataIndex(set->dataList[hasCode], data); if (re == -1) { myListInsertDataAtLast(set->dataList[hasCode], data); (set->size)++; if (set->size > set->initialCapacity * set->loadFactor) { rebuildMyHashSet(set); } return 1; } return 0;} //数据的容量int myHashSetGetSize(const MyHashSet * const set){ return set->size;} //创建迭代器MyHashSetIterator* createMyHashSetIterator(MyHashSet * const set){ MyHashSetIterator* re = (MyHashSetIterator*) malloc( sizeof(MyHashSetIterator)); re->count = 0; re->index = 0; re->set = set; re->current = set->dataList[0]->first; return re;} //释放迭代器void freeMyHashSetIterator(MyHashSetIterator* iterator){ free(iterator);} //迭代器是否有下一个int myHashSetIteratorHasNext(MyHashSetIterator* iterator){ return iterator->count < iterator->set->size;} //遍历下一个元素void* myHashSetIteratorNext(MyHashSetIterator* iterator){ (iterator->count)++; while (!(iterator->current)) { (iterator->index)++; iterator->current = iterator->set->dataList[iterator->index]->first; } void * re = iterator->current->data; iterator->current = iterator->current->next; return re;} //删除一条数据,返回是否删除成功int myHashSetRemoveData(MyHashSet * const set, void * const data){ int hasCode = (*(set->hashCode))(data); hasCode %= set->initialCapacity; if (hasCode<0) hasCode+=set->initialCapacity; int re = myListRemoveDataObject(set->dataList[hasCode], data); if (re) { (set->size)--; } return re;} //将第二个Set的全部对象加入到第一个,返回增加的个数int myHashSetAddAllSet(MyHashSet * set,MyHashSet *other){ int ssize=set->size; MyHashSetIterator * it=createMyHashSetIterator(other); while (myHashSetIteratorHasNext(it)) { myHashSetAddData(set,myHashSetIteratorNext(it)); } freeMyHashSetIterator(it); int re=set->size-ssize; return re;} //复制HashSetMyHashSet* myHashSetCopy(MyHashSet * set){ MyHashSet* re=createMyHashSetForAll(set->initialCapacity,set->loadFactor,set->hashCode,set->equal); myHashSetAddAllSet(re,set); return re;} //遍历void myHashSetOutput(MyHashSet *set, void(*pt)(void*)){ MyHashSetIterator * it=createMyHashSetIterator(set); while (myHashSetIteratorHasNext(it)) { pt(myHashSetIteratorNext(it)); } freeMyHashSetIterator(it);}
(4)测试文件
/**************************** File main.c*** test for MyHashSet**************************/#include#include #include "myEqual.h"#include "myHashCode.h"#include "myHashSet.h" #define S 10 char* strs[S]={ "abc", "qq", "hello", "abc", "lmy", "ab", "qq", "lqw", "sww", "lqw"}; int main(){ //创建集合需要指定两个函数,hashCode函数和equal函数。 MyHashSet * set = createMyHashSet(myHashCodeString, myEqualString); //插入数据 for (int i=0; i 上述内容就是C语言如何实现通用数据结构中的通用集合,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
数据
类型
函数
方法
迭代
成功
文件
数据结构
结构
语言
大小
容量
源文件
个数
元素
内容
参数
对象
技能
知识
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电脑使用和网络安全制度
济南哪里有学习网络技术的
星耀棋牌协调服务器
关系数据库的关系体现在哪
千方百剂安装数据库
最美警察保护网络安全
怎么备份数据库到u盘
家庭服务器安全吗
日本网络安全官网
苹果软件开发者授信
内网服务器地址
网络安全专家智库
软件开发现状调查报告
嘉定区网络技术咨询费用
java备份数据库表工具
暨大网络安全专业
网络安全检查考察制度
档案局网络安全法贯彻实施
软件开发人员有退休工资吗
西山区创新软件开发市场价
湘潭企业存储服务器找哪家
华三服务器修改为PXE启动
吴江小学生网络安全
系统仿真软件开发项目
四川预算管理软件开发商
常见的物流网络技术
php 服务器接口开发
软件开发包括什么科目
互联网软件开发总监简历表格
互联网政府网络安全防护