c语言代码用顺序表求两集合交集

时间: 2024-05-13 15:15:40 浏览: 203

假设两个集合A和B已经存储在顺序表中,可以按照以下步骤求它们的交集:

1.定义一个新的顺序表C,用于存储交集结果; 2.遍历集合A,对于A中的每个元素,遍历集合B,查找是否存在相同的元素,若存在则将该元素插入到C中; 3.遍历完成后,C中存储的即为A和B的交集。

以下是求两集合交集的C语言代码实现:

#include <stdio.h>

#define MAXSIZE 100

// 定义顺序表
typedef struct {
    int data[MAXSIZE];
    int length;
} SqList;

// 初始化顺序表
void InitList(SqList *L) {
    L->length = 0;
}

// 插入元素
void InsertElem(SqList *L, int elem) {
    if (L->length >= MAXSIZE) {
        printf("List is full!\n");
        return;
    }
    L->data[L->length] = elem;
    L->length++;
}

// 求两集合交集
void GetIntersection(SqList *A, SqList *B, SqList *C) {
    InitList(C);
    int i, j;
    for (i = 0; i < A->length; i++) {
        for (j = 0; j < B->length; j++) {
            if (A->data[i] == B->data[j]) {
                InsertElem(C, A->data[i]);
                break;
            }
        }
    }
}

// 输出顺序表元素
void PrintList(SqList *L) {
    int i;
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

int main() {
    SqList A = {{1, 3, 5, 7, 9}, 5};
    SqList B = {{2, 3, 5, 7, 8}, 5};
    SqList C;
    GetIntersection(&amp;A, &amp;B, &amp;C);
    printf("A ∩ B: ");
    PrintList(&amp;C);
    return 0;
}

输出结果为:

A ∩ B: 3 5 7
向AI提问 loading 发送消息图标

相关推荐

docx
交集和并集的线性算法(原创) 对于给定的集合,使用哈希表可以在线性时间复杂度内得到他们的交集和并集,具体说明如下: 假设有集合A={1, 7, 5, 13, 9, 10, 11}, B={5, 7, 10, 1, 18, 12}, 1)交集,需要得到结果:A∩B={1, 5, 7,10} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示集合中数字的值,其值(VALUE)表示集合中数字出现的次数 ②遍历集合A,将集合中的每个数字(KEY)插入哈希表,每个数字的出现次数(VALUE)设置为1 ③遍历集合B,对于集合中的每个数字: 如果哈希表中已经存在该数字,将对应的VALUE改为2 如果哈希表中不存在该数字,忽略 ④遍历哈希表,输出VALUE为2的数字,即得到A和B的交集 2) 并集,需要得到结果:AUB={1,5,7,9,10,11,12,13,18} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示集合中数字的值,其值(VALUE)可以无视 ②遍历集合A,将集合中的每个数字(KEY)插入哈希表 ③遍历集合B,对于集合中的每个数字: 如果哈希表中已经存在该数字,忽略 如果哈希表中不存在该数字,将这个数字插入哈希表 ④遍历哈希表,输出哈希表中的每个KEY,即为A和B的并集 上面以集合为例说明了交集和并集的法,事实上,上述算法可以很方便的扩展到3个或3个以上的集合交集并集。另外并集时,由于哈希表的值(VALUE)部分不需要用到,所以这个数据结构也可以更换为 哈希集(HashSet)。 转载请注明出处。 VB中HashTable 2012-08-20 14:43:21| 分类: asp.net|举报|字号 订阅 首先定义一个hashtable Dim hstl As New Hashtable hstl.Add(key, value) 'java是用.put MS开始全面模仿java 这说说vb.net中的hashtable基本用法: 添加值:hstl.add(key,value) 通过key取值: hstl.Item(key).ToString 判断是否含有Key: ContainsKey(key) 判断是否含有value: ContainsValue(value) 遍历hashtable: Dim de As DictionaryEntry '泛型类 For Each de In hstl console.write(de.key & de.value) Next de hashtable不支持通过value取key. 2个集合交集 第一种方法 最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N) 代码: public static List GetIntersection(List list1, List list2) { List list3 = new List(); //第一种方法:循环遍历 //O(n×m) for (int i = 0; i < list1.Count; i++) { for (int j = 0; j < list2.Count; j++) { if (list1[i]==list2[j]) { list3.Add(list1[i]); } } } return list3; } 第二种方法 利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复元素,即hash表中的元素都是唯一的。所以,我们的思路就是:先把第一个集合的所有元素都放进hashSet中,时间复杂度O(M);再把第二个集合中的元素放进hashSet中,如果有重复元素,就是这2个集合交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。 代码: public static List GetIntersection2(List list1, List list2) { //第二种方法:hash List list3 = new List(); HashSet hashSet = new HashSet(); foreach (string item in list1) { hashSet.Add(item); } foreach (string item in list2) { if (hashSet.Add(item) == false) { list3.Add(item); } } return list3; } 测试 代码: static void Main(string[] args) { List list1 = new List(); list1.Add("apple"); list1.Add("banana"); list1.Add("pear"); list1.Add("orange"); list1.Add("grape"); List list2 = new List(); list2.Add("nokia"); list2.Add("sumsung"); list2.Add("htc"); list2.Add("apple"); list2.Add("orange"); List list =new List(); //test for two set join //list = TwoSetsIntersection.GetIntersection(list1, list2); list = TwoSetsIntersection.GetIntersection2(list1, list2); foreach (string item in list) { Console.Write(item + "\t"); } } 总结 hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet类 HashSet类主要是设计用来做高性能集运算的,例如对集合交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。 HashSet的一些特性如下: 1、HashSet中的值不能重复且没有顺序。 2、HashSet的容量会按需自动添加。 构造方法: HashSet() 默认相等比较器创建一个空的新实例。 HashSet(IEnumerable collection)  把指定集合中的collection中的数据复制到集中 HashSet(IEqualityComparer comparer)  使用指定的相等比较器创建一个空的新实例 HashSet(IEnumerable collection,IEqualityComparer comparer)  使用指定的比较器实例化数据,且将指定集合中的元素复制到集合中。 因为HashSet是专门设计来做集合运算的,因此它提供的方法中有不少是和集合运算相关的。 以下给出它的一些常用方法介绍 成员        类型        说明 Add        方法        将指定的元素添加到集合中 Clear        方法         清空集合中的所有元素 Contains     方法         确定某元素是否在HashSet中 Exists       方法         确定HashSet是否包含于指定条件相匹配的元素 ExceptWith    方法         从当前HashSet移除指定集合中的所有元素 IntersectWith   方法        修改当前的HashSet对象,以仅包含该对象和指定集合中存在的元素 IsProperSubsetOf  方法        确定HashSet对象是否为指定集合的真子集 IsProperSupersetOf 方法        确定HashSet对象是否为指定集合的真超集 IsSunsetOf     方法         确定HashSet对象是否为指定集合的子集 IsSupersetOf    方法         确定HashSet对象是否为指定集合的超集 Remove      方法         从HashSet对象中移除指定的元素 RemoveWhere   方法         从HashSet集合中移除与指定谓词所定义的条件相匹配的所有元素 SetEquals     方法         确定HashSet对象与指定的集合中是否包含相同的元素 SynmmetricExceptWith  方法     修改当前的HashSet对象,以仅包含该对象或指定集合中存在的元素 TrimExcess    方法         将HashSet对象的容量设置为它所包含的元素的实际个数,向上舍入为接近的特性与实现的值。 UnionWith     方法         修改当前的HashSet对象,以包含该对象本身和指定集合中存在的所有元素 给个简单的例子,写不完的,总之记得HashSet主要的作用是用来进行,交集、并集等运算的就OK了。 static void Main(string[] args) { HashSet hs = new HashSet(); hs.Add("你"); hs.Add("好"); hs.Add("吗"); HashSet hs1 = new HashSet(); hs1.Add("你"); hs1.Add("好"); bool b = hs1.IsProperSubsetOf(hs); //确定hs1是否是hs的真子集 Console.WriteLine(b); //输出True HashSet hs2 = new HashSet(); hs2.Add("爱你"); IEnumerable list = hs.Union(hs2); //返回并集 foreach (string str in list) { Console.WriteLine(str); //输出 你 好 吗 爱你 } Console.ReadKey(); }

最新推荐

recommend-type

利用带头结点的单链表实现两个集合的并、交、差运算.docx

即,要使用单链表存储两个集合的元素,并通过链表操作来实现集合运算,从而得到并集、交集和差集的结果。同时,要确保两个集合中不包含重复的元素,这要求我们在设计算法时考虑去重的策略。 概要设计图部分,给出了...
recommend-type

伦茨8400 HighLine变频器EASY Navigator配置及应用

内容概要:本文详细介绍了如何使用伦茨公司的EASY Navigator软件对8400 HighLine系列变频器进行配置。主要步骤涵盖了创建项目、选择变频器类型和版本、添加通信接口、设定控制类型和电机参数、进行参数配置,如控制方式、抱闸模式、以及通讯方式。文中还提供了详细的配置指导,例如设置抱闸延迟时间和通讯确认等功能,强调了配置过程中需要注意的关键点和常见操作。另外,本文详细讲解了如何利用PROFINET和以太网/IP进行网络设置和设备之间的通信配置,并说明了如何通过发送和接收四个双字节报文来监控和控制变频器的状态和性能,确保变频器能够稳定可靠地运行。 适合人群:电气工程师、自动化技术人员及负责工业控制系统配置的专业人士,特别是有一定自动化背景并熟悉PLC编程的人群。 使用场景及目标:① 对8400 HighLine系列变频器进行初始配置及后续调整,适用于新建工程项目或者现有系统的升级改进。② 提供了一个从理论到实践的学习路径,帮助工程技术人员快速掌握变频器的基本原理及其高级应用技巧。③ 引导用户理解和实施变频器的具体配置任务,确保其能够正确响应指令、保持高效运作并减少停机风险。 其
recommend-type

基于Matlab的蔡氏混沌电路(Chua's circuit)系统分析,作为一种简单的非线性电子电路设计,它可以表现出标准的混沌理论行为 这个电路的制作容易程度使它成为了一个无处不在的现实世界的混沌

基于Matlab的蔡氏混沌电路(Chua's circuit)系统分析,作为一种简单的非线性电子电路设计,它可以表现出标准的混沌理论行为 这个电路的制作容易程度使它成为了一个无处不在的现实世界的混沌系统的例子 蔡氏系统混沌仿真,输出lyapunov指数、分岔图、相图结果 程序已调通,可直接运行 ,Matlab; 蔡氏混沌电路; 系统分析; 非线性电子电路设计; 混沌理论行为; 制作容易; 现实世界系统例子; 混沌仿真; Lyapunov指数; 分岔图; 相图结果; 程序调通。,基于Matlab的蔡氏混沌电路系统分析:非线性电子电路的混沌仿真与结果展示
recommend-type

达内培训:深入解析当当网java源码项目

根据提供的文件信息,我们可以分析出以下知识点: 标题:“当当网源码”意味着所提供的文件包含当当网的源代码。当当网是中国知名的在线电子商务平台,其源码对于学习电子商务系统和网站开发的IT从业者来说,是一个宝贵的参考资源。它可以帮助开发者了解如何构建大型的、面向用户的在线零售系统。 描述:“达内培训项目,对于学习java系列的童鞋们值得一看,相信值得拥有”指出这个源码项目是由达内科技发起的培训项目的一部分。达内科技是中国的一家知名的IT培训公司,擅长于提供多种IT技能培训课程。源码被推荐给学习Java系列课程的学生,这表明源码中包含大量与Java相关的技术,比如Java Web开发中的JSP和Struts框架。 标签:“java jsp struts”进一步明确了源码项目的核心技术栈。Java是一种广泛使用的面向对象编程语言,而JSP(Java Server Pages)是一种基于Java技术的用于创建动态网页的标准。Struts是一个开源的Java EE Web应用框架,它使用MVC(模型-视图-控制器)设计模式,将Java的业务逻辑、数据库和用户界面分离开来,便于管理和维护。 文件名称列表:“官方网址_ymorning.htm、dangdang.sql、dangdang”提供了源码包中文件的具体信息。官方网址_ymorning.htm可能是一个包含当当网官方网址和相关信息的HTML文件。dangdang.sql是一个SQL文件,很可能包含了当当网数据库的结构定义和一些初始数据。通常,SQL文件用于数据库管理,通过执行SQL脚本来创建表、索引、视图和其他数据库对象。而dangdang可能是整个项目的主要目录或文件名,它可能包含多个子目录和文件,如Java源文件、JSP页面、配置文件和资源文件等。 结合以上信息,当当网源码的知识点主要包括: 1. Java Web开发:了解如何使用Java语言进行Web开发,包括创建后端服务和处理HTTP请求。 2. JSP技术:掌握JSP页面的创建和使用,包括JSP指令、脚本元素、JSP动作和标签库的运用。 3. Struts框架:学习Struts框架的架构和组件,包括Action、ActionForm、ActionMapping、ActionServlet等概念。 4. MVC设计模式:理解并实践模型-视图-控制器(MVC)设计模式,这是现代Web应用程序的常见架构方式。 5. 数据库设计与SQL:掌握数据库设计的基本原则,并能够使用SQL语言进行数据库操作。 6. 电子商务系统架构:通过当当网源码,学习大型电子商务系统的架构和功能实现。 7. 项目结构与管理:分析大型项目的文件和目录结构,学习如何管理项目的各种资源和配置文件。 8. 实战经验:通过对真实项目源码的阅读和分析,提升解决实际开发问题的能力。 由于学习材料的重要性和商业秘密的考虑,源码的使用和传播可能受到一定的法律约束。因此,在使用和学习这些源码时,需要遵守相关的法律规定和许可协议。
recommend-type

【视频编码与传输的终极指南】:掌握H265与VP8的关键技术及应用场景

# 摘要 随着数字媒体内容的爆炸性增长,高效的视频编码和传输技术变得至关重要。本文分别对H265和VP8这两种领先编码技术进行了深入分析,阐述了它们的核心原理、优势、编码过程、应用场景以及各自在不同平台的实践案例。同时,本文探讨了视频传输的关键技术,包括传输协议、质量控制和网络优化。文章最后展望了H265与VP8的未来发展,分析了它们的兼容性、标准化挑战、
recommend-type

Expected comma問題是什麼

<think>嗯,用户问的是关于“Expected comma”错误的原因和解决方法。让我先回忆一下相关的知识。根据提供的引用,这个错误通常出现在JSON或类似格式的配置文件中,比如ESLint的配置或者SQL语句中的语法错误。比如引用[1]提到安装ESLint时出现这个错误,可能是在数组或对象中缺少逗号。引用[2]指出在less.compile报错时,前面或后面缺少逗号。引用[3]是SQL错误,同样是因为缺少逗号。引用[4]提到在VS Code中因为多写了逗号导致错误,不过这里的情况可能不同,是多余的逗号,但根据错误提示,用户可能在不同的场景下遇到这个问题。 首先需要确定“Expected
recommend-type

squat-timer:基于角度的倒计时训练时间应用程序

根据给定文件信息,我们需要针对标题、描述和标签生成详细的知识点。首先,我们将分析标题和描述来提炼相关知识点,接着讲解标签中的TypeScript编程语言在开发该应用程序中的应用。最后,考虑到文件名称列表中提到的“squat-timer-master”,我们将提及可能涉及的项目结构和关键文件。 ### 标题与描述相关知识点 1. **应用程序类型**: 标题和描述表明该应用程序是一个专注于训练时间管理的工具,具体到深蹲训练。这是一个基于运动健身的计时器,用户可以通过它设置倒计时来控制训练时间。 2. **功能说明**: - 应用程序提供倒计时功能,用户可以设定训练时间,如深蹲练习需要进行的时间。 - 它还可能包括停止计时器的功能,以方便用户在训练间歇或者训练结束时停止计时。 - 应用可能提供基本的计时功能,如普通计时器(stopwatch)的功能。 3. **角度相关特性**: 标题中提到“基于角度”,这可能指的是应用程序界面设计或交互方式遵循某种角度设计原则。例如,用户界面可能采用特定角度布局来提高视觉吸引力或用户交互体验。 4. **倒计时训练时间**: - 倒计时是一种计时模式,其中时钟从设定的时间开始向0倒退。 - 在运动健身领域,倒计时功能可以帮助用户遵循训练计划,如在设定的时间内完成特定数量的重复动作。 - 训练时间可能指预设的时间段,例如一组训练可能为30秒到数分钟不等。 ### TypeScript标签相关知识点 1. **TypeScript基础**: TypeScript是JavaScript的一个超集,它在JavaScript的基础上添加了可选的静态类型和基于类的面向对象编程。它是开源的,并且由微软开发和维护。 2. **TypeScript在Web开发中的应用**: - TypeScript可以用来编写大型的前端应用程序。 - 它通过提供类型系统、接口和模块等高级功能,帮助开发者组织和维护代码。 3. **TypeScript与应用程序开发**: 在开发名为“squat-timer”的应用程序时,使用TypeScript可以带来如下优势: - **代码更加健壮**:通过类型检查,可以在编译阶段提前发现类型错误。 - **便于维护和扩展**:TypeScript的类型系统和模块化有助于代码结构化,便于后续维护。 - **提升开发效率**:利用现代IDE(集成开发环境)的支持,TypeScript的智能提示和代码自动补全可以加快开发速度。 4. **TypeScript转换为JavaScript**: TypeScript代码最终需要编译成JavaScript代码才能在浏览器中运行。编译过程将TypeScript的高级特性转换为浏览器能理解的JavaScript语法。 ### 压缩包子文件的文件名称列表相关知识点 1. **项目结构**: 文件名称列表中提到的“squat-timer-master”暗示这是一个Git项目的主分支。在软件开发中,通常使用master或main作为主分支的名称。 2. **项目文件目录**: - **源代码**:可能包含TypeScript源文件(.ts或.tsx文件),以及它们对应的声明文件(.d.ts)。 - **编译输出**:包含由TypeScript编译器输出的JavaScript文件(.js或.js.map文件),这些文件位于构建或dist目录下。 - **资源文件**:可能包括图像、样式表和字体文件等静态资源。 - **配置文件**:可能包括tsconfig.json文件(TypeScript编译器配置),package.json文件(定义了项目的npm配置和依赖)。 - **测试文件**:可能包含用于单元测试和集成测试的文件,如spec或test.js文件。 3. **开发流程**: - 开发人员首先会在本地分支上进行开发,然后通过Git合并到master分支。 - master分支应始终保持稳定状态,所有的发布版本都会基于该分支。 - 开发过程中可能使用版本控制系统(如Git)的分支管理策略,如功能分支、开发分支和发布分支。 ### 总结 从给定的文件信息来看,“squat-timer”是一个针对深蹲训练的倒计时应用程序,强调基于时间的训练管理。它的开发可能涉及到TypeScript编程语言,以提供结构化、健壮的代码。通过文件名称列表可以推测,该项目应遵循典型的项目结构,并通过Git进行版本控制管理。整体来看,这个项目需要综合运用前端开发知识、版本控制以及TypeScript的高级特性来实现一个专业的运动健身辅助工具。
recommend-type

【Acronis True Image 高效备份艺术】:2010版高级备份策略的终极指南

# 摘要 Acronis True Image 2010是一个功能强大的备份软件,本文对其进行了全面的分析和介绍。首先,文章概述了Acronis True Image 2010的核心功能,如备份的基本概念和类型、用户界面的定制以及高级备份选项的配置。接着,通过详细讲解备份操作的步骤、数据恢复和灾难恢复等实践应用,展示了软件在实际环境中的使用情况。文章还深入探讨了在企业环境中应用高级备份策略的方法,包括网络备份解决方案和企业级备份管理。此外,本文提供了故障排除和性能优化的实用技巧,并对备份技术的未来发展趋势进行了展望。 # 关键字 Acronis True Image 2010;备份策略;数据
recommend-type

# Error loading design # Error: Error loading design # Pausing macro execution # MACRO ./FIFO_run_msim_rtl_verilog.do PAUSED at line 12

<think>好的,我现在需要解决用户在Quartus II和ModelSim联合仿真时遇到的错误:“Error loading design in FIFO_run_msim_rtl_verilog.do macro paused at line 12”。首先,我要分析这个问题可能的原因,并给出解决方案。 首先,用户提到错误出现在执行宏文件时在第12行暂停,并且设计加载失败。这通常意味着在仿真过程中,ModelSim无法正确加载设计文件,可能由于以下几个原因: 1. **文件路径或名称错误**:检查宏文件中引用的文件路径是否正确,尤其是第12行涉及的文件是否存在,路径是否有误。比如,用户
recommend-type

随机生成JSON格式账号数据的脚本工具

根据给定的文件信息,可以构建以下IT知识点: 首先,从标题“account随机json生成脚本”可以知道,这份文件主要涉及的内容是关于如何通过脚本生成随机的JSON格式的账户数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Web开发中,JSON格式的数据由于其跨平台、跨语言的特性被广泛应用于服务器与客户端的数据交换。 接下来,“https://www.json-generator.com/”是一个在线工具的网址,该工具能够帮助用户生成随机的JSON数据。该工具的使用不需要安装任何软件,用户通过网站提供的界面配置数据模板,就可以生成符合要求的JSON数据。这类工具特别适用于开发阶段测试用例的创建,或是在没有后端服务支持的情况下进行前端展示的模拟。 然后,“account的生成脚本,及生成的json数据”这一描述说明了文件中包含的是脚本代码以及使用该脚本生成的JSON数据样例。生成的脚本可能是一种编程语言编写的程序,例如JavaScript、Python、Shell等,用于自动化地创建符合特定模式的JSON数据。JSON数据样本则是在脚本运行后生成的具有代表性的数据输出,通常用于调试、演示或测试。 最后,“标签”中的“json”表明这份文件的主题是围绕JSON进行的。而“压缩包子文件的文件名称列表”中提到了“es-account.json”和“es-account.script”,说明提供的文件包括了JSON格式的数据文件以及可能用于生成这些数据的脚本文件。JSON文件的命名通常反映了文件内容的性质,而“es-account”可能表明这个数据是关于某个账户系统(es可能代表企业系统)的示例数据。文件后缀“.script”表明这是一个脚本文件,可能用于生产或测试用途。 综上所述,相关知识点包括: 1. JSON格式:一种轻量级的数据交换格式,具有易读、易写和易于机器解析等特性。在Web开发中主要用于客户端和服务器之间的数据交换。 2. JSON生成器:在线工具,如json-generator.com,提供给用户创建自定义的随机JSON数据的平台,无需编写代码,通过配置即可生成。 3. 脚本编写:为自动执行任务或生成数据而编写的程序代码。在生成随机JSON数据的场景下,脚本可能是用各种编程语言实现,如JavaScript、Python、Shell等。 4. 测试与演示:生成的JSON数据可用于测试软件应用的数据处理功能,或是作为前端展示的模拟数据。 5. JSON文件使用:在实际应用中,JSON文件通常被用作配置文件、本地存储的数据格式、API接口的数据交换格式等。 通过这些知识点,IT专业人员可以更好地理解和应用JSON数据的生成、使用以及相关的脚本编写技巧。这对于提高开发效率,确保数据交换的一致性和准确性都具有重要的意义。同时,对于开发测试环境的搭建、前端数据的模拟以及后端数据验证都提供了极大便利。
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部