静态链表求集合(A-B)∪(B-A)

以下代码由C编写,VS调试:
#include<stdio.h>
#define MAXSIZE 20
typedef char ElemType;
typedef int Status;


//定义静态链表
typedef struct{
    ElemType data;
 int cur;
}component,SLinkList[MAXSIZE];


//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针"0"表示空指针
void InitSpace_SL(SLinkList space)
{
 int i;
 for(i=0;i<=MAXSIZE-1;++i)space[i].cur =i+1; 
 space[MAXSIZE-1].cur  =0;
} //InitSpace_SL
int Malloc_SL(SLinkList space)
{
 //若备用控件链表非空,则返回分配的节点下标,否则为0
 int i;
 i=space[0].cur;
 if(i)space[0].cur=space[i].cur;
 return i;
} //Malloc_SL


 //将下标为K的空闲节点收回到备用链表
void Free_SL(SLinkList space,int k)
{
 space[k].cur=space[0].cur;space[0].cur=k;
} //Free_SL


//依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)∪(B-A)的静态链表,
//S为其头指针。假设备用空间足够大,space[0].cur为其头指针。
void difference(SLinkList space,int *S)
{
 int j,r,k,i,p,m,n;
 char b;
 InitSpace_SL(space);    //初始化备用空间
 *S=Malloc_SL(space);    //生成S头结点,S为使用表的头结点
 r=*S;                   //r指向S的当前最后结点
 printf("请输入A和B集合的元素个数(中间用,隔开)\n");
 scanf("%d,%d%*c",&m,&n); //输入A和B的元素个数
 for(j=1;j<=m;++j){      //建立集合A的链表
  i=Malloc_SL(space);    //分配结点
        printf("请输入A集合的第[%d]个元素\n",j);
  scanf("%c%*c",&space[i].data); %*c可以回收输入的空格否则第一个字符输入时第二个字符会接受回车
  space[r].cur=i;r=i; //指向表尾 
 }//for
 space[r].cur=0;         //尾结点的指针为空
 for(j=1;j<=n;++j){      //依次输入B的元素,不存在插入,存在删除
        printf("请输入A集合的第[%d]个元素\n",j);
  scanf("%c%*c",&b);
  p=*S;k=space[*S].cur;
  while(k!=0&&space[k].data!=b){
   p=k;k=space[k].cur;
  }//while
  if(k==0){   //当前表中若不存在,插入在R之后,R的位置不变
   i=Malloc_SL(space);
   space[i].data=b;
   space[i].cur=space[r].cur;
   space[r].cur=i;
  }//if
  else{
   space[p].cur=space[k].cur;
   Free_SL(space,k);
   if(r==k)r=p; //若删除的是R所指节点,则需修改尾指针,也可以没有这句,R指针只有再创建链表的时候有用
  }//else
 }//for
}//difference


//输出函数
void display(SLinkList space){
 int i;
 i=space[1].cur; //起始第一个元素
 while(i!=0)     //第0个节点为空表起始头结点
 {
 printf("%d,%c\t",i,space[i].data );
 i=space[i].cur;
 }
}


void main()
{
 int  k; 
 SLinkList s; 
 difference(s,&k); 
 display(s);
 system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值