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
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(\输入下一个数值 }