本次实验包含求单链表的交集和差集,并作用在一个单链表的上面,为了实现两个函数的测试,需要用到几个函数。第一:1、初始化 2、尾插法 3、删除节点 4、遍历节点。这四个函数写好后,我们就可以愉快的给1交集和差集做测试了。我们先谈论交集如何做。

交集

原题再现:

  • 1、已知两个链表A和B分别表示两个集合,其元素递增排列。 请设计一个算法,用千求出A与B的交集,并存放在A链表中。

拿到题目时,先看他输入输出与功能,功能才限制他的输出,输入就是两个单链表,A是要操作的,所以需要加上&。核心关键词:递增、交集.
假设A = {1,2,3,4,8},B={2,4,7,8,9}
那么A∩B= {2,4,8}

算法思路

  1. 两个操作指针p和q指向两个链表的数据域
  2. while循环判断p->data 和q->data 如果相等不操作直接下一条,如果大于q跳向下一条地址 ,如果小于,删除节点,最后就是想要的结果了。

根据思路,算法就很简单的转化为代码。

void Inter(LinkList &A,LinkList B){LinkList  p = A->next;LinkList  q = B->next;while(p && q){if(p->data == q->data){p =p->next;q = q->next;}else if(p->data>q->data){q = q->next;}else{p = ListDelete(A,p->data);p = p->next;}}
}

差集

题目再现

  • 2、巳知两个链表 A和 B分别表示两个集合,其元素递增排列。请设计算法
  • 求出两个集合 A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。

假设 A = {1,2,3,4,8} B={2,4,7,8,9}
A-B = {1,3} 2个

算法步骤,上题同理

  1. 两个操作指针p和q指向两个链表的数据域
  2. while循环判断p->data 和q->data 如果相等删除节点,如果大于q跳向下一条地址 ,如果小于,计数器+1。
int Differ(LinkList &A,LinkList B){int cnt=0;LinkList p = A->next;LinkList q = B->next;while(p && q){if(p->data == q->data){p = ListDelete(A,p->data);p = p->next;q = q->next;}else if(p->data>q->data){q = q->next;}else {p = p->next;cnt ++;}}return cnt;}

测试效果

完整源码


#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
using namespace std;
typedef int Status;
typedef int ElementType;typedef struct LNode{ElementType data;struct LNode* next;
}LNode,*LinkList;Status InitList(LinkList &L){L = new LNode;L->next = NULL;return OK;
}
void CreateList_H(LinkList &L,int A[],int n){InitList(L);LinkList r = L;for(int i =0;i<n;i++){LinkList  p = new LNode;p->data = A[i];p->next = NULL;r->next = p;r = p;}
}
void Print(LinkList L){LinkList p = L->next;while(p){cout << p->data << " ";p = p->next;}cout << endl;
}
LinkList ListDelete(LinkList &L,int x){LinkList p = L,pre;while(p->next != NULL && p->data !=x){pre = p;p=p->next;}pre->next = p->next;delete p;return pre;}
/**  * 1、已知两个链表A和B分别表示两个集合,其元素递增排列。*  请设计一个算法,用千求出A与B的交集,并存放在A链表中。* A = {1,2,3,4,8},B={2,4,7,8,9}* A∩B= {2,4,8}* */
void Inter(LinkList &A,LinkList B){LinkList  p = A->next;LinkList  q = B->next;while(p && q){if(p->data == q->data){p =p->next;q = q->next;}else if(p->data>q->data){q = q->next;}else{p = ListDelete(A,p->data);p = p->next;}}
}
/** 2、巳知两个链表 A和 B分别表示两个集合,其元素递增排列。请设计算法* 求出两个集合 A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。* A = {1,2,3,4,8} B={2,4,7,8,9}* A -B={1,3} 2个* */
int Differ(LinkList &A,LinkList B){int cnt=0;LinkList p = A->next;LinkList q = B->next;while(p && q){if(p->data == q->data){p = ListDelete(A,p->data);p = p->next;q = q->next;}else if(p->data>q->data){q = q->next;}else {p = p->next;cnt ++;}}return cnt;}
int main(){LinkList  A,B;int a[5]={1,2,3,4,8};int b[5] ={2,4,7,8,9};CreateList_H(A,a,5);CreateList_H(B,b,5);cout << "A list:" << endl;Print(A);cout << "B list:" << endl;Print(B);cout << "A and B intersect: " << endl;Inter(A,B);Print(A);cout << "A and B Difference:" << endl;CreateList_H(A,a,5);int cnt = Differ(A,B);Print(A);cout << "cnt:" << endl;cout << cnt << endl;return 0;
}

DS实验4--求单链表交集与差集(含测试效果及实现)相关推荐

  1. c语言while求a和b的和程序,数据结构实验1_C语言_输入集合A和B求并集、交集、差集(while +...

    数据结构实验1_C语言_输入集合A和B求并集.交集.差集(while + 数据结构实验1_C语言_输入集合A和B求并集.交集.差集(while + switch + 功能函数)) 实验1 (1)实验目 ...

  2. 数据结构实验3、单链表的基本操作实现

    实验三: 作者说: 写的如果有不太好的地方,欢迎大佬指点! 一.运行效果截图 二.实验要求 实验3.单链表的基本操作实现 (1)实验目的 通过该实验,深入理解链表的逻辑结构.物理结构等概念,掌握链表基 ...

  3. c语言链表交换,求单链表的数据交换解决思路

    当前位置:我的异常网» C语言 » 求单链表的数据交换解决思路 求单链表的数据交换解决思路 www.myexceptions.net  网友分享于:2013-11-04  浏览:14次 求单链表的数据 ...

  4. PTA 基础编程题目集 6-6 求单链表结点的阶乘和

    PTA 基础编程题目集 6-6 求单链表结点的阶乘和 本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int Factorial ...

  5. 求单链表结点的阶乘和

    求单链表结点的阶乘和 (15分) 本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List ...

  6. PTA:6-3求单链表结点的阶乘和(15分)

    大一下半期数据结构 数据结构实践任务2 求单链表结点的阶乘和 本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义 int Factor ...

  7. PHP求并集,交集,差集

    PHP求并集,交集,差集 一.总结 一句话总结:在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersec ...

  8. 【牛客网】邮票;python set()集合函数,去重;“”、“|”、“-”求并集、交集、差集

    题目描述 某人有8 角的邮票5 张,1 元的邮票4 张,1 元8 角的邮票6 张,用这些邮票中的一张或若干张可以得到多少中不同的邮资? 输入描述: 无 输出描述: 输出一行,表示题目所求. 本人解答: ...

  9. java求集合的交集、差集和并集

    一.本文介绍两种写法 1原生写法 2com.google.guava写法 <dependency>     <groupId>com.google.guava</grou ...

最新文章

  1. Java 技术篇-利用ClipboardOwner实现实时监听剪切板功能实例演示
  2. 敏捷开发用户故事系列之三:用户建模
  3. OSI七层模型详解 TCP/IP协议
  4. 通过IE私有滤镜让IE6 7 8支持背景透明,内容不透明效果
  5. excel计算式自动计算_全套Excel版工程自动计算表格+实用小工具,高效工作不加班...
  6. 淘宝与拍拍的世纪之战!(庄帅)
  7. 小鼠血清白蛋白包裹四氧化三铁纳米粒
  8. python读取txt文件中的内容并用逗号分割_数据分析—gt;文件读写
  9. LiveData 源码解析(2.4.1 版本)
  10. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...
  11. 超容易上手的绘图软件
  12. 解锁商业新模式,神奇AR为IP内容“添把火”
  13. 高级PHP工程师必备的编码技巧及思维(收藏)
  14. 如何防御DDoS等流量攻击?
  15. 最佳论文!商汤提出手机端实时单目三维重建系统 | ISMAR 2020
  16. matplotlib绘制曲线图
  17. e3 v3服务器芯片组,最保值的E3-1230 v3遇上锐龙5:结果惊讶!
  18. OSChina 周三乱弹 ——新技能get 如何机智的关注大胸妹子。
  19. 软件测试--两个星期的工作经历
  20. 核与线程 CPU 4核8线程 的解释

热门文章

  1. PointWise 18.4 R4 x64
  2. 金融工程---马尔科夫预测
  3. 基于泰勒级数展开求余弦函数值
  4. 条件概率和事件的相互独立性
  5. java课设设计的目的是什么_网页设计实习目的及意义
  6. FCoin“出事”后,团队关键人物回复了!
  7. 物联网的2018,百花齐放的一年
  8. filecoin space race
  9. SRv6项目实践(二):基本的P4框架
  10. 2018秋招历程之28所