这段时间一直在看C++相关的数据结构,感觉STL库的出现确实给C++实现一些基本的数据结构更加的方便,特别是map、list、set、vector的灵活运用能实现很多强大的数据结构,记得在一本书中曾经读到过“C++中算法的重要性没有C语言中那么明显,而是设计方法的问题”这句话的正确性有待于进一步的考察,但是面向对象中的更多的是依靠继承多态性实现多对象编程,而在C语言中更多的事依靠算法和数据结构。花了一晚上采用C语言实现了一个简单的集合操作,支持集合的创建,元素的查询,删除,支持集合的交集、差集、并集计算。

首先说明一下集合的ADT,肯定有包括基本的创建、删除操作。以及某一个元素的插入和删除操作。集合的一个重要特征就是元素的不重复性。这种方式我在实现的过程中通过链表管理一个集合,按照元素的大小进行排列,之所以排列主要是为了方便删除、查找元素的操作。实质上集合对元素的顺序是没有要求的。

集合的交集:是指两个集合元素相同的部分构成的集合。

集合的差集:是指其中一个集合中除去另一个集合相同元素以后剩余的元素构成的集合。

集合的并集:是指两个集合的所有元素构成的集合。

其中需要注意的就是集合的元素是不能重复的,本来我打算采用二叉查找树的方式实现,因为这种树型结构便于快速的查询,但是我采用元素的升序排序就能避免集合中漫无目的的查询操作。毕竟实现二叉查找树也增加了一个指针成员,而且还需要大量的操作。

简要的说明一下我的过程:

基本的集合结构体:本文引用地址:http://www.eepw.com.cn/article/201612/324526.htm

typedef struct linknode

{

struct linknode *next;

int value;

}Node_t, *Node_handle_t;

typedef struct set

{

unsigned int size;

Node_handle_t head;

}Set;

集合的创建,该函数的实现是集合实现的最复杂的一个函数,之所以这么复杂是因为很多的操作都是基于该函数完成的,当然也可以采用更精细的函数来实现,我开始的想法是将元素插入和创建操作合并,都基于一个函数进行操作,但是写完以后发现函数太长,而且比较烂,不够必将还是完成了一些基本的操作。采用了升序存储的方式,主要是为了后续的查找操作,注意链表的更新操作。

bool create_set(Set **sets, int data)

{

Set * temp = (Set *)malloc(sizeof(Set)/sizeof(char));

Node_t *node = NULL;

Node_t *head = NULL;

if(*sets == NULL)

{

temp->size = 0;

temp->head = NULL;

*sets = temp;

node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));

if(node != NULL)

{

node->next = NULL;

node->value = data;

/*更新集合指针*/

temp->head = node;

temp->size ++;

*sets = temp;

temp = NULL;

return true;

}

}

else/*已经存在部分集合*/

{

/******************************

采用顺序存储的方式插入新的元素

首先查找是否存在值,有不做任何操作

不存在,则按值大小找到合适的位置

******************************/

/*遍历*/

if((*sets)->head != NULL)

{

/*更新表头*/

if((*sets)->head->value > data)

{

node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));

if(node == NULL)

return false;

node->next = (*sets)->head;

node->value = data;

(*sets)->head = node;

(*sets)->size ++;

return true;

}

else if((*sets)->head->value == data)

{

return true;

}

/*从下一个节点开始*/

head = (*sets)->head;

node = head;

while(head->next != NULL)

{

/*已经存在*/

if(head->next->value == data)

{

return true;

}

/*找到合适的位置,并插入*/

else if(head->next->value > data)

{

node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));

if(node == NULL)

return false;

node->value = data;

node->next = head->next;

head->next = node;

(*sets)->size ++;

return true;

}

else

{

head = head->next;

}

}

/*说明以上不存在该值*/

node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));

if(node == NULL)

return false;

node->value = data;

node->next = NULL;

head->next = node;

(*sets)->size ++;

return true;

}

else

{

node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));

if(node == NULL)

return false;

node->value = data;

node->next = NULL;

(*sets)->head = node;

(*sets)->size ++;

return true;

}

}

return false;

}

查找、删除元素操作,充分利用了前面的升序存储关系。

C 语言用链表实现集合交并差,集合交差并三种操作的C实现相关推荐

  1. eja变送器故障代码al01_EJA差压变送器三种故障分析及常见种类

    EJA差压变送器三种故障分析及常见种类! EJA差压变送器故障,EJA差压变送器种类 前段时间小编由于工作原因对EJA差压变送器这块的技术知识就没有做太多的更新,为您带来的不变小编向您表示抱歉.闲话少 ...

  2. C# 集合交、并、差、去重,对象集合交并差

    关键词:C#  List 集合 交集.并集.差集.去重, 对象集合. 对象.引用类型.交并差.List<T> 有时候看官网文档是最高效的学习方式! 一.简单集合 Intersect 交集, ...

  3. c++语言定义排序函数,关于C++中定义比较函数的三种方法小结

    C++编程优与Pascal的原因之一是C++中存在STL(标准模板库).STL存在很多有用的方法. C++模板库中的许多方法都需要相关参数有序,例如Sort().显然,如果你想对一个集合进行排序,你必 ...

  4. python文件是什么的集合和抽象_python学习笔记(三):文件操作和集合

    这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件file.txt: 1 2 3 ...

  5. c语言规定 标识符由,C语言规定标识符只能由字母、数字和小数点三种字符组成。()...

    语言规由字现在招标则体面本原投标活动的基等方. 定标点 识符相等可以个不得到多少的积,1四相乘中任个数个数从3取两.年城入年乡居增额民收为(的比.上表中,收入最大居民城乡差额份为的年. 只能字和种字上 ...

  6. java二维数组如何传参_C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include void func(int n, char str[ ][5] ) { i ...

  7. c语言让数组地址对齐,C语言实现比特位数组在目标空间左右居中对齐三种方式...

    在LED行业中,一般一个灯亮或者不亮用一个bit位来表示(这里就不谈七彩或者灰度控制卡),假如我们屏幕大小是128点,相当于宽度16个字节,如果我们让两个汉字居中显示(两个汉字占宽度4个字节),很容易 ...

  8. 【C语言基础练习】有红、绿、蓝三种颜色的球各3个。现在将着9个球混合放在一个盒子中,从中任意摸出6个,编程计算摸出球的各种颜色搭配。

    有红.绿.蓝三种颜色的球各3个.现在将着9个球混合放在一个盒子中,从中任意摸出6个,编程计算摸出球的各种颜色搭配. 1 #include<stdio.h>2 int main()3 {4 ...

  9. 用C语言(无GUI)实现推箱子游戏,三种难度地图可选

    首先声明,这是本人编程实习课的大作业,肝了大半天,才算是完成了这么一个丑陋但功能尚且完善的小游戏. 笔者目前才大一,代码能力还不怎么样,写这个程序也没花太多时间.因此显然,代码在算法上应该还存在一定的 ...

  10. C语言实现ax^2+bx+c=0二元一次方程求解 三种情况

    使用判别式的方法解二元一次方程 ∆的三种情况都有 但还有很多优化空间,包括函数变量的调用,输出等等. #include <stdio.h> #include <math.h>i ...

最新文章

  1. 解决phpmyadmin 遇见的问题
  2. 读书笔记《Hadoop开源云计算平台》
  3. 大龄屌丝自学笔记--Java零基础到菜鸟--001
  4. c语言数码管的动态显示时间,8位数码管动态显示时间,可调节,调节的数闪烁显示...
  5. libuv 和 libev的对比
  6. 如何掌握眼神接触技巧?
  7. Shell笔记5——函数的知识与实践
  8. Visual Studio自定义调试窗体两个小技巧
  9. 通信原理及系统系列8—— 如何消除码间串扰
  10. 【Java】抽象类和接口
  11. 郭盛华为什么被称为国民校长?到底有什么来历?
  12. 计算机c盘红色,win7系统c盘空间不足变红了如何解决_windows7的C盘变成红色怎么办...
  13. 哈工大SCIR倾力打造NLP新书,详解预训练语言模型
  14. 定时器alarm函数
  15. 天猫四大独门利器,助力品牌引领消费趋势
  16. 二维码扫码登录的原理
  17. 使用uniapp架构开发小程序与web端的一些笔记啊哈哈!
  18. 如何做一个基于微信失物招领小程序毕业设计毕设作品
  19. 理解计算:从√2到AlphaGo ——第1季 从√2谈起
  20. (找规律)3 2 5 5 4 6 7 ? 金字塔

热门文章

  1. 【毕业季】作为一名大二计科在校生,我有话想说
  2. 去空格函数trim-C语言
  3. 信息安全软考—— 第五章 物理与环境安全技术 学习笔记
  4. 高电压技术-名词解释题
  5. Excel表中只能选择固定内容
  6. C语言循环语句的用法——while循环
  7. 马尔可夫(Markov)不等式
  8. 那些年Android开发遇到的坑(JNI 之 Illegal start byte 0xfe)
  9. Acer宏基笔记本FN快捷键大全
  10. 哪个云计算认证好?从市场角度浅析一下