用链表实现集合交并补等运算.doc
文本预览下载声明
数据结构定义
抽象数据类型
本设计中用到的数据结构ADT定义如下:
ADT List 数据对象:D 数据关系: 基本操作: 操作结果:构造一个空的线性表L; DestroyList L 初始条件:线性表L已存在 操作结果:销毁线性表L ClearList L 初始条件:线性表L已存在 操作结果:将L重置为空表 ListEmpty L 初始条件:线性表L已存在 操作结果:若L为空表,则返回TRUE,否则返回FALSE ListLenght L 初始条件:线性表L已存在 操作结果:返回L中数据元素的个数
存储结构定义
数据存储结构的C语言定义如下:
typedef struct LNode//定义单链表结点类型 ElemType data; struct LNode *next;
LinkList;
基本操作
数据结构的基本操作实现如下:
DispList LinkList *L :输出单链表L
CreatListR LinkList *L,ElemType a[],int n :运用尾插法建立单链表
Sort LinkList *head :单链表元素排序
shanchu LinkList *head :在进行过Sort排序之后,删除单链表里相同的元素
bing LinkList *ha,LinkList *hb,LinkList *hc :求两个有序集合的并
jiao LinkList *ha,LinkList *hb,LinkList *hc :求两个有序集合的交
cha LinkList *ha,LinkList *hb,LinkList *hc :求两个有序集合的差、
main :采用尾差法建立单链表,使用Sort进行单链表排序构成有序链表,在使用shanchu函数删除相同元素和非小写字母。利用一个switch语句进行运算的选择,使用相关函数对有序链表进行交并差的相关运算
解题过程
问题分解
该问题主要应实现以下功能:
利用尾差法建立单链表
对于输入的链表进行有序排列
删除有序链表中不符合要求的元素
调用函数对单链表进行交,并,差运算,并输出
模块结构
系统主要由8个模块组成,分别是:
单链表的建立
单链表的有序排列
删除单链表中不符合条件的元素
集合交集
集合并集
集合差集
单链表输出
主函数
模块之间的结构如下:
解题思路
各模块的实现步骤为:
在尾差法建立单链表时,开始时指针指向头结点。
建立有序列表是利用指针的移动来是后续的元素和第一次个元素进行比较,并使用while循环实现单链表的有序排列。
判定有序单链表中的重复元素定义指针p,通过指针p访问链表中的元素并且通过if语句检测链表中的元素。对于不属于小写字母的元素判定后进行删除操作。
定义三个头结点pa,pb,pc,把ha的元素赋给hc,在使用指针移动与hb中的元素进行比较,不同的元素则插入到hc中,相同时指针移动到ha的下一个元素。当ha为空,直接把hb赋给hc。
同样定义了三个结点,不过hc是pa与pb不同的元素。
差集是通过指针的移位把两个有序单链表中的元素进行比较,不同的话,则赋给hc。
利用主函数把有序单链表,及三个函数输出链表进行输出
主函数通过一个switch语句,方便的对函数进行调用,从而进行集合的交,并,差运算。
实现
代码及注释:
#include
#include
using namespace std;
typedef char ElemType;
typedef struct LNode//定义单链表结点类型 ElemType data; struct LNode *next;
LinkList;
void CreatListR LinkList *L,ElemType a[],int n //运用尾插法建立单链表 LinkList *s,*r;int i; L LinkList * malloc sizeof LinkList ; //创建头结点,为头结点分配空间 L- next NULL; r L; //r先指向头结点后指向尾结点,开始时指针指向头结点 for i 0;i n;i++ s LinkList * malloc sizeof LinkList ;//创建新结点 s- data a[i]; r- next s; r s; r- next NULL;//尾结点指向空 void Sort LinkList *head //建立有序链表 LinkList *p head- next,*q,*r; if p! NULL r p- next; p- next NULL; p r; while p! NULL //后续元素与第一个元素进行比较 r p- next; q head; while q- next!
显示全部