(C语言)链表的实现集合的相关操作

原文链接:https://blog.csdn.net/kobe_jr/article/details/80543611

集合的特征:确定性/ 互异性/ 无序性。

常见的操作:1、查找集合中是否包含这个数据元素:Contains();

2、添加一个新成员数据,集合中不能存在这个元素。AddMember();

3、删除指定元素, 找到这个元素, 删除;如果没找到,则提示没找到,返回0(表示false)。Delete();

4、合并两个集合,不能有相同的元素。

5、求交集,找相同的元素。

6、求差集,例如:A{1, 2, 3}。B{2,4}。那么A相对B的差集就是{1,3}。

参考代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. // 利用单链表进行集合操作
  4. typedef int elementType;
  5. typedef struct node{
  6. elementType data;
  7. struct node *next;
  8. }SetNode; // 集合节点
  9. typedef struct{
  10. SetNode *first, *last;
  11. }LinkSet;// 链式集合
  12. //判断是否含有指定元素
  13. bool Contains(LinkSet &ls, elementType x){
  14. // if(ls.first == ls.last){// 判断是否是空表
  15. // return 0;
  16. // }
  17. // 移动指针 不需要创建的
  18. SetNode *p = ls.first->next;
  19. while(p != NULL && p->data < x){
  20. p = p->next;
  21. }
  22. if(p != NULL && p->data == x){
  23. return 1;
  24. }
  25. else return 0;
  26. }
  27. //链表的插入和删除必然需要找到前驱节点
  28. //增加一个新成员
  29. int addMember(LinkSet &ls, elementType x){
  30. //集合中不能有重复元素
  31. SetNode *p = ls.first->next;
  32. //前驱节点记录下来
  33. SetNode *pre = ls.first;
  34. while(p != NULL && p->data < x){
  35. pre = p;
  36. p = p->next;
  37. }
  38. if(p != NULL && p->data == x) return 0;// 存在插入失败
  39. // 创建一个新节点
  40. SetNode *s = (SetNode *)malloc(sizeof(SetNode));
  41. s->data = x;
  42. s->next = p;// p后面的接在新节点s后面
  43. pre->next = s;
  44. // 假如是插在末尾
  45. if(!p) ls.last = s;
  46. return 1;
  47. }
  48. // 删除指定节点
  49. int deleteMember(LinkSet &ls, elementType x){
  50. // 搜索节点
  51. SetNode *p = ls.first->next, *pre = ls.first;
  52. while(p != NULL && p->data < x){
  53. pre = p;
  54. p = p->next;
  55. }
  56. if(p != NULL & p->data == x){
  57. pre->next = p->next;
  58. if(p == ls.last) ls.last = pre;
  59. free(p);
  60. return 1;
  61. }
  62. else
  63. return 0; // 其他情况视为删除失败 :空集合 以及 不包含该元素
  64. }
  65. // 合并两个集合 : 相同元素删除
  66. void merge(LinkSet &lsA, LinkSet &lsB, LinkSet &lsC){
  67. SetNode *pa = lsA.first->next, *pb = lsB.first->next;
  68. SetNode *pc = lsC.first, *p;// 新的存储空间,存储两个链表的结果
  69. while(pa != NULL && pb != NULL){
  70. if(pa->data < pb->data){
  71. //理解为创建pc->next的这个节点
  72. pc->next = (SetNode *)malloc(sizeof(SetNode));
  73. pc->next->data = pa->data;// 放入到pc中去
  74. pa = pa->next;
  75. }
  76. else if(pa->data > pb->data){
  77. pc->next = (SetNode *)malloc(sizeof(SetNode));
  78. pc->next->data = pb->data;// 放入到pc中去
  79. pb = pb->next;
  80. }
  81. else if(pa->data == pb->data){// 重复元素随意放一个, 然后一起移动
  82. pc->next = (SetNode *)malloc(sizeof(SetNode));
  83. pc->next->data = pa->data;
  84. pa = pa->next;
  85. pb = pb->next;
  86. }
  87. // 不断的存储数据 ,pc的位置也要往后移动
  88. pc = pc->next;
  89. }
  90. // 可能还有集合没有做完
  91. p = (pa != NULL ) ? pa : pb;
  92. while(p != NULL){
  93. pc->next = (SetNode *)malloc(sizeof(SetNode));
  94. pc->next->data = p->data;// 放入到pc中去
  95. pc = pc->next;
  96. p = p->next;
  97. }
  98. // 对于一个链表来说, 一定要收尾
  99. pc->next = NULL;
  100. lsC.last = pc;
  101. }
  102. void print(LinkSet &ls){
  103. SetNode *p = ls.first;
  104. while(p->next != NULL){
  105. printf("%d ", p->next->data);
  106. p = p->next;
  107. }
  108. printf("\n");
  109. }
  110. int main(){
  111. LinkSet la, lb, lc;
  112. // 加一个头结点
  113. la.first = (SetNode *)malloc(sizeof(SetNode));
  114. la.first->next = NULL;
  115. lb.first = (SetNode *)malloc(sizeof(SetNode));
  116. lb.first->next = NULL;
  117. lc.first = (SetNode *)malloc(sizeof(SetNode));
  118. lc.first->next = NULL;
  119. addMember(la, 1);
  120. addMember(la, 2);
  121. addMember(la, 3);
  122. addMember(la, 4);
  123. addMember(la, 5);
  124. // 打印
  125. print(la);
  126. printf("%d\n", Contains(la, 5));
  127. printf("%d\n", Contains(la, 6));
  128. addMember(lb, 1);
  129. addMember(lb, 2);
  130. addMember(lb, 3);
  131. addMember(lb, 7);
  132. addMember(lb, 8);
  133. print(lb);
  134. deleteMember(lb, 3);
  135. print(lb);
  136. merge(la, lb, lc);
  137. print(lc);
  138. return 0;
  139. }

![在这里插入图片描述](https://img-blog.csdn.net/20180601223558789?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvYmVfanI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)


以上就是这篇的主要内容,欢迎您提出意见。谢谢!让我们共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | Understanding Black-box Predictions via Influence Func

Cite: Koh P W, Liang P. Understanding black-box predictions via influence functions[J]. arXiv preprint arXiv:1703.04730, 2017.链接&#xff1a;https://arxiv.org/pdf/1703.04730GitHub项目地址&#xff1a;http://bit.ly/gt-influence本文使用影响函数(Influence fun…

ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;苏剑林&#xff08;来自追一科技&#xff0c;人称“苏神”&#xff09;前言需要许多时间步计算的循环神经网络&#xff0c;如LSTM、GRU&#xff0c;往往存在梯度爆炸的问题。其目标函数可能存在悬崖一样斜率较大的区域&…

快手高级Java四轮面试题:设计模式+红黑树+Java锁+Redis等

快手Java一面&#xff08;一个小时十分钟&#xff09; 1.自我介绍 2.说说B树和B树的区别&#xff0c;优缺点等&#xff1f; 3聊聊Spring&#xff0c;主要IOC等等 4多线程JUC包下的一些常见的类&#xff0c;比如CountDownLatch、Semaphore等 5.锁的概念&#xff0c;锁相关的…

数据结构--跳表SkipList

对单链表查找一个元素的时间复杂度是 O(n)通过对链表建立多级索引的结构&#xff0c;就是跳表&#xff0c;查找任意数据、插入数据、删除数据的时间复杂度均为 O(log n)前提&#xff1a;建立了索引&#xff0c;用空间换时间的思路(每两个节点建立一个索引)索引节点总和 n/2n/4n…

领域词汇知识库的类型、可用资源与构建技术漫谈

词是语言系统中重要的语言单元&#xff0c;词语是开展文本处理的基础&#xff0c;在语义表示上具有比字符更丰富的表达能力。词语具有领域特性&#xff0c;不同的领域具有不同的词汇体系&#xff0c;如军事领域、医疗领域、公共治安领域、金融领域之间存在着很大的差异性。这种…

C语言实现的数据结构之------哈希表

原文链接&#xff1a;https://blog.csdn.net/smstong/article/details/51145786 哈希表原理 这里不讲高深理论&#xff0c;只说直观感受。哈希表的目的就是为了根据数据的部分内容&#xff08;关键字&#xff09;&#xff0c;直接计算出存放完整数据的内存地址。 试想一下&a…

论文浅尝 | EARL: Joint Entity and Relation Linking for QA over KG

Mohnish Dubey, Debayan Banerjee, Debanjan Chaudhuri, Jens Lehmann: EARL: Joint Entity and Relation Linking for Question Answering over Knowledge Graphs. International Semantic Web Conference (1) 2018: 108-126链接&#xff1a;https://link.springer.com/conten…

百度高级Java三面题目!涵盖JVM +Java锁+分布式等

百度高级Java一面 自我介绍 对象相等的判断&#xff0c;equals方法实现。 Hashcode的作用&#xff0c;与 equal 有什么区别&#xff1f; Java中CAS算法&#xff1f; G1回收器讲一下&#xff1f; HashMap&#xff0c;ConcurrentHashMap与LinkedHashMap的区别 如何在多线程环…

python--从入门到实践--chapter 12 pygame_Alien_Invasion

安装pygame包&#xff0c;把安装好的包copy一份到pycharm工程目录下&#xff0c;不然找不到pygame包 抄一遍书上的代码&#xff1a; settings.py class Settings():def __init__(self):self.screen_width 1200self.screen_height 800self.bg_color (255, 255, 255)self.s…

实时事理学习与搜索平台DemoV1.0正式对外发布

我们团队探索了一种将事件、概念、逻辑、实时学习、多类知识库实时更新串起来的知识服务新模式。一个面向事理的实时学习和搜索系统Demo&#xff0c;取名叫“学迹”&#xff0c;取自“学事理&#xff0c;知行迹”。 项目地址&#xff1a;https://xueji.zhiwenben.com 一、 “学…

卖萌屋算法工程师思维导图part3—深度学习篇

卖萌屋的妹子们&#xff08;划掉&#xff09;作者团整理的算法工程师思维导图&#xff0c;求职/自我提升/查漏补缺神器。该手册一共分为数据结构与算法、数学基础、统计机器学习和深度学习四个部分。下面是第三部分深度学习的内容~公众号后台回复【思维导图】获取完整手册&…

1.3 字符串的全排列

字符串的全排列 题目描述&#xff1a;输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。例如&#xff0c;输入字符串“abc”&#xff0c;则输出由字符‘a’&#xff0c;‘b’&#xff0c;‘c’所能排列出来的所有字符串“abc”&#xff0c;“acb”&#xff0c;“bac…

论文浅尝 | Zero-Shot Transfer Learning for Event Extraction

事件抽取的目标是在非结构化的文本中确认事件的触发词&#xff08;Eventtrigger&#xff09;和参与者&#xff08;Event argument&#xff09;&#xff0c;并判断触法词的事件类型&#xff08;Eventtype&#xff09;&#xff0c;判断参与者在事件中的扮演的角色&#xff08;Arg…

今日头条Java后台Java研发三面题目

最近有同学在优知学院留言区留言是否能发布今日头条的面试题目&#xff0c;这位同学&#xff0c;题目来了哦~ 一面 concurrent包下面用过哪些&#xff1f; countdownlatch功能实现 synchronized和lock区别&#xff0c;重入锁 thread和runnable的区别 AtomicInteger实现原理…

实时事理逻辑知识库(事理图谱)终身学习项目-EventKGNELL(学迹)

EventKGNELL EventKGNELL, event knowlege graph never end learning system, a event-centric knowledge base search system&#xff0c;实时事理逻辑知识库终身学习和事件为核心的知识库搜索项目。包括事件概念抽取、事件因果逻辑抽取、事件数据关联推荐与推理。 项目地址&…

python--从入门到实践--chapter 15 16 17 生成数据/下载数据/web API

1.随机漫步 random_walk.py from random import choice class RandomWalk():def __init__(self, num_points5000):self.num_points num_pointsself.x_value [0]self.y_value [0]def fill_walk(self):while len(self.x_value) < self.num_points:x_direction choice([1…

写文章 银行国企技术岗面经+总结:适合自己的才是最好的

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/37842198 银行&国企技术岗面经总结&#xff1a;适合自己的才是最好的本人某985计算机水硕&#xff0c;技术水平非常一般。自去年暑假找工作以来&#xff0c;经历了互联网、银行、国企等各类企业的招聘&#xff0c;最终进…

ACL2020 | 基于Knowledge Embedding的多跳知识图谱问答

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;舒意恒&#xff08;南京大学硕士生&#xff0c;知识图谱方向&#xff09;背景什么是知识图谱问答&#xff1f;知识图谱&#xff08;KG&#xff09;是一个多关系图&#xff0c;其中包含数以百万计的实体&#xff0c;以及…

论文浅尝 | 基于超平面的时间感知知识图谱嵌入

链接&#xff1a;http://talukdar.net/papers/emnlp2018_HyTE.pdf本文主要关注 KG embedding 中三元组成立的时间有效性问题&#xff0c;比如三元组(Cristiano Ronaldo, playsFor, Manchester United)&#xff0c;其成立的有效时间段是2003年到2009年&#xff0c;这个使三元组有…

Java面试进阶:Dubbo、Zookeeper面试题锦集

Dubbo面试题锦集 1、默认也推荐使用netty框架&#xff0c;还有mina。 2、默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 3、推荐使用zookeeper注册中心&#xff0c;还有redis等不推荐。 4、默认使用Hessian序列化&#xff0c;还有Duddo、FastJ…