静态链表提问
这是从严蔚敏,数据结构出写出来的,(作了一点点修改)
程序代码:
#include<stdio.h>
#define MAXSIZE 1000
typedef struct
{
int data; //存储数据
int cur; //相当于 *next
}component,SLinkList[MAXSIZE];
void InitSpace(SLinkList *space) //初始化
{
//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,"0"表示空指针。
int i;
for(i=0;i<MAXSIZE-1;++i) space[i]->cur = i + 1;
space[MAXSIZE-1]->cur = 0;
}
int Malloc(SLinkList *space)
{
//若备用空间链表非空,则返回分配的结点下标,否则返回0
int i;
i = space[0]->cur;
if(space[0]->cur) space[0]->cur = space[i]->cur; //相当于逐渐向前移
return i;
}
void Free(SLinkList *space,int k)
{
//将下标为k的空闲结点回收到备用链表
space[k]->cur = space[0]->cur;
space[0]->cur = k;
}
int LocateElem(SLinkList s,int e)
{
//在静态单链线性表L中查找第1个值为e的元素
int i;
i = s[0].cur;
while(i && s[i].data!=e) i = s[i].cur; //i = s[i].cur相当于p = p->next;
return i;
}
void difference(SLinkList *space)
{
//依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)
//的静态链表,S为头指针,假设备用空间足够大,space[0].cur为其头指针。
int s;
int r,p,m,n,j,i,b,k;
InitSpace(space); //初始化备用空间
s = Malloc(space); //生成S的头结点
r = s; //r指向s的当前最后结点 r取得第一个位置
printf("please enter A and B elements\n");
scanf("%d,%d",&m,&n); //输入A和B的元素个数
for(j=1;j<=m;++j) //建立集合A的链表
{
i = Malloc(space); //分配结点 i取得第二个位置
scanf("%d",&space[i]->data);//输入A元素值
space[r]->cur = i; //插入到结尾
r = i;
}
space[r]->cur = 0; //尾结点指针为空
for(j=1;j<=n;++j) //依次输入B的元素,若不在当前表中,则插入否则删除
{
scanf("%d",&b); //先取得数据
p = s;
k = space[s]->cur; //指向集合A中第一个结点 即有数据的结点
while(k!=space[r]->cur && space[k]->data!=b) //当前表中查找
{
p = k; //接收找到 b 的位置
k = space[k]->cur;//向前移
}
if(k==space[r]->cur) //当前表中不存在该元素,插入在r所指结点之后,且r的位置不变
{
i = Malloc(space);
space[i]->data = b;
space[i]->cur = space[r]->cur;
space[r]->cur = i;
}
else //该元素存在表中,删除
{
space[p]->cur = space[k]->cur;
Free(space,k);
if(r==k) r = p; //若删除的是r所指结点,则需修改尾指针
}
}
}
/*void display(SLinkList *space)
{
int i,head;
head = space[0]->cur;
for(i=0;i<20;i++)
{
printf("%d,%d\n",space[head]->cur,space[head]->data);
head = space[head]->cur;
}
printf("\n");
}*/
void main()
{
SLinkList ss;
difference(&ss);
//display(&ss);
}
为什么运行时会有问题呢?请大大们指教下.






