Peck Chen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

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

 

 

 

posted on 2010-11-03 19:35  PeckChen  阅读(1009)  评论(0编辑  收藏  举报