例223假設由終端輸入集合元素,先建立表示集合A的靜態鏈表S,而后在輸入B的元素的同時查找S表,若存在和B相同的元素,則
從S表中刪除之,否則將此元素插入S表
過程:
1.將整個數組空間初始化成一個鏈表
2.從備用空間取得一個節點
3.將空閑節點鏈結到備用鏈表上
算法如下:
算法2.14
void InitSpace_SL(SLinkList &space)
{
//將一維數組space中各分量鏈成一個備用鏈表,space[0].cur為頭指針
//"0"表示空指針
for(i=0;i<MaxSize-1;++i)
{
space[i].cur=i+1;
}
space[MaxSize-1].cur=0;
}//InitSpace_SL
算法2.15
int Malloc_SL(SLinkList &space)
{
//若備用空間鏈表非空,則返回分配的節點下標,否則返回0
i=space[0].cur;
if(space[0].cur)
{
soace[0].cur=space[i].cur
}
return i;
}Malloc_SL
算法2.16
void Free_SL(SLinkList &space,int k)
{
//將下標為k的空閑節點回收到備用鏈表
space[k].cur=space[0].cur;
space[0].cur=k;
}//Free_SL
算法2.17
void difference(SLinkList &space,int &S)
{
//依次輸入集合A和B的元素,在一維數組space中建立表示集合(A-B)U(B-A)
//的靜態鏈表,S為其頭指針.假設備用空間足夠大,space[0].cur為其頭指針
InitSpace_SL(space); //初始化備用空間
S=Malloc_SL(space); //生成S的頭節點
r=S; //r指向S的當前最后節點
scanf(m,n) //輸入A和B的元素個數
for(j=1;j<=m;++j) //建立集合A的鏈表
{
i=Malloc_SL(space); //分配節點
scanf(space[i].data); //輸入A的元素值
space[r].cur=i; //插入到表尾
r=i;
}//for
space[r].cur=0 //尾巴節點的指針為空
for(j=1;j<=n;++j)
{
scanf(b);
p=S;
k=space[S].cur; //k指向集合A中的第一個節點
while(k!=space[r].cur&&space[k].data!=b)
{
p=k;
k=space[k].cur;
}//while
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;
}//if
else
{//該元素已在表中,刪除之
space[p].cur=space[k].cur;
Free_SL(space,k);
if(r==k) r=p;//若刪除的是所指示的節點,則需要修改尾指針
}//else
}//for
}//difference