静态链表应用

 

代码
 
      
/* ******************************************************************************
假设由终端输入集合元素, 先建立表示集合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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/xyoung/archive/2010/11/03/1868371.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值