利用静态链表计算集合(A-B)∪(B-A),由终端输入集合元素,先建立表示集合A的静态链表S,而后在输入集合B的元素的同时查找S表,若存在和B相同的元素,则从S表中删除之,否则将此元素插入S表。【算法2.16】
- 1.将整个数组空间初始化成一个链表
- 2.从备用空间取得一个结点
- 3.将空闲结点链结到备用链表上
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2 //堆栈上溢
#define UNDERFLOW -3 //堆栈下溢
#define MAXSIZE 1000
typedef int Status; //状态码识别类型
typedef int ElemType;
//▲00静态链表的存储结构
typedef struct{
ElemType data; //数据
int cur; //游标(Cursor)
}component, SLinkList[MAXSIZE];
//▲01将一维数组space中各分量链成一个备用链表
void InitSpace_SL(SLinkList &space){//space[0].cur为头指针
for(int i=0;i<MAXSIZE-1;i++){
space[i].cur=i+1;//下标为i结点的后继为下标是i+1的结点
}
//space[MAXSIZE-2].cur=0;//备用链表的最后一个空元素的cur指向0
space[MAXSIZE-1].cur=0;// "0"表示空指针
}
//▲02从备用空间申请结点空间
int Malloc_SL(SLinkList &space){
//若备用空间链表非空,则返回分配的结点下标,否则返回0
int i=space[0].cur;
if(space[0].cur){
space[0].cur=space[i].cur;//将备用链表的第一个结点抽出作待插入数据
//space[0].cur重新指向新的备用链表的第一个结点的下标
}
return i;
}
//▲03将下标为k的空闲节点回收到备用链表中
void Free_SL(SLinkList &space,int k){
space[k].cur=space[0].cur;//将被删除元素(即空闲结点)的游标指向备用链表的第一个结点的下标
space[0].cur=k;
}
void difference(SLinkList &space,int &S){
int i,j,r,p,k;
ElemType b;
InitSpace_SL(space);
S=Malloc_SL(space); //生成S的头结点
r=S; //r指向S的当前最后结点(尾指针)
space[r].cur=0;
int len_a,len_b;
scanf("%d%d",&len_a,&len_b);
for(j=0;j<len_a;j++){
i=Malloc_SL(space); //分配结点
scanf("%d",&space[i].data); //输入A的元素值
space[r].cur=i; //插到表尾
r=i;
}
space[r].cur=0; //尾结点(最后一个结点)的指针为空
for(j=0;j<len_b;j++){
scanf("%d",&b);
p=S; //p指向集合A的头结点
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所指结点之后
i=Malloc_SL(space);
space[i].data=b;
space[i].cur=space[r].cur;
space[r].cur=i;
r=i;
}else{ //找到,做删除操作
space[p].cur=space[k].cur;
Free_SL(space,k);
if(k==r){ //若删除的是r所指的结点,则需修改尾指针
r=p;
}
}
}
}
void PrintElem(ElemType e){
printf("%d ", e);
}
//▲15遍历
Status ListTraverse_SL(SLinkList space,void (visit)(ElemType),int H){
if(!H){
return 0;
}
int p=space[H].cur;
while(p){
visit(space[p].data);
p=space[p].cur;
}
printf("\n");
return 1;
}
int main(){
SLinkList space;
int S;
difference(space,S);
ListTraverse_SL(space,PrintElem,S);
return 0;
}