![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/*
******************************************************************************
假设由终端输入集合元素, 先建立表示集合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 ;
}
假设由终端输入集合元素, 先建立表示集合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 ;
}