西电数据结构大作业(单链表求集合) 下载本文

内容发布更新时间 : 2024/5/23 0:08:40星期一 下面是文章的全部内容请认真阅读。

1.题目

单链表求集合

2.功能描述

利用带头结点的单链表实现两个集合的并、交、差运算。 要求:

1、要求用带头结点的单链表存储两个集合中的元素和最终的结果。 2、集合的元素限定为十进制数,程序应对出现重复的数据进行过滤,即使得显示两个集合的内容及其并集、交集和差集的内容。

3、要求不改变原来的集合,并集、交集和差集分别另外存放。

3.流程图

开始

输入集合

N

非0

Y 在L1中有重复数

Y N 插入L1

输出集合L1

输入集合

N

非0

Y 在L2中有重复数 Y N

插入L2

输出集合L2

L1与L2有相同数 Y 插入L3 N 查到表尾 Y 输出L3 N 复制L1 复制L1与L3有相同数 Y 从复制L1删除 N 查到表尾 Y 输出L4(复制L1) N 复制L2 Y 查到L4表尾 N 插入L4于L2 输出L5(复制L2) 结束 4. 程序源代码和注释

#include //头文件 #include

typedef int datatype; //定义单链表数据类型 typedef struct node {

datatype data; //数值域 struct node*next; //指针域 }linklist;

void Insert(linklist*head,int a) //单链表头插数值 已知(头结点,插入值) {

linklist*p=head,*s; //p指向头结点 s=(linklist*)malloc(sizeof(linklist)); //建立新节点 s->data=a; //给新节点赋值

s->next=p->next; //新节点指向第一个节点 p->next=s; //头结点指向新节点 }

linklist*Locate(linklist*head,datatype key)

//在一个链表中找相同值 ,返回其地址 已知(头结点,查找值(整形)) {

linklist*p=head->next; //P指向第一个指针

while(p!=NULL&&p->data!=key) //遍历整个链表(直到为NULL或找到) p=p->next;

if(p==NULL) return NULL; //查找不到,返回NULL else return p; //查找到返回其地址 }

linklist*CreateListF()

//建立链表 带头节点的头插法,返回单链表的头指针(去除重复数) {

linklist*head; int a; //声明插入数值类型 head=(linklist*)malloc(sizeof(linklist));//建立头结点

head->next=NULL; //令头结点指针域为空 scanf(\输入第一个数值

while(a!=0) //循环插入数值 当输入0结束 {

if(Locate(head,a)==NULL)Insert(head,a);//插入数值(去除重复数) scanf(\输入下一个数值 }