(二)静态链表
来源:互联网 发布:获取访客手机号码源码 编辑:程序博客网 时间:2024/06/05 18:41
静态链表的思想是数组代替指针,数组的元素都是由两个数据域组成,data和cur。数组的每一个下标都对应一个data和一个cur。cur相当于单链表的next指针,存放该元素的后继在数组中的下标。静态链表不一定用得着,或者很少用到,了解一下即可。
存储定义
#define MAXSIZE 1000typedef int ElemType;typedef struct { ElemType data; int cur;}Component,StaticLinkList[MAXSIZE];常用函数
//初始化Status InitList(StaticLinkList space){ int i; for(i=0;i<MAXSIZE-1;i++) space[i].cur = i+1; //目前链表为空,最后一个元素的cur为0 space[MAXSIZE-1].cur = 0; return OK;}//尾插插入五个数Status CreateList(StaticLinkList L){ int i,x; printf("请输入要插入多少个元素:"); scanf("%d",&x); for(i=1;i<=x;i++){ printf("请输入第%d个元素的值:",i); scanf("%d",&L[i].data); L[0].cur += 1; } L[x].cur = 0; L[MAXSIZE-1].cur = 1; return OK;}//输出静态链表Status OutputList(StaticLinkList L){ int i = 1; while(L[i].data){ printf("下标:%d ",i); printf("数据:%d ",L[i].data); printf("游标:%d\n",L[i].cur); i = L[i].cur; } return OK;}int ListLength(StaticLinkList L){ int j = 0; int i = L[MAXSIZE-1].cur; while(i){ i = L[i].cur; j++; } return j;}//若备用链表非空,返回分配的节点下标int Malloc_SLL(StaticLinkList space){ int i = space[0].cur; if(space[0].cur) //把L的下一个分量用来做备用 space[0].cur = space[i].cur; return i;}//在L的第i个元素之前插入新的元素eStatus ListInsert(StaticLinkList L,int i,ElemType e){ int j,k,l; k = MAXSIZE - 1; if(i<i || i>ListLength(L) + 1) return ERROR; j = Malloc_SLL(L); if(j){ L[j].data = e; //找到第i个元素之前的位置 for (l = 1; l < i-1; l++) { k = L[k].cur; } //把第i个元素之前元素的cur赋值给新元素的cur L[j].cur = L[k].cur; //把新元素的下标赋值给第i个元素之前元素的cur L[k].cur = j; return OK; } return ERROR;}//意思是把要删除的元素变成第一个空闲元素void Free_SSL(StaticLinkList space,int k){ //把第一个元素的cur值赋值给要删除的分量cur space[k].cur = space[0].cur; //把要删除的分量下标值赋值给第一个元素的cur space[0].cur = k;}//删除在L中的第i个元素eStatus ListDelete(StaticLinkList L,int i){ int j,k; if(i<1 || i>ListLength(L)) return ERROR; k = MAXSIZE - 1; for (int j = 0; j <= i-1; j++) { k = L[k].cur; } j = L[k].cur; L[k].cur = L[j].cur; Free_SSL(L,i); return OK;}
main函数
/** * 静态链表 * 数组第一个和最后一个元素不存数据,未被使用的数组元素成为备用链表。 * 下标为0的元素的cur就存放备用的第一个节点的下标;数组最后一个元素的cur存放第一个有数值元素的下标 * @return */int main() { StaticLinkList L; InitList(L); CreateList(L); //OutputList(L); int i = 4; ElemType e = 3; ListInsert(L,i,e); //open(L); OutputList(L); printf("%d",L[0].cur); int j; printf("请输入要删除第几个元素:"); scanf("%d",&j); ListDelete(L,j); OutputList(L); return 0;}
阅读全文
0 0
- (二)静态链表
- 数据结构实验(二) 静态链表
- 数据结构二静态链表
- 实验二静态链表
- 实验二静态链表
- 实验二静态链表
- 实验二 线性表综合实验(静态链表)
- 实验二——静态链表
- 实验二之静态链表
- 实验二之静态链表
- 静态路由(二)
- 静态编译(二)
- 线性表之链表的实现(二)-静态链表实现
- 《数据结构》实验二:线性表综合实验——(4)静态链表
- 实验二 线性表综合实验之静态链表
- 实验二 线性表综合实验之《静态链表》
- 实验二 线性表综合实验之《静态链表》
- 实验二 静态链表实现学生成绩
- Docker小技巧(一)——阿里云CentOS7加速
- ZED stereo安装及使用相关
- 用户表单
- Unity 中XML序列化和反序列化
- SpringBoot学习之整合SSM+pagehelper+druid+单元测试
- (二)静态链表
- 十一个行为型模式5:中介者模式-Mediator Pattern【学习难度:★★★☆☆,使用频率:★★☆☆☆】
- codewars解题笔记 —— 数组的判断
- Java笔记--09
- 同是毕业两年
- 多线程简单实例
- [BZOJ1097][POI2007]旅游景点atr(状压dp)
- 2. Add Two Numbers
- 变态跳台阶