以下代码由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");
}