只用C,不用C++和java,求具体能运行的代码
用一个队列实现数学上的集合(Set)的元素判定(属于、is a member of)、子集判定(包含于、is a subset of、is contained in)、交(intersection)、并(union)、差(complement、set-theoretic difference)运算,集合元素限定为整数。只能利用队列的入队和出队操作访问队列中元素。
#include <stdio.h>
#include <stdlib.h>
//数据类型
#define ElemType int
typedef struct QueueNode
{
ElemType data; //数据域
struct QueueNode *next; //指针域
}QueueNode;
typedef struct LinkQueue
{
QueueNode *head; //队头指针
QueueNode *tail; //队尾指针
}LinkQueue;
typedef struct Node {
int data;
struct Node *next;
}Node;
//创建新节点函数
Node *CreateNode(int value)
{
//为新节点申请空间
Node new_node = (Node)malloc(sizeof(Node));
//给新节点赋值
new_node->data = value;
//将新节点的next指向空
new_node->next = NULL;
return new_node;
}
void Emptyqueue(Node **head)//释放队列空间
{
Node *cur = *head;
Node *temp;
if (head == NULL)
{
//空队列无需打印
return;
}
//遍历队列
while (cur != NULL)
{
temp = cur->next;
free(cur);
//移动cur,以达到遍历队列的目的
cur = temp;
}
*head = NULL;
}
//顺序打印队列元素
void queuePrint(Node *head)
{
Node *cur;
if (head == NULL)
{
//空队列无需打印
return;
}
cur = head;
//遍历队列
while (cur != NULL)
{
//打印元素和其对应的地址
printf("%d\n", cur->data);
//移动cur,以达到遍历队列的目的
cur = cur->next;
}
printf("\n");
}
//入队函数,插入链表尾部
Node *queuePushBack(Node **head, int value)
{
Node *cur;
Node *new_node;
//非法输入
if (head == NULL)
{
return NULL;
}
//空队列
if (*head == NULL)
{
//直接创建一个新的节点完成元素插入
*head = CreateNode(value);
return NULL;
}
else
{
cur = *head;
//遍历队列,让cur指向最后一个元素
while (cur->next != NULL)
{
cur = cur->next;
}
//创建一个新节点
new_node = CreateNode(value);
//将最后一个元素的next指向新节点
cur->next = new_node;
return new_node;
}
}
//出队函数,从链表头删除
void queuePop(Node **head)
{
//非法输入
if (head == NULL)
{
return;
}
//空队列没有可删除的元素
if (*head == NULL)
{
return;
}
else
{
//创建一个新的指针指向第二个元素
Node *new_node = (*head)->next;
//将头结点的next指向空
(*head)->next = NULL;
//删除该头结点
free(*head);
//将第二个元素设置成新的队头
*head = new_node;
}
return;
}
int IN_SET(Node *L, int value)//判断数据是否存在队列中
{
int ret = 1;
Node *p1 = L;
if (L == NULL) return ret;
while (p1)
{
if (value == p1->data)
{
ret = 0;
break;
}
p1 = p1->next;
}
return ret;
}
int INSERT_SET(Node **L, int value)//插入数据
{
int ret = 0;
if (IN_SET(*L, value))//判断是否存在
{
queuePushBack(L, value);//插入
ret = 1;
}
return ret;
}
int child(Node * L1, Node * L2)//判断集合1是否为集合2的子集,是返回1,不是返回0
{
Node * L, *p1, *p2;
int find = 0;
p1 = L1;
p2 = L2;
while (p1)//查找集合1
{
find = 0;
p2 = L2;
while (p2)//查找集合2中是否包含集合1的元素
{
if (p1->data == p2->data){//如果找到表示存在,find赋值为1并跳出
find = 1;
break;
}
p2 = p2->next;
}
if (!find) return 0;//一旦存在集合1中元素未包含在集合2,表示集合1非集合2子集,返回0停止判断
p1 = p1->next;
}
return 1;//集合1全部包含在集合2中,集合1是集合2子集
}
Node* intersection(Node * L1, Node * L2)//交集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//查找集合1
{
p2 = L2;
while (p2)//查找集合2
{
if (p1->data == p2->data){//集合1和集合2都存在的,插入到交集队列
queuePushBack(&L, p1->data);
break;
}
p2 = p2->next;
}
p1 = p1->next;
}
return L;
}
Node* Union(Node * L1, Node * L2)//并集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//集合1插入并集集合
{
queuePushBack(&L, p1->data);
p1 = p1->next;
}
while (p2)//集合2插入并集集合
{
if (IN_SET(L, p2->data)) queuePushBack(&L, p2->data);//集合2插入时判断是否重复
p2 = p2->next;
}
return L;
}
Node* difference(Node * L1, Node * L2)//差集
{
Node *L, *p1, *p2;
int find;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//将集合1减集合2的结果存入差集合
{
find = 0;
p2 = L2;
while (p2)
{
if (p1->data == p2->data){//在集合2中查找集合1中元素是否存在
find = 1;
break;
}
p2 = p2->next;
}
if (!find) queuePushBack(&L, p1->data);//存在集合1不存在集合2的元素插入差集合
p1 = p1->next;
}
return L;
}
int main()
{
FILE *fp = NULL; //文件句柄
int data, t = 1, i = 0;
Node *A = NULL, *B = NULL, *C = NULL, *D = NULL, *E = NULL;//队列
int k = 1;//为0时推出创新
while (k)
{
printf("1、创建队列AB\n");
printf("2、判断子集关系\n");
printf("3、求AB交集C\n");
printf("4、求AB并集D\n");
printf("5、求AB差集E\n");
printf("0、退出\n");
printf("请选择:");
scanf_s("%d", &i);
switch (i)
{
case 1:
Emptyqueue(&A);
Emptyqueue(&B);
printf("开始创建A:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&A, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
t = 1;
printf("开始创建B:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&B, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
break;
case 2:
if (child(A, B)) printf("集合A是集合B子集\n");
else printf("集合A不是集合B子集\n");
if (child(B, A)) printf("集合B是集合A子集\n");
else printf("集合B不是集合A子集\n");
break;
case 3:
Emptyqueue(&C);
C = intersection(A, B);
printf("集合AB的交集C:\n");
queuePrint(C);
break;
case 4:
Emptyqueue(&D);
D = Union(A, B);
printf("集合AB的并集D:\n");
queuePrint(D);
break;
case 5:
Emptyqueue(&E);
E = difference(A, B);
printf("集合AB的差E:\n");
queuePrint(E);
break;
case 0: k = 0; break;
}
}
Emptyqueue(&A);
Emptyqueue(&B);
Emptyqueue(&C);
Emptyqueue(&D);
Emptyqueue(&E);
return 0;
}#include <stdio.h>
#include <stdlib.h>
//数据类型
#define ElemType int
typedef struct QueueNode
{
ElemType data; //数据域
struct QueueNode *next; //指针域
}QueueNode;
typedef struct LinkQueue
{
QueueNode *head; //队头指针
QueueNode *tail; //队尾指针
}LinkQueue;
typedef struct Node {
int data;
struct Node *next;
}Node;
//创建新节点函数
Node *CreateNode(int value)
{
//为新节点申请空间
Node new_node = (Node)malloc(sizeof(Node));
//给新节点赋值
new_node->data = value;
//将新节点的next指向空
new_node->next = NULL;
return new_node;
}
void Emptyqueue(Node **head)//释放队列空间
{
Node *cur = *head;
Node *temp;
if (head == NULL)
{
//空队列无需打印
return;
}
//遍历队列
while (cur != NULL)
{
temp = cur->next;
free(cur);
//移动cur,以达到遍历队列的目的
cur = temp;
}
*head = NULL;
}
//顺序打印队列元素
void queuePrint(Node *head)
{
Node *cur;
if (head == NULL)
{
//空队列无需打印
return;
}
cur = head;
//遍历队列
while (cur != NULL)
{
//打印元素和其对应的地址
printf("%d\n", cur->data);
//移动cur,以达到遍历队列的目的
cur = cur->next;
}
printf("\n");
}
//入队函数,插入链表尾部
Node *queuePushBack(Node **head, int value)
{
Node *cur;
Node *new_node;
//非法输入
if (head == NULL)
{
return NULL;
}
//空队列
if (*head == NULL)
{
//直接创建一个新的节点完成元素插入
*head = CreateNode(value);
return NULL;
}
else
{
cur = *head;
//遍历队列,让cur指向最后一个元素
while (cur->next != NULL)
{
cur = cur->next;
}
//创建一个新节点
new_node = CreateNode(value);
//将最后一个元素的next指向新节点
cur->next = new_node;
return new_node;
}
}
//出队函数,从链表头删除
void queuePop(Node **head)
{
//非法输入
if (head == NULL)
{
return;
}
//空队列没有可删除的元素
if (*head == NULL)
{
return;
}
else
{
//创建一个新的指针指向第二个元素
Node *new_node = (*head)->next;
//将头结点的next指向空
(*head)->next = NULL;
//删除该头结点
free(*head);
//将第二个元素设置成新的队头
*head = new_node;
}
return;
}
int IN_SET(Node *L, int value)//判断数据是否存在队列中
{
int ret = 1;
Node *p1 = L;
if (L == NULL) return ret;
while (p1)
{
if (value == p1->data)
{
ret = 0;
break;
}
p1 = p1->next;
}
return ret;
}
int INSERT_SET(Node **L, int value)//插入数据
{
int ret = 0;
if (IN_SET(*L, value))//判断是否存在
{
queuePushBack(L, value);//插入
ret = 1;
}
return ret;
}
int child(Node * L1, Node * L2)//判断集合1是否为集合2的子集,是返回1,不是返回0
{
Node * L, *p1, *p2;
int find = 0;
p1 = L1;
p2 = L2;
while (p1)//查找集合1
{
find = 0;
p2 = L2;
while (p2)//查找集合2中是否包含集合1的元素
{
if (p1->data == p2->data){//如果找到表示存在,find赋值为1并跳出
find = 1;
break;
}
p2 = p2->next;
}
if (!find) return 0;//一旦存在集合1中元素未包含在集合2,表示集合1非集合2子集,返回0停止判断
p1 = p1->next;
}
return 1;//集合1全部包含在集合2中,集合1是集合2子集
}
Node* intersection(Node * L1, Node * L2)//交集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//查找集合1
{
p2 = L2;
while (p2)//查找集合2
{
if (p1->data == p2->data){//集合1和集合2都存在的,插入到交集队列
queuePushBack(&L, p1->data);
break;
}
p2 = p2->next;
}
p1 = p1->next;
}
return L;
}
Node* Union(Node * L1, Node * L2)//并集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//集合1插入并集集合
{
queuePushBack(&L, p1->data);
p1 = p1->next;
}
while (p2)//集合2插入并集集合
{
if (IN_SET(L, p2->data)) queuePushBack(&L, p2->data);//集合2插入时判断是否重复
p2 = p2->next;
}
return L;
}
Node* difference(Node * L1, Node * L2)//差集
{
Node *L, *p1, *p2;
int find;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//将集合1减集合2的结果存入差集合
{
find = 0;
p2 = L2;
while (p2)
{
if (p1->data == p2->data){//在集合2中查找集合1中元素是否存在
find = 1;
break;
}
p2 = p2->next;
}
if (!find) queuePushBack(&L, p1->data);//存在集合1不存在集合2的元素插入差集合
p1 = p1->next;
}
return L;
}
int main()
{
FILE *fp = NULL; //文件句柄
int data, t = 1, i = 0;
Node *A = NULL, *B = NULL, *C = NULL, *D = NULL, *E = NULL;//队列
int k = 1;//为0时推出创新
while (k)
{
printf("1、创建队列AB\n");
printf("2、判断子集关系\n");
printf("3、求AB交集C\n");
printf("4、求AB并集D\n");
printf("5、求AB差集E\n");
printf("0、退出\n");
printf("请选择:");
scanf_s("%d", &i);
switch (i)
{
case 1:
Emptyqueue(&A);
Emptyqueue(&B);
printf("开始创建A:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&A, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
t = 1;
printf("开始创建B:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&B, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
break;
case 2:
if (child(A, B)) printf("集合A是集合B子集\n");
else printf("集合A不是集合B子集\n");
if (child(B, A)) printf("集合B是集合A子集\n");
else printf("集合B不是集合A子集\n");
break;
case 3:
Emptyqueue(&C);
C = intersection(A, B);
printf("集合AB的交集C:\n");
queuePrint(C);
break;
case 4:
Emptyqueue(&D);
D = Union(A, B);
printf("集合AB的并集D:\n");
queuePrint(D);
break;
case 5:
Emptyqueue(&E);
E = difference(A, B);
printf("集合AB的差E:\n");
queuePrint(E);
break;
case 0: k = 0; break;
}
}
Emptyqueue(&A);
Emptyqueue(&B);
Emptyqueue(&C);
Emptyqueue(&D);
Emptyqueue(&E);
return 0;
}#include <stdio.h>
#include <stdlib.h>
//数据类型
#define ElemType int
typedef struct QueueNode
{
ElemType data; //数据域
struct QueueNode *next; //指针域
}QueueNode;
typedef struct LinkQueue
{
QueueNode *head; //队头指针
QueueNode *tail; //队尾指针
}LinkQueue;
typedef struct Node {
int data;
struct Node *next;
}Node;
//创建新节点函数
Node *CreateNode(int value)
{
//为新节点申请空间
Node new_node = (Node)malloc(sizeof(Node));
//给新节点赋值
new_node->data = value;
//将新节点的next指向空
new_node->next = NULL;
return new_node;
}
void Emptyqueue(Node **head)//释放队列空间
{
Node *cur = *head;
Node *temp;
if (head == NULL)
{
//空队列无需打印
return;
}
//遍历队列
while (cur != NULL)
{
temp = cur->next;
free(cur);
//移动cur,以达到遍历队列的目的
cur = temp;
}
*head = NULL;
}
//顺序打印队列元素
void queuePrint(Node *head)
{
Node *cur;
if (head == NULL)
{
//空队列无需打印
return;
}
cur = head;
//遍历队列
while (cur != NULL)
{
//打印元素和其对应的地址
printf("%d\n", cur->data);
//移动cur,以达到遍历队列的目的
cur = cur->next;
}
printf("\n");
}
//入队函数,插入链表尾部
Node *queuePushBack(Node **head, int value)
{
Node *cur;
Node *new_node;
//非法输入
if (head == NULL)
{
return NULL;
}
//空队列
if (*head == NULL)
{
//直接创建一个新的节点完成元素插入
*head = CreateNode(value);
return NULL;
}
else
{
cur = *head;
//遍历队列,让cur指向最后一个元素
while (cur->next != NULL)
{
cur = cur->next;
}
//创建一个新节点
new_node = CreateNode(value);
//将最后一个元素的next指向新节点
cur->next = new_node;
return new_node;
}
}
//出队函数,从链表头删除
void queuePop(Node **head)
{
//非法输入
if (head == NULL)
{
return;
}
//空队列没有可删除的元素
if (*head == NULL)
{
return;
}
else
{
//创建一个新的指针指向第二个元素
Node *new_node = (*head)->next;
//将头结点的next指向空
(*head)->next = NULL;
//删除该头结点
free(*head);
//将第二个元素设置成新的队头
*head = new_node;
}
return;
}
int IN_SET(Node *L, int value)//判断数据是否存在队列中
{
int ret = 1;
Node *p1 = L;
if (L == NULL) return ret;
while (p1)
{
if (value == p1->data)
{
ret = 0;
break;
}
p1 = p1->next;
}
return ret;
}
int INSERT_SET(Node **L, int value)//插入数据
{
int ret = 0;
if (IN_SET(*L, value))//判断是否存在
{
queuePushBack(L, value);//插入
ret = 1;
}
return ret;
}
int child(Node * L1, Node * L2)//判断集合1是否为集合2的子集,是返回1,不是返回0
{
Node * L, *p1, *p2;
int find = 0;
p1 = L1;
p2 = L2;
while (p1)//查找集合1
{
find = 0;
p2 = L2;
while (p2)//查找集合2中是否包含集合1的元素
{
if (p1->data == p2->data){//如果找到表示存在,find赋值为1并跳出
find = 1;
break;
}
p2 = p2->next;
}
if (!find) return 0;//一旦存在集合1中元素未包含在集合2,表示集合1非集合2子集,返回0停止判断
p1 = p1->next;
}
return 1;//集合1全部包含在集合2中,集合1是集合2子集
}
Node* intersection(Node * L1, Node * L2)//交集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//查找集合1
{
p2 = L2;
while (p2)//查找集合2
{
if (p1->data == p2->data){//集合1和集合2都存在的,插入到交集队列
queuePushBack(&L, p1->data);
break;
}
p2 = p2->next;
}
p1 = p1->next;
}
return L;
}
Node* Union(Node * L1, Node * L2)//并集
{
Node * L, *p1, *p2;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//集合1插入并集集合
{
queuePushBack(&L, p1->data);
p1 = p1->next;
}
while (p2)//集合2插入并集集合
{
if (IN_SET(L, p2->data)) queuePushBack(&L, p2->data);//集合2插入时判断是否重复
p2 = p2->next;
}
return L;
}
Node* difference(Node * L1, Node * L2)//差集
{
Node *L, *p1, *p2;
int find;
p1 = L1;
p2 = L2;
L = NULL;
while (p1)//将集合1减集合2的结果存入差集合
{
find = 0;
p2 = L2;
while (p2)
{
if (p1->data == p2->data){//在集合2中查找集合1中元素是否存在
find = 1;
break;
}
p2 = p2->next;
}
if (!find) queuePushBack(&L, p1->data);//存在集合1不存在集合2的元素插入差集合
p1 = p1->next;
}
return L;
}
int main()
{
FILE *fp = NULL; //文件句柄
int data, t = 1, i = 0;
Node *A = NULL, *B = NULL, *C = NULL, *D = NULL, *E = NULL;//队列
int k = 1;//为0时推出创新
while (k)
{
printf("1、创建队列AB\n");
printf("2、判断子集关系\n");
printf("3、求AB交集C\n");
printf("4、求AB并集D\n");
printf("5、求AB差集E\n");
printf("0、退出\n");
printf("请选择:");
scanf_s("%d", &i);
switch (i)
{
case 1:
Emptyqueue(&A);
Emptyqueue(&B);
printf("开始创建A:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&A, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
t = 1;
printf("开始创建B:\n");
while (t)
{
printf("请输入元素:");
scanf_s("%d", &data);
if (!INSERT_SET(&B, data)) printf("数据已经存在,插入失败\n");
else
{
printf("是否继续插入(1继续,0退出):");
scanf_s("%d", &t);
}
}
break;
case 2:
if (child(A, B)) printf("集合A是集合B子集\n");
else printf("集合A不是集合B子集\n");
if (child(B, A)) printf("集合B是集合A子集\n");
else printf("集合B不是集合A子集\n");
break;
case 3:
Emptyqueue(&C);
C = intersection(A, B);
printf("集合AB的交集C:\n");
queuePrint(C);
break;
case 4:
Emptyqueue(&D);
D = Union(A, B);
printf("集合AB的并集D:\n");
queuePrint(D);
break;
case 5:
Emptyqueue(&E);
E = difference(A, B);
printf("集合AB的差E:\n");
queuePrint(E);
break;
case 0: k = 0; break;
}
}
Emptyqueue(&A);
Emptyqueue(&B);
Emptyqueue(&C);
Emptyqueue(&D);
Emptyqueue(&E);
return 0;
}
你这个有点复杂呀
代码如下,如有帮助,请采纳一下,谢谢。
#include <stdio.h>
#include <stdlib.h>
struct DataSetQueue
{
double val;
DataSetQueue* next;
};
//显示队列
void show(struct DataSetQueue* head)
{
struct DataSetQueue* p = head;
while(p)
{
printf("%g ",p->val);
p = p->next;
}
printf("\n");
}
//创建队列
struct DataSetQueue* CreateQueue()
{
struct DataSetQueue *head = (struct DataSetQueue*)malloc(sizeof(DataSetQueue));
head->next =0;
return head;
}
//复制队列
struct DataSetQueue* Copy(struct DataSetQueue* head)
{
struct DataSetQueue* phead,*t,*p1,*p2;
phead = CreateQueue();
phead->val = head->val;
phead->next = 0;
p1 = phead;
p2 = head->next;
while(p2)
{
t = (struct DataSetQueue*)malloc(sizeof(DataSetQueue));
t->next = 0;
t->val = p2->val;
p1->next = t;
p1 = t;
p2 = p2->next;
}
return phead;
}
//添加到队列
void Push(struct DataSetQueue* head,double v)
{
struct DataSetQueue* p = head;
struct DataSetQueue* t = (struct DataSetQueue*)malloc(sizeof(DataSetQueue));
t->val = v;
t->next = 0;
while(p->next)
p = p->next;
p->next = t;
}
//第一个元素弹出队列
struct DataSetQueue* Pop(struct DataSetQueue* head)
{
struct DataSetQueue* p = head;
head = head->next;
return p;
}
//释放空间
void Release(struct DataSetQueue* head)
{
struct DataSetQueue* p = head;
while(head)
{
p = head->next;
free(head);
head = p;
}
}
//判断是否在队列中
int isInQueue(struct DataSetQueue* head,double v)
{
struct DataSetQueue* p = head;
while(p)
{
if(p->val == v)
return 1;
else
p = p->next;
}
return 0;
}
//从队列中删除某个元素
struct DataSetQueue* isInAndDel(struct DataSetQueue* head,double v)
{
struct DataSetQueue* p1;
struct DataSetQueue* t;
if(head == 0)
return 0;
if (head->val == v)
{
p1 = head;
head = head->next;
free(p1);
return head;
}
p1 = head;
while(p1->next)
{
t = p1->next;
if(t->val == v)
{
p1->next = t->next;
free(t);
return head;
}else
p1 = p1->next;
}
return 0;
}
//子集判定p2是否是p1的子集
int isSun(struct DataSetQueue* p1,struct DataSetQueue* p2)
{
//有问题,需要修改
struct DataSetQueue* t2;
struct DataSetQueue* tmp;
struct DataSetQueue* t1 = Copy(p1);
t2 = p2;
while(t2)
{
tmp = isInAndDel(t1,t2->val);
if(tmp)
{
t1 = tmp;
t2 = t2->next;
}
else
{
Release(t1);
return 0;
}
}
Release(t1);
return 1;
}
//求交集
struct DataSetQueue* Jiaoji(struct DataSetQueue* p1,struct DataSetQueue* p2)
{
struct DataSetQueue* head = 0;
struct DataSetQueue* tmp;
struct DataSetQueue* t1 = Copy(p1);
struct DataSetQueue* t2 = p2;
while(t2)
{
tmp = isInAndDel(t1,t2->val);
if (tmp)
{
t1 = tmp;
if(head == 0)
{
head = CreateQueue();
head->val = t2->val;
}else
{
Push(head,t2->val);
}
}
t2 = t2->next;
}
Release(t1);
return head;
}
//求并集
struct DataSetQueue* Bingji(struct DataSetQueue* p1,struct DataSetQueue* p2)
{
struct DataSetQueue* head,*t;
struct DataSetQueue* tmp;
struct DataSetQueue* t2 = p2;
head = Copy(p1);
while(t2)
{
Push(head,t2->val);
t2 = t2->next;
}
//减去两者的交集
t = Jiaoji(p1,p2);
while(t)
{
tmp = isInAndDel(head,t->val);
if(tmp)
head = tmp;
t = t->next;
}
Release(t);
return head;
}
//求差在p1中,但不在p2中
struct DataSetQueue* Chaji(struct DataSetQueue* p1,struct DataSetQueue* p2)
{
struct DataSetQueue* tmp;
struct DataSetQueue* head = Copy(p1);
struct DataSetQueue* t2 = p2;
while(t2)
{
tmp = isInAndDel(head,t2->val);
if(tmp)
head = tmp;
t2 = t2->next;
}
return head;
}
int main()
{
int i;
int a[]={1,2,3,4,5,6,7};
int b[]={3,6,9,11};
int c[]={1,2};
struct DataSetQueue* h1,*h2,*h3,*jj,*bj,*cj;
h1 = CreateQueue();
h2 = CreateQueue();
h3 = CreateQueue();
h1->val = a[0];
for (i=1;i<7;i++)
Push(h1,a[i]);
h2->val = b[0];
for (i=1;i<4;i++)
Push(h2,b[i]);
h3->val = c[0];
for(i=1;i<2;i++)
Push(h3,c[i]);
//显示结合
printf("集合1:");
show(h1);
printf("集合2:");
show(h2);
printf("集合3:");
show(h3);
//判断一个数是否在集合中
if(isInQueue(h1,3))
printf("3在集合1中\n");
else
printf("3不在集合1中\n");
if(isInQueue(h2,3))
printf("3在集合2中\n");
else
printf("3不在集合2中\n");
//判断是否属于
if (isSun(h1,h2))
printf("集合2属于集合1\n");
else
printf("集合2不属于集合1\n");
if (isSun(h1,h3))
printf("集合3属于集合1\n");
else
printf("集合3不属于集合1\n");
jj = Jiaoji(h1,h2);
printf("集合1与集合2的交集:");
show(jj);
bj = Bingji(h1,h2);
printf("集合1与集合2的并集:");
show(bj);
cj = Chaji(h1,h2);
printf("集合1与集合2的差集:");
show(cj);
Release(h1);
Release(h2);
Release(h3);
Release(jj);
Release(bj);
Release(cj);
return 0;
}
可以根据c++的queue库函数修改。