/*******************************************************************************
假设由终端输入集合元素, 先建立表示集合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;
}