早教吧作业答案频道 -->其他-->
C++题目:定义集合的ADT并实现之(包括集合的交,并,判定是否为空,求长度等等运算).请大神给出设计思路,
题目详情
C++题目:定义集合的 ADT 并实现之(包括集合的交,并,判定是否为空,求长度等等运算).
请大神给出设计思路,
请大神给出设计思路,
▼优质解答
答案和解析
#include
#include
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;
}
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]);
}
return 0;
}
#include
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;
}
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]);
}
return 0;
}
看了 C++题目:定义集合的ADT...的网友还看了以下:
元素a属于D/T,D和T为集合,D/T是什么意思? 2020-04-08 …
下列概念中,叙述不恰当的是()A.完成反射的神经结构成为反射弧B.神经纤维末端的细小分支称为神经末 2020-05-13 …
英语 情态动词 You____ do i if you really don't want to 2020-05-17 …
当x∈[0,4]求定积分∫1/(1+√x)dx设√x=t则t∈[0,2]dx=2tdt原式=2∫t 2020-07-23 …
C语言指针交换值问题#includeintfun(int*a,int*b){int*t;*t=*a 2020-07-23 …
求一个矩阵的特征值e1,-t,0,0,0,……0,-t-t,e2,-t,0,0……,0,00,-t, 2020-10-31 …
矩形ABCD中,AD=32厘米,AB=24厘米,点P是线段AD上一动点,O为BD的中点,PO的延长线 2020-11-04 …
请问怎么弄数学建模的灵敏度分析呢,下面这个程序要怎么改正?ft=@(h)((0.16-180)-(( 2020-11-08 …
下列加线字注音全都正确的的一项是A.管弦xián嫉妒jì廿七niàn不可估量liàngB.上溯shù 2020-12-07 …
用mathmetica求解常微分方程组的问题!急急急r=1,d=0.5,a=0.1,b=0.02,x 2021-01-04 …