用线性表La和Lb分别表示集合A和集合B,现要求一个新的集合A=AUB。

如图,可是图中好像不完整,里面的j没有定义过,老师让我们写如题这个程序,可是我不会,请帮我把程序写出来好么?很急。... 如图,可是图中好像不完整,里面的j没有定义过,老师让我们写如题这个程序,可是我不会,请帮我把程序写出来好么?很急。 展开
 我来答
xoaxa
推荐于2016-12-01 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3420万
展开全部
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;

typedef struct set {
SElemType data;
struct set *next;
}*Set,*pSet;

pSet GetNewNode() {
pSet newnode = (pSet)malloc(sizeof(struct set));
if(newnode == NULL) {
printf("内存耗尽。\n");
exit(1);
}
return newnode;
}

Set InitSet() { // 初始化
pSet S = GetNewNode();
S->data = 0;
S->next = NULL;
return S;
}

Set CreateSet(SElemType a[],int n) { // 用数组创建集合
int i;
pSet S,p;
S = p = InitSet();
for(i = 0; i < n; ++i) {
p->next = GetNewNode();
p->next->data = a[i];
p = p->next;
}
p->next = NULL;
return S;
}

void CreateSet2(Set S) { // 用键盘输入数据创建集合
SElemType data;
pSet p = S;
while(scanf("%d",&data) == 1) { // 键入任意字母(串)结束创建
p->next = GetNewNode();
p->next->data = data;
p = p->next;
}
p->next = NULL;
}

void SortSet(Set S) { // 排序(增)
pSet p,q,pt;
for(p = S; p->next; p = p->next) {
q = p->next;
while(q->next) {
if(p->next->data > q->next->data) {
pt = p->next;
p->next = q->next;
q->next = p->next->next;
p->next->next = pt;
}
else q = q->next;
}
}
}

void ElemSwaraj(Set S) { // 元素单一化:集合中不能含有相同的元素
pSet p,q,pt;
for(p = S; p->next; p = p->next) {
q = p->next;
while(q->next) {
if(p->next->data == q->next->data) {
pt = q->next;
q->next = pt->next;
free(pt);
}
else q = q->next;
}
}
}

void ShowSet(Set S) {
pSet p;
if(S == NULL || S->next == NULL) {
printf("{\"空\"}\n");
return;
}
printf("{%d",S->next->data);
for(p = S->next->next; p; p = p->next)
printf(",%d",p->data);
printf("}\n");
}

Set CopySet(Set S) { // 集合复制
pSet T,p,q;
T = q = InitSet();
p = S->next;
while(p) {
q->next = GetNewNode();
q->next->data = p->data;
p = p->next;
q = q->next;
}
q->next = NULL;
return T;
}

void InsertSet(Set S,SElemType x) { // 插入元素x到集合中(有序)
pSet p,q;
q = GetNewNode();
q->data = x;
if(S->next == NULL) {
S->next = q;
q->next = NULL;
return;
}
for(p = S; p->next; p = p->next) {
if(p->next->data == x) return;
if(p->next->data > x) {
q->next = p->next;
p->next = q;
return;
}
}
p->next = q;
q->next = NULL;
}

Set MergeSet(Set A, Set B) { // 返回A和B的并集:A∪B
Set p,C = CopySet(A);
for(p = B->next; p; p = p->next)
InsertSet(C,p->data);
return C;
}

Set MutualSet(Set A, Set B) { // 返回A和B的交集:A∩B
pSet C,p,q;
C = InitSet();
for(p = A->next; p; p = p->next) {
for(q = B->next; q; q = q->next) {
if(p->data == q->data)
InsertSet(C,p->data);
}
}
return C;
}

int LengthSet(Set S) {
pSet p = S->next;
int len = 0;
if(S == NULL || S->next == NULL) return 0;
while(p) {
p = p->next;
++len;
}
return len;
}

void FreeSet(Set S) { // 释放动态堆内存
pSet q,p = S;
while(p) {
q = p;
p = q->next;
free(q);
}
}

int main() {
Set a[4]; 
SElemType s[] = {3,6,7,2,3,8};
SElemType t[] = {3,6,2,9,4,7};
int i,n = sizeof(s)/sizeof(s[0]);
int len,m = sizeof(t)/sizeof(t[0]);
a[0] = CreateSet(s,n);
SortSet(a[0]);
a[1] = CreateSet(t,m);
SortSet(a[1]);
ElemSwaraj(a[0]);
ElemSwaraj(a[1]);
a[2] = MergeSet(a[0], a[1]);
a[3] = MutualSet(a[0], a[1]);
for(i = 0; i < 4; ++i) {
len = LengthSet(a[i]);
printf("集合a[%d](%d):",i,len);
ShowSet(a[i]);
FreeSet(a[i]);
}
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式