早上写好的一个集合运算器,中午修改一下,就不知道怎么回事,错了,错了。
痛苦啊,学了数据结构,做的第一个稍微有点技术含量的程序就是这个用链表来来处理这个集合程序。现在程序输出居然错误了。早上还好好的,但是中午的一个修改,就全错误了,狂抓啊。对于我们这种新手来说,调试很痛苦,又不知道问谁,,,
suanfa.h
#include "head.h"
Status Init(linklist &L)
{
L=(linklist )malloc(sizeof(lnode));
if(!L)return ERROR;
L->data='0';
L->next=NULL;
return OK;
}
Status Insert(linklist &L,elemtype *Set)
{
linklist p,s;
p=L;
int index=0;
while(Set[index]!='\0')
{
s=(linklist )malloc(sizeof(lnode));
p->next=s;
p=p->next;
p->data=Set[index];
index++;
}
p->next=NULL;
return OK;
}
Status Tranver(linklist L)
{
linklist p=L->next;
int flag=1;
for(;p!=NULL;p=p->next)
{
if(flag==1)
{
printf("%c",p->data);
flag=0;
}
else
{
printf(",%c",p->data);
}
}
return OK;
}
//交集运算
Status jiaoji(linklist la,linklist lb,linklist &lc)
{
linklist qa=la->next,qb=lb->next,qc=lc,s;
while(qa&&qb)
{
if(qa->data==qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
qb=qb->next;
}
else
if(qa->data<qb->data)
{
qa=qa->next;
}
else
qb=qb->next;
}
return OK;
}
void sort(linklist &L)
{
int n=length(L);
elemtype temp;
linklist p=L->next,q;
int i,j;
for(i=1,p=L->next;i<=n;i++,p=p->next)
for(j=1+i,q=p->next;j<=n;j++,q=q->next)
if(p->data>q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
int length(linklist L)
{
int count=0;
linklist p;
for(p=L->next;p!=NULL;p=p->next)
count++;
return count;
}
void Bubble_sort (linklist &l) {
linklist p, q;
p = l->next;
elemtype temp;
for(p=l->next;p->next!=NULL;p=p->next)
{
for(p=l->next;p->next!=p||p->next!=NULL;p=p->next)
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
}
q=p;
}
return;
}
//求并集
Status bingji(linklist la,linklist lb,linklist &lc)
{
linklist qa=la->next,qb=lb->next,qc=lc,s;
while(qa&&qb)
{
if(qa->data==qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
qb=qb->next;
}
else
if(qa->data<qb->data)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
}
else
{
if(qc->data!=qb->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qb->data;
qc=qc->next;
}
qb=qb->next;
}
}
while(qa)
{
if(qc->data!=qa->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qa->data;
qc=qc->next;
}
qa=qa->next;
}
while(qb)
{
if(qc->data!=qb->data)
{
s=(linklist )malloc(sizeof(lnode));
if(!s)return ERROR;
qc->next=s;
s->next=NULL;
s->data=qb->data;
qc=qc->next;
}
qb=qb->next;
}
return OK;
}
#include "suanfa.h"
#include <string.h>
void menu(void)
{
linklist a,b,c;
printf("*******************************************************************************\n");
printf(" 集合运算器1.0 by 张**\n\n");
printf("1.输入集合A 2.输入集合B 3.求集合的交集 4.求集合的并集 0.退出\n");
char Set[100];
char choose;
do{
scanf("%c",&choose);
switch(choose)
{
case '1':
Init(a);
printf("请输入要运算的A集合:\n");
scanf("%s",Set);
Insert(a,Set);
sort (a);
printf("集合A=[");
Tranver(a);
printf("] 请继续...\n");
break;
case '2':
Init(b);
printf("请输入要运算的B集合:\n");
scanf("%s",Set);
Insert(b,Set);
sort (b);
printf("集合B=[");
Tranver(b);
printf("] 请继续...\n");
break;
case '3':
Init(c);
if(jiaoji(a,b,c)==OK)
printf("A与B交集=[");
Tranver(c);
printf("] 请继续...\n");
break;
case '4':
Init(c);
if(bingji(a,b,c)==OK)
printf("A与B并集=[");
Tranver(c);
printf("] 请继续...\n");
break;
}
}while(choose!='0');
}
#include<stdio.h>
#include<malloc.h>
typedef int Status;
#define OK 1
#define ERROR -1
typedef char elemtype;
typedef struct node{
elemtype data;
struct node *next;
} lnode, *linklist;
Status Init(linklist &L);
Status Insert(linklist &L,elemtype e);
Status Tranver(linklist L);
Status add(linklist la,linklist lb,linklist &lc);
void sort(linklist &L);
int length(linklist L);
#include"menu.h"
int main(void)
{
menu();
return 0;
}
#include <algorithm>
#include <iostream>
#include <functional>
#include <cstring>
using namespace std;
int main() {
char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;
char *Vowels = "aeiou" ;
char *AlphaNum = "0123456789abcdef" ;
char result[45] ;
char *last ;
int lenA = strlen(Alphabet) ;
int lenV = strlen(Vowels ) ;
int lenAN = strlen(AlphaNum) ;
cout << "Alphabet = " << Alphabet << endl ;
cout << "Vowels = " << Vowels << endl ;
cout << "AlphaNum = " << AlphaNum << endl ;
cout << "\nusing non-predicate versions" << endl ;
//non-predicate set_difference
last = set_difference(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_difference(Alphabet, AlphaNum) = " << result << endl ;
//non-predicate set_intersection
last = set_intersection(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_intersection(Alphabet, AlphaNum) = " << result << endl ;
//non-predicate set_symmetric_difference
last = set_symmetric_difference(Alphabet, Alphabet+lenA,
Vowels , Vowels +lenV,
result) ;
*last = 0 ;
cout << "set_symmetric_difference(Alphabet, Vowels) = " << result << endl ;
//non-predicate set_union
last = set_union(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_union(Alphabet, AlphaNum) = " << result << endl ;
cout << "\nusing predicate versions" << endl ;
//predicate set_difference
last = set_difference(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_difference(Alphabet, AlphaNum) = " << result << endl ;
//predicate set_intersection
last = set_intersection(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_intersection(Alphabet, AlphaNum) = " << result << endl ;
//predicate set_symmetric_difference
last = set_symmetric_difference(Alphabet, Alphabet+lenA,
Vowels , Vowels +lenV,
result , less<char>()) ;
*last = 0 ;
cout << "set_symmetric_difference(Alphabet, Vowels) = " << result << endl ;
//predicate set_union
last = set_union(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_union(Alphabet, AlphaNum) = " << result << endl ;
return 0 ;
}
两个集合都有的存入交集。
估计楼主,没有搞清楚
自己要实现可重复集,还是不重复集,如何定义并,交,差等集合运算。
[解决办法]
不重复集
A =1,2,5,8};
B =2,4,6,8};
并,交,差:
Union(A,B) = {1,2,4,5,6,8}
Add(A,B) ={2,8}
Diff(A,B) ={1,5}
Diff(B,A) ={4,6}
可重复集的一种方案:
A ={1,2,5,8};
B ={2,4,6,8};
并,交,差:
Union(A,B) = {1,2,2,4,5,6,8,8}
Add(A,B) ={2,8}
Diff(A,B) ={1,5}
Diff(B,A) ={4,6}
集合,一般不考虑顺序;
集合排序,是为了更方便操作。