代码
/*******************************************************************************
假设由终端输入集合元素, 先建立表示集合A的静态链表S, 而后在输入集合B的元素的同时
查找S表, 若存在和B相同的元素, 则从S表中删除之, 否则将此元素插入S表.
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000
#define INCREMENT 10
#define ElemType char
#define L_Size int
#define OK 1
#define Status int
typedef struct { //静态单链表
ElemType data;
int cur;
}SLinkNode, SLinkList[MAXSIZE];
Status InitSLinkList( SLinkList &L , L_Size len )
{
//将一维数组L中各分量链成一个备用链表,L[0].cur为头指针
//"0"表示空指针
int i;
for ( i = 0; i < len - 1; i++ )
{
L[i].cur = i + 1;
}
L[len-1].cur = 0; //表尾置空
return OK;
} //初始化一个MAXSIZE大小的静态链表
Status Malloc_SL( SLinkList &L )
{
//若备用空间链表非空, 则返回分配的结点下标,否则返回0
int i;
i = L[0].cur;
if ( i ) //分配成功
{
L[0].cur = L[i].cur;
}
return i;
}
Status Free_SL( SLinkList &L, int k )
{
//将下标为k的空间闲结点回收到备用链表
L[k].cur = L[0].cur;
L[0].cur = k;
return OK;
}
Status SLinkList_tail( SLinkList &L )
{
int i;
i = L[0].cur;
while ( L[i].cur )
{
i = L[i].cur;
}
return i;
}
Status difference( SLinkList &L, int &head )
{
//依次输入集合A和B的元素,在一维数组L中建产表示集合(A - B) - (B - A);
//的静态链表,S为其头指针.假设备用空间足够大, L[0].cur为其头指针
int i, index, tail, m, n, p, k; //m, n为集合A和B的元素个数
ElemType elem;
InitSLinkList( L, MAXSIZE ); //初始化备用空间
head = Malloc_SL( L ); //生成head的头结点
tail = SLinkList_tail( L ); //获取静态链表的尾结点下标
printf( "请输入集合A的元素个数:" );
scanf( "%d", &m ); //输入集合A的元素个数
getchar();
for ( i = 1; i <= m; i++ )
{
index = Malloc_SL( L ); //分配结点
scanf( "%c", &L[index].data ); //输入A的元素值
getchar();
//尾插法, 插入到表尾
L[tail].cur = index;
tail = index;
}
L[tail].cur = 0; //尾指针置空
printf( "请输入集合B的元素个数:" );
scanf( "%d", &n ); //输入集合B的元素个数
getchar();
for ( i = 1; i <= n; i++ )
{
//依次输入B的元素, 若不在当前表中, 则插入, 否则删除
scanf( "%c", &elem );
getchar();
p = head; k = L[head].cur; //k指向集合中的第一个结点
while ( k != L[tail].cur && L[k].data != elem ) //在当前表中查找
{
p = k;
k = L[k].cur;
} //while
if ( k == L[tail].cur ) //当前表中不丰在该元素, 插入在tail所指结点之后.
{
index = Malloc_SL( L );
L[index].data = elem;
L[index].cur = L[tail].cur;
L[tail].cur = index;
tail = index;
} //if
else //该元素已在表中, 则删除之
{
L[p].cur = L[k].cur;
Free_SL( L, k );
if ( tail == k ) //若删除的是tail所指向中的结点, 则修改尾指针
{
tail = p;
}
}
}
return OK;
}
Status print( SLinkList L , int head)
{
int p = L[head].cur;
while ( p )
{
printf( "%c ", L[p].data );
p = L[p].cur;
}
return OK;
} //输出静态链表中的元素
int main()
{
SLinkList L; int head;
head = 0;
difference( L, head );
print( L, head );
return 0;
}