静态链表的实现
来源:互联网 发布:网络调试助手使用说明 编辑:程序博客网 时间:2024/06/10 21:19
定义:用数组描述的链表叫做静态链表。
我们对数组的第一个和最后一个位置做了特殊处理,不存数据
未被使用的数组元素成为备用链表。
下标为0的元素的cur存放备用链表的第一个节点的下标。
数组最后一个元素的cur存放第一个有数值的元素的下标
注意链表的形成是用cur连到一起的
#include "string.h"#include "ctype.h"#include "stdio.h"#include "stdlib.h"#include "io.h"#include "math.h"#include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 1000 /* 存储空间初始分配量 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char ElemType; /* ElemType类型根据实际情况而定,这里假设为char */typedef struct{ ElemType data; int cur;}Component,StaticLinkList[MAXSIZE];//以节点的下标作为指针Status InitList(StaticLinkList space){ int i; for(i=0;i<MAXSIZE-2;i++){ space[i].cur=i+1; //数组的第一个位置用来记录未被使用的第一个位置的下标 } space[MAXSIZE-2].cur = 0; space[MAXSIZE-1].cur = 0;//数组的最后一个位置用来记录已经被使用的第一个位置的下标 return OK;}Status ListLength(StaticLinkList L){ int k; k = MAXSIZE-1; int i,count=0; while(L[k].cur!=0){ count++; k=L[k].cur; } return count;}//若备用的链表非空,返回的是分配的节点下标int Malloc_SLL(StaticLinkList space){ int i = space[0].cur; //获取到第一个元素位置的下标 if(space[0].cur){//如果还有备用位置 space[0].cur = space[i].cur;//使用下一个位置作为第一个备用位置 } return i;}Status ListInsert(StaticLinkList L , int i, ElemType e){ int j,k,l; k = MAXSIZE -1; if(i<1||i>ListLength(L)+1) return ERROR; j = Malloc_SLL(L); // printf("j=%d\n",j); if(j){//如果有空位置 L[j].data = e; for(l=1;l<=i-1;l++){ //找到第i-1个位置 k = L[k].cur; } L[j].cur = L[k].cur; //把第i-1个位置指向的下标赋值给新的存储位置。 L[k].cur = j; //新分配的节点下标 return OK; } return ERROR;}void Free_SSL(StaticLinkList space , int k){ //删除第k个位置的元素 space[k].cur = space[0].cur ;//把原空闲的位置赋值给释放的位置k space[0].cur = k; //使k成为第一个备用的位置}Status ListDelete(StaticLinkList L ,int i){//注意第i的位置的下标是第i-1位置的cur,不一定是i int j,k; if(i<1||i>ListLength(L)){ return ERROR; } k=MAXSIZE-1; for(j=1;j<=i-1;i++){ k = L[k].cur; } j = L[k].cur;//第i位置的下标 L[k].cur = L[j].cur;//第i-1位置的下标 Free_SSL(L,j); return OK;}Status ListTraverse(StaticLinkList L){ int j=0; int i=L[MAXSIZE-1].cur; while(i) { printf("%c ",L[i].data); i=L[i].cur; j++; } return j; printf("\n"); return OK;}int main(){ StaticLinkList L; Status i; i=InitList(L); printf("初始化L后:L.length=%d\n",ListLength(L)); i=ListInsert(L,1,'F'); i=ListInsert(L,2,'E'); i=ListInsert(L,1,'D'); i=ListInsert(L,1,'B'); i=ListInsert(L,1,'A'); printf("\n在L的表头依次插入FEDBA后:\nL.data="); ListTraverse(L); i=ListInsert(L,3,'C'); printf("\n在L的“B”与“D”之间插入“C”后:\nL.data="); ListTraverse(L); i=ListDelete(L,1); printf("\n在L的删除“A”后:\nL.data="); ListTraverse(L); printf("\n"); return 0;}
0 0
- 静态链表的实现
- 静态链表的实现
- 静态链表的实现
- 静态链表的实现
- 静态链表的实现
- 静态链表的实现
- 静态链表的实现
- 相对静态的链表实现
- 数据结构-静态链表的实现
- 静态链表的操作实现
- 静态链表的表示和实现
- 静态链表的表示和实现
- 静态链表的实现 部分完善
- Java静态链表的实现
- 静态链表的C++实现
- 单链表以及静态链表的实现
- 静态链表的C++实现
- C++ 静态链表的实现
- Android_程序未处理异常的捕获与处理
- POJ 3087 模拟+hash
- 阿里面试回来,想和Java程序员谈一谈
- 【noip2015】【DP】子串
- Yii2 - 03视图(View)操作,以及Layout的使用
- 静态链表的实现
- item点击回调封装(改变带来Position的参数)
- lintcode Max Points on a Line
- 使用Loader加载本地图片
- Java学习提要——对象序列化
- 读 《我的互联网方法论》 有感
- Ubuntu12.04(64bit)编译Android4.4源码和kernel
- 进程控制块PCB结构 task_struct 描述
- POJ_1915_Knight Moves