标签:lin .data malloc 输入 开始 type max tsp IV
用一维数组来描述线性链表,数组的每个分量中存储该节点的值和下一个节点在数组中的索引值。
这种存储结构仍需要预先分配一个较大的空间,但在作插入和删除操作时,不需要移动元素。
该开始创建一个数组来存放结点,则需要辨别哪些索引值中的结点已经使用,哪些未使用,以及每个节点的下一个结点在数组中的索引值。
需要自己实现malloc()取出一个空闲结点,free()将一个节点放入静态链表中标记为空闲结点。
1.静态链表的每个节点的定义
typedef struct {
int data;//该节点的值
int next;//下一个结点的在数组中的索引值
}component,SLinkList[maxsize];
2.静态链表的初始化
void initSpace(SLinkList &space){
for(int i=0;i<maxsize;i++){
space[i].next=i+1; //初始时,下一个结点的索引值就是当前索引值加一
}
space[maxsize-1].data=0;//将最后一个节点指向1
}
3.从静态链表中取出一个空闲的结点
int malloc_SL(SLinkList &space){
//spcae[0]为头结点
int i=space[0].next;
if(i)
space[0].next=space[i].next;//取出一个后,头结点变为原来头结点的下一个结点
return i;
}
4.删除一个空闲结点,回收到静态链表中,可以下次分配出去
void free_SL(SLinkList &space,int k){
space[k].next = space[0].next;
space[0].next=k;//该节点变为空闲链表的头结点
}
5.应用:将数组A和数组B的不同元素存放到静态链表
//返回静态链表的头结点在数组中的索引值
int difference(SLinkList &space,int &st){
initSpace(space);//初始化静态链表
st = malloc_SL(space);//分配头结点
int r = st;
int m,n;
printf("输入数组A、B的长度: ");
scanf("%d%d",&m,&n);
int j=1;
for(j;j<=m;j++){//将A先全部存到静态链表中
printf("A[%d]= : ",j);
int i=malloc_SL(space);
scanf("%d",&space[i].data);
space[r].next=i;
r=i;
}
space[r].next=0;//最后一个节点的下一个结点置为0
// printf("A数组的值为:");
// print(space,st); 打印测试
printf("\n");
for(j=1;j<=n;j++){//读取数组B的每个值
printf("B[%d]= : ",j);
int b = 0;
scanf("%d",&b);
int p=st;
int k = space[st].next;
while(k!=0&&space[k].data!=b){ //查找是否已经存在b
p=k;
k=space[k].next;
}
if(k==0){ //不存在b
int i=malloc_SL(space);
space[i].data=b;
space[p].next=i;
space[i].next=0;
// printf("在a中不存在的有: %d\n",b);
}else{ //已经存在该元素
space[p].next = space[k].next;
free_SL(space,k);
if(r==k)
r=p;
}
// printf("\n");
}
return st;
}
5-2.应用2:将数组A和数组B的元素存放到静态链表,并让每个元素只出现一次
//对于B中的元素,如果已经存在,则不进行插入,也不删除已经存在的该元素,则只需将上面的代码中的
else{ //已经存在该元素
space[p].next = space[k].next;
free_SL(space,k);
if(r==k)
r=p;
}
//删除即可
标签:lin .data malloc 输入 开始 type max tsp IV
原文地址:https://www.cnblogs.com/hekuiFlye/p/9191337.html