返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言如何实现通用数据结构中的通用集合
  • 292
分享到

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

2023-06-21 20:06:46 292人浏览 安东尼
摘要

本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这是在通用链表的基础上实现的集合,关于链表的实现参见: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语言如何实现通用数据结构中的通用集合,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言如何实现通用数据结构中的通用集合

本文链接: https://lsjlt.com/news/300612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言如何实现通用数据结构中的通用集合
    本篇文章为大家展示了C语言如何实现通用数据结构中的通用集合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表注意集合...
    99+
    2023-06-21
  • C语言实现通用数据结构之通用集合(HashSet)
    这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表 注意集合中只存储了指针,没有储存实际的数据。 对于新的数据类型来说,需要自定义HashCode...
    99+
    2024-04-02
  • C语言如何实现通用数据结构中的通用椎栈
    今天就跟大家聊聊有关C语言如何实现通用数据结构中的通用椎栈,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为大家分享了C语言实现通用数据结构之通用椎栈的具体代码,具体内容如下这是在通用...
    99+
    2023-06-21
  • C语言实现通用数据结构之通用链表
    本文实例为大家分享了c语言实现通用数据结构之通用链表的具体代码,供大家参考,具体内容如下 忽然想起来,大概在两年之前学习C语言的时候,曾经用C语言写过一些通用的数据结构。主要也就实现...
    99+
    2024-04-02
  • C语言实现通用数据结构之通用椎栈
    本文实例为大家分享了C语言实现通用数据结构之通用椎栈的具体代码,供大家参考,具体内容如下 这是在通用链表的基础上实现的椎栈,关于链表的实现参见:C语言实现通用数据结构之通用链表 。 ...
    99+
    2024-04-02
  • C语言实现通用数据结构之通用映射(HashMap)
    本文实例为大家分享了C语言实现通用数据结构之通用映射的具体代码,供大家参考,具体内容如下 这是在通用链表的基础上实现的映射,关于链表的实现参见:C语言实现通用数据结构之通用链表。 注...
    99+
    2024-04-02
  • 从入门到精通:Go语言中常用数据结构的代码实现
    标题:从入门到精通:Go语言中常用数据结构的代码实现 数据结构在编程中起着至关重要的作用,它是程序设计的基础。在Go语言中,有许多常用的数据结构,掌握这些数据结构的实现方式对于成为一名...
    99+
    2024-03-04
    数据类型 数据结构 代码示例 go语言
  • C利用语言实现数据结构之队列
    目录一、链队列二、链队的表示三、链队的基本操作1. 链队的初始化2. 链队的销毁3. 入队4. 出队四、顺序队列五、循环队列1. 初始化2. 求队列长度3. 入队4. 出队 前言: ...
    99+
    2024-04-02
  • 用C语言实现通讯录
    相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息。通讯录的主要功能有:增加、删除、查找、排序、修改、展示等操作。 那么具体应该用C语言怎么实现这个呢?接下来...
    99+
    2024-04-02
  • 如何进行数据结构C语言链表的实现
    这篇文章将为大家详细讲解有关如何进行数据结构C语言链表的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言需要用到的函数库#include<stdio.h>#include&...
    99+
    2023-06-22
  • C语言如何实现UDP通信
    这篇文章主要介绍了C语言如何实现UDP通信的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现UDP通信文章都会有所收获,下面我们一起来看看吧。UDP通信UDP是一种无连接的尽最大努力交付的不可靠连接,...
    99+
    2023-07-02
  • Qt数据库应用中如何实现通用数据库采集
    小编给大家分享一下Qt数据库应用中如何实现通用数据库采集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言数据库采集对应的就是上一篇文章的数据库同步,数据库同...
    99+
    2023-06-29
  • Java语言如何实现数据结构栈
    这篇文章主要介绍了Java语言如何实现数据结构栈,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先了解下栈的概念:栈是限定仅在表头进行插入和删除操作的线性表。有时又叫LIFO...
    99+
    2023-05-30
    java
  • 如何通过容器实现复杂的数据结构?
    在计算机科学中,数据结构是指组织和存储数据的方式。复杂的数据结构可以用于解决各种问题,例如图形算法、自然语言处理、机器学习等。本文将介绍如何通过容器实现复杂的数据结构,并提供一些演示代码。 容器是一种数据类型,用于存储和组织数据。C++中...
    99+
    2023-06-01
    leetcode 编程算法 容器
  • C语言中的结构体如何使用
    本篇内容介绍了“C语言中的结构体如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构体的声明结构体的定义:结构体是一些值的集合,这些值...
    99+
    2023-07-02
  • C语言中如何利用哈希表实现通讯录
    这篇“C语言中如何利用哈希表实现通讯录”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中如何利用哈希表实现通讯录”文章吧...
    99+
    2023-06-16
  • 如何使用C语言实现本地socke通讯
    这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使用本地socket通讯可以实现进程之间的通讯。  相关函数描...
    99+
    2023-06-22
  • C语言中结构体如何使用
    今天就跟大家聊聊有关C语言中结构体如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、关于结构体在C语言中,结构体(struct)指的是一种数...
    99+
    2024-04-02
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-03-01
    c语言
  • 如何使用C语言实现平衡二叉树数据结构算法
    目录前言一、平衡二叉树实现原理二、平衡二叉树实现算法三、全部代码前言 对于一个二叉排序树而言 它们的结构都是根据了二叉树的特性从最左子树开始在回到该结点上继续往右结点走 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作