只用C,不用C++和java,求具体能运行的代码
用一个队列实现数学上的集合(Set)的元素判定(属于、is a member of)、子集判定(包含于、is a subset of、is contained in)、交(intersection)、并(union)、差(complement、set-theoretic difference)运算,集合元素限定为整数。只能利用队列的入队和出队操作访问队列中元素。
数据结构(队列实现数学上的集合)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
- bx112233 2021-07-07 17:08关注
#include <stdio.h>
#include <stdlib.h>
//数据类型
#define ElemType inttypedef 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 inttypedef 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 inttypedef 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;
}
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 DS18B20内部ADC模数转换器
- ¥15 做个有关计算的小程序
- ¥15 MPI读取tif文件无法正常给各进程分配路径
- ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
- ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
- ¥15 setInterval 页面闪烁,怎么解决
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动