创建集合A,集合B。求表达式(A-B)U(B-A)的值。

来源:互联网 发布:微博抽奖软件 编辑:程序博客网 时间:2024/05/21 03:56

此程序编译时有一点问题,有时可以得到想要的结果,有些数据有事又可以通过测试,想了两三天,还是不得其解。望看过程序的高手们帮下小菜鸟。在此,感激不尽!!!



#include<stdio.h>

//============================
//线性静态单链表存储结构
//============================
#define MAXSIZE   1000//链表的最大长度
typedef int ElemType;
typedef struct {
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
//============================
//创建静态链表
//============================
void InitSpace_SL(SLinkList space)
{                              //将一维数组space中各分量链成一个备用链表,space[0].cur为指针头
int i;                 //"0"表示空指针
for(i=0;i<MAXSIZE-1;++i)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0;
}
//============================
//从备用静态链表中取出一个结点
//============================
int Malloc_SL(SLinkList space)
{                             //若分配空间链表非空,则返回分配的结点下标,否则返回0
int i;
i=space[0].cur;
if(space[0].cur)
space[0].cur=space[i].cur;
return i;
}
//============================
//将空闲结点插入备用链表中
//============================
void Free_SL(SLinkList space,int k)
{                            //将下标为k的空间结点回收到备用链表
space[k].cur=space[0].cur;
space[0].cur=k;
}
//===========================
//求(A-B)U(B-A)
//===========================
void difference(SLinkList space)
{                                 //依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)
                                  //的静态链表,S为其头指针.假设备用空间足够大,space[0].cur为其头指针.
int S,r,k,p;
int m,n,i,j,b;
InitSpace_SL(space); //初始化备用空间
S=Malloc_SL(space);  //生成S的头结点
r=S;                 //r指向S的当前最后结点
printf("请分别输入集合A和集合B的元素个数:\n");
scanf("%d%d",&m,&n); //输入A和B的元素个数
for(j=1;j<=m;++j)  //建立集合A的链表
{
i=Malloc_SL(space);  //分配结点
printf("请输入集合A的第%d个元素:\n",i-1);
scanf("%d",&space[i].data);   //输入A的元素值
space[r].cur=i;    //插入到表尾
r=i;
}
space[r].cur=0;           //尾结点的指针域为空
for(j=1;j<=n;++j)         //依次输入B的元素,若不在当前表中,则插入,否则删除
{
printf("请输入集合B的第%d个元素:\n",j);
scanf("%d",&b);
p=S;
k=space[S].cur;         //k指向集合A的第一个结点
while(k!=space[r].cur&&space[k].data!=b)//在当前的表中查找
{
p=k;
k=space[k].cur;
}
if(k==space[r].cur)//当前表中不存在该元素,插入在r所指结点之后,且r的位置不变
{
i=Malloc_SL(space);
space[i].data=b;
space[i].cur=space[r].cur;
space[r].cur=i;
printf("***************");//测试语句
}
else               //该元素已在表中请删除它
{                    
space[p].cur=space[k].cur;
Free_SL(space,k);
if(r==k)
r=p;//若删除的是r所指结点,则须修改尾指针
printf("===============");//测试语句
}
}
}
//===============================
//打印函数
//===============================
void print(SLinkList space)
{
int i;
for(i=2;space[i].cur!=0;++i)
{
printf("%d\t",space[i].data);
}
printf("%d\t",space[i].data);//输出指针域为0的结点的值
 
}
//===============================
//主函数
//===============================
void main()
{
SLinkList space;
difference(space);
printf("集合(A-B)U(B-A)={");
print(space);
printf("}\n");

}