问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C语言实现: 已知两个集合A,B(成员为整数),求两个集合的交集,并集,结果存 放于A中,按递增排列。

发布网友 发布时间:2022-05-27 13:57

我来回答

1个回答

热心网友 时间:2023-10-26 18:57

#include <stdio.h>
#include <malloc.h>

typedef struct node {
int num;
struct node *next;
}AGG;

AGG *CreateList() { // 创建单循环链表,返回链表头
AGG *head,*p;
int i,n;
printf("结点个数n = ");
scanf("%d",&n);
head = p = (AGG *)malloc(sizeof(AGG)); // 专用头结点
head->num = 0;
printf("输入 %d 整数(空格隔开):\n",n);
for(i = 0; i < n; ++i) {
p->next = (AGG *)malloc(sizeof(AGG));
scanf("%d",&p->next->num);
p = p->next;
}
p->next = head;
return head;
}

void RiseSort(AGG *head) { // 上升排序
AGG *p,*s,*pt; 
p = head;
s = p->next;
while(p->next != head) {
while(s->next != head) {
if(p->next->num > s->next->num) {
pt = p->next;
p->next = s->next;
s->next = p->next->next;
p->next->next = pt;
}
else s = s->next;
}
p = p->next;
s = p->next;
}
}

void Simplification(AGG *head) { // 去除相同的集合元素
AGG *p,*q,*s;
p = head->next;
q = p->next;
while(q != head) {
if(p->num == q->num) {
p->next = q->next;
s = q;
q = q->next;
delete s;
}
else {
p = p->next;
q = q->next;
}
}
}

AGG *CreateAgg() {
AGG *head;
head = CreateList();
RiseSort(head);;
Simplification(head);
return head;
}

void InsertNode(AGG *head,int num) {
AGG *t,*p = head;
while(p->next != head) {
if(p->next->num == num) return; 
if(p->next->num < num) p = p->next;
else {
t = (AGG *)malloc(sizeof(AGG));
t->num = num;
t->next = p->next;
p->next = t;
return;
}
}
t =(AGG *)malloc(sizeof(AGG));
t->num = num;
p->next = t; 
t->next = head;     // 插入在链表尾的处理
}

AGG *MergeAgg(AGG *A,AGG *B) {  // A∪B
AGG *head,*pa,*pb,*pc,*qc;
head = pc = (AGG *)malloc(sizeof(AGG));
pa = A->next;
while(pa != A) {
qc = (AGG *)malloc(sizeof(AGG));
qc->num = pa->num;
pc->next = qc;
pc = qc;
pa = pa->next;
}
pc->next = head;
pb = B->next;
while(pb != B) {
InsertNode(head,pb->num);
pb = pb->next;
}
return head;
}

AGG *MutualAgg(AGG *A,AGG *B) {  // A∩B
AGG *C,*pa,*pb,*pc,*qc;
C = pc = (AGG *)malloc(sizeof(AGG));
pc->num = 0;
pa = A->next;
pb = B;
while(pa != A) {
pb = B->next;
while(pb != B) {
if(pb->num == pa->num) {
qc = (AGG *)malloc(sizeof(AGG));
qc->num = pb->num;
pc->next = qc;
pc = qc;
}
pb = pb->next;
}
pa = pa->next;
}
pc->next = C;
return C;
}

AGG *DifferAgg(AGG *A,AGG *B) { // 返回A、B的差集 A-B
AGG *head,*p,*q,*r;
int tag;
head = r = (AGG *)malloc(sizeof(AGG));
for(p = A->next; p != A; p = p->next) {
tag = 1;
for(q = B->next; q != B && tag; q = q->next)
tag = p->num != q->num;
if(tag) {
r->next = (AGG *)malloc(sizeof(AGG));
r = r->next;
r->num = p->num;
}
}
for(p = B->next; p != B; p = p->next) {
tag = 1;
for(q = A->next; q != A && tag; q = q->next)
tag = p->num != q->num;
if(tag) {
r->next = (AGG *)malloc(sizeof(AGG));
r = r->next;
r->num = p->num;
}
}
r->next = head;
RiseSort(head);
return head;
}

void PrintList(AGG *head) {
AGG *p = head->next;
short counter = 0;
while(p != head) {
if(counter && counter%10 == 0) printf("\n");
printf("%5d",p->num);
counter++;
p = p->next;
}
if(counter % 10) printf("\n");
}

void freeheap(AGG *head) {
AGG *p,*q;
p = head;
q = p->next;
while(q != head) {
p = q;
q = p->next;
free(p);
}
free(head);
}

int main() {
AGG *A,*B,*C,*D,*E;
printf("创建集合 A:\n");
A = CreateAgg();
printf("创建集合 B:\n");
B = CreateAgg();
printf("集合A的元素有:\n");
PrintList(A);
printf("集合B的元素有:\n");
PrintList(B);
C = MutualAgg(A,B);
printf("交集 C = A∩B:\n");
PrintList(C);
printf("并集 D = A∪B :\n");
D = MergeAgg(A,B);
PrintList(D);
printf("差集 D = A-B :\n");
E = DifferAgg(A,B);
PrintList(E);
freeheap(A);
freeheap(B);
freeheap(C);
freeheap(D);
freeheap(E);
printf("\n\n");
return 0;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
对自己的前途怎么看? 开封哪里卖台球桌 范县新区哪里有卖麻将的 如何访问soutong防屏蔽网站 如何查看被屏蔽的属性? 商南有建设银行是真的吗? 输尿管结石能用体外碎石吗 输尿管体外碎石可进行几次 输尿管中段结石可以体外碎石吗 女人梦见大便是吉兆发财 如何用C语言实现集合合并 ,题目具体要求如下: 用C语言编写给定一个集合A,求A的所有非空子集。 jt女是什么网络词 高职单招被录取了,但是由于个人原因,我不想读了,不去会怎么样,对我有什么影响么? c语言 用数组的方式编写集合的交并 C语言实现集合合并的问题 C语言设计程序:实现输入数学集合的功能,集合的特点是元素必须两两不同。 如:2 6 5 4 8 编写程序,实现两个集合的交运算(用C语言) 怎么使C程序运行完后可以再次运行啊? 深职院单招旅游专业的面试,要不要英语的? C语言编程:顺序表实现集合的交与并 LA:3,6,9 LB:1,3,5,7,9,10 怎样用C语言实现集合的并交呢? 用C语言编了个程序,怎样才能让它在运行窗口中多次运行呢? c语言程序重复运行 c语言中,如何让程序再次执行程序本身 c语言中怎么让程序多次执行 c语言重新执行上一步命令 C语言中重复执行程序的问题 C语言中,怎么让程序重复运行?(要求是否退出Y/N) 人有悲欢离合,月有阴晴圆缺.反义句 女说jt本人是什么意思? 用C语言编写一个程序,从小到大输出一个集合 论坛中的JT是什么意思 贴吧里面的JT是什么意思? X-jT中文是啥意思? 我们人事让我做一个招聘JT 这个JT是什么意思 描写雨优美的语段 《下雨了,真好》500字作文 天阴了很久终于下雨了怎么描述? 下雨了比喻句 热交换的水水直混式热交换 雨点该怎么造句 Linux上如何搭建OpenCA服务器 换热机组都由哪些啊? 汽水直混式换热机组的应用情况,这种没有接触过,好用吗? 什么是板式水水换热机组 水水换热机组yahr一ss一3mw1套多少钱 山西有水水板式换热机组厂家吗? 山西堃成科技有哪些换热机组产品? 青年大学习是什么地域级别?