2.3线性表的链式表示和实现(静态链表)
样例输入
4 2
3 5 7 9
3 2
样例输出
find success!
5 7 9 2
实现的功能是:
将两个链表同时存在的元素删除
链表2存在而链表1不存在的元素插入到链表1中
查找给定位置的元素
————
自己想的样例 目的是为了更具体掌握该知识点
#include<stdio.h>
#define MAXSIZE 1000 //链表的最长长度
#define ERROR 0;
#define OK 1;
typedef int ElemType;
int m,n;
//----线性表的静态单链表存储结构-----
typedef struct{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
void InitSpace_SL() //算法2.14
{//将一维数组space中的各分量链成一个备用链表,space[0].cur为头指针
//'0'表示空指针
SLinkList space;
int i;
for(i = 0; i < MAXSIZE-1; i ++)
{
space[i].cur = i+1;
}
space[i].cur = 0;
}
int Malloc_SL() //算法2.15
{//若备用空间链表非空,则返回分配的结点下标,否则返回0
SLinkList space;
int i;
i = space[0].cur ;
if(space[0].cur)
{
space[0].cur = space[i].cur ;
}
return i;
}
void Free_SL(int k) //算法2.16
{//将下标为k的空闲结点回收到备用链表
SLinkList space;
space[k].cur = space[0].cur ;
space[0].cur = k;
}
void print(int s,int r,SLinkList space)
{
int k = space[s].cur;
while(space[r].cur != k)
{
printf("%d ",space[k].data );
k = space[k].cur ;
}
printf("\n");
}
int LocateElem_SL(int s,SLinkList space,int m)//算法2.13
{//在静态单链线性表中查找第一个值为e的元素
int p = space[s].cur ;
while(p < m)
{
p = space[p].cur ;
}
if(p == m)
{
return OK;
}
else
return ERROR;
}
void difference(int m,int n)
{//依次输入集合A和集合B的元素,在一维数组space中建立表示集合
//的静态链表,s为其头指针。假设备用空间足够大,space[0].cur为其头指针
SLinkList space;
int s,r,k,d,i,j,p;
InitSpace_SL();//初始化备用空间
s = Malloc_SL();//生成s头结点
r = s;//r指向s的当前最后结点
for( i = 1; i <= m; i ++)//建立集合A链表
{
j = Malloc_SL();//分配结点
scanf("%d",&space[j].data );//输入A的元素值
space[r].cur = j;//插入到表尾
r = j;
}
space[r].cur = 0;//尾结点的指针为空
for( i = 1; i <= n; i ++)
{//依次输入B的元素,若不在当前表中,则插入,否则删除
p = s;
k = space[s].cur ;//k指向集合的第一个结点
scanf("%d",&d);//在当前表中查找
while(k != space[r].cur && space[k].data != d)
{
p = k;
k = space[k].cur ;
}
if( k == space[r].cur )
{//当前表不存在该元素,插入在r所指的结点之后,且r位置不变
j = Malloc_SL();
space[j].data = d;
space[j].cur = space[r].cur ;
space[r].cur = j;
r = j;
}
else
{//该元素已在表中,删除之
space[p].cur = space[k].cur ;
Free_SL(k);
if(r == k)
p = r;
}
}
k = space[s].cur;
if(LocateElem_SL(s,space,m))
printf("find success!\n");
print(s,r,space);
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
difference(m,n);
}
return 0;
}