我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言如何实现通用数据结构中的通用集合

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言如何实现通用数据结构中的通用集合

本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表

注意集合中只存储了指针,没有储存实际的数据。

对于新的数据类型来说,需要自定义HashCode函数和equal函数。

下面还给出了几个常见的hashCode函数和equal函数。

(1)HashCode函数

头文件

#ifndef MYHASHCODE_H_INCLUDED#define MYHASHCODE_H_INCLUDED #include <string.h> #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

源文件

#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函数

头文件

#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

源文件

#include "myEqual.h"#include <string.h> //默认的相等的方法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 <stdlib.h>//创建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)测试文件

#include <stdio.h>#include <stdlib.h>#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<S; i++)    {        myHashSetAddData(set, strs[i]);    }     //输出大小    printf("size=%d\n",myHashSetGetSize(set));     //测试删除    myHashSetRemoveData(set,"qq");    myHashSetRemoveData(set,"ab");    myHashSetRemoveData(set,"qwert");     //输出大小    printf("after remove size=%d\n",myHashSetGetSize(set));     //遍历    MyHashSetIterator * it = createMyHashSetIterator(set);    while(myHashSetIteratorHasNext(it))    {        char * pp= myHashSetIteratorNext(it);        puts(pp);    }    //释放遍历器    freeMyHashSetIterator(it);     //释放集合    freeMyHashSet(set);    return 0;}

上述内容就是C语言如何实现通用数据结构中的通用集合,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言如何实现通用数据结构中的通用集合

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言如何实现通用数据结构中的通用集合

本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表注意集合
2023-06-21

C语言如何实现通用数据结构中的通用椎栈

今天就跟大家聊聊有关C语言如何实现通用数据结构中的通用椎栈,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为大家分享了C语言实现通用数据结构之通用椎栈的具体代码,具体内容如下这是在通用
2023-06-21

从入门到精通:Go语言中常用数据结构的代码实现

标题:从入门到精通:Go语言中常用数据结构的代码实现数据结构在编程中起着至关重要的作用,它是程序设计的基础。在Go语言中,有许多常用的数据结构,掌握这些数据结构的实现方式对于成为一名优秀的程序员至关重要。本文将介绍Go语言中常用的数据结构
从入门到精通:Go语言中常用数据结构的代码实现
2024-03-04

如何进行数据结构C语言链表的实现

这篇文章将为大家详细讲解有关如何进行数据结构C语言链表的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言需要用到的函数库#include#include
2023-06-22

C语言中的结构体如何使用

本篇内容介绍了“C语言中的结构体如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构体的声明结构体的定义:结构体是一些值的集合,这些值
2023-07-02

Qt数据库应用中如何实现通用数据库采集

小编给大家分享一下Qt数据库应用中如何实现通用数据库采集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言数据库采集对应的就是上一篇文章的数据库同步,数据库同
2023-06-29

如何使用C语言实现本地socke通讯

这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使用本地socket通讯可以实现进程之间的通讯。  相关函数描
2023-06-22

C语言中如何利用哈希表实现通讯录

这篇“C语言中如何利用哈希表实现通讯录”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中如何利用哈希表实现通讯录”文章吧
2023-06-16

C语言中的结构体内嵌函数如何使用

今天小编给大家分享一下C语言中的结构体内嵌函数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言的结构体内嵌函数看
2023-07-05

C语言数据结构中的线性表怎么使用

这篇文章主要介绍“C语言数据结构中的线性表怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据结构中的线性表怎么使用”文章能帮助大家解决问题。一、分文件编写1、分文件编写概念在Visua
2023-06-30

如何使用C语言代码实现通讯录功能

今天小编给大家分享一下如何使用C语言代码实现通讯录功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先创建一个test.c
2023-07-02

如何使用C++中的数据结构函数?

如何使用C++中的数据结构函数?数据结构是计算机科学中的重要概念,它涉及如何组织和存储数据以便有效地访问和操作。C++是一种强大的编程语言,提供了许多内置的数据结构函数,开发人员可以使用这些函数来创建、操作和管理不同类型的数据结构。在本文中
如何使用C++中的数据结构函数?
2023-11-18

如何理解C语言数据结构中线性表的链式存储结构

如何理解C语言数据结构中线性表的链式存储结构,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.什么是线性表的链式存储结构 —链表存储结点:包括元素本身的信息,还有元素之间的关系
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录