静态单链表
Posted hekuiflye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态单链表相关的知识,希望对你有一定的参考价值。
一、静态链表:
用一维数组来描述线性链表,数组的每个分量中存储该节点的值和下一个节点在数组中的索引值。
这种存储结构仍需要预先分配一个较大的空间,但在作插入和删除操作时,不需要移动元素。
该开始创建一个数组来存放结点,则需要辨别哪些索引值中的结点已经使用,哪些未使用,以及每个节点的下一个结点在数组中的索引值。
需要自己实现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(" "); 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 ",b); }else{ //已经存在该元素 space[p].next = space[k].next; free_SL(space,k); if(r==k) r=p; } // printf(" "); } return st; }
5-2.应用2:将数组A和数组B的元素存放到静态链表,并让每个元素只出现一次
//对于B中的元素,如果已经存在,则不进行插入,也不删除已经存在的该元素,则只需将上面的代码中的 else{ //已经存在该元素 space[p].next = space[k].next; free_SL(space,k); if(r==k) r=p; } //删除即可
以上是关于静态单链表的主要内容,如果未能解决你的问题,请参考以下文章