诸如BASIC和FORTRAN等许多语言都不支持指针。如果需要链表而又不能使用指针,这时我们可以使用游标(cursor)实现法来实现链表。

在链表的实现中有两个重要的特点:

数据存储在一组结构体中。每一个结构体包含有数据以及指向下一个结构体的指针。

一个新的结构体可以通过调用malloc而从系统全局内存(global memory)得到,并可以通过free而被释放。

游标法必须能够模仿实现这两条特性:

定义一个全局的结构体数组(模拟系统全局内存)。对于数组中的任何单元,其数组下标可以用来代表一个地址。

typedef int ptr_to_node;
typedef ptr_to_node list;
typedef ptr_to_node position;struct node
{element_type     element;position         next;
};struct node cursor_space[spacesize];

在这个全局的结构体数组中,保留一个表freelist作为备用单链表,用来malloc或free游标可用空间,该表用0作为表头。刚开始时,freelist就是整个结构体数组。

需要理解的是:所有的链表,包括备用表和已用表,全部都在我们定义的全局结构体数组中,只是它们的表头不同,从不同的表头出发形成了不同的单链表。

假设我们定义了一个大小为11的游标空间,其初始化状态如下:

Slot Element Next
0
1
2
3
4
5
6
7
8
9
10
  1
2
3
4
5
6
7
8
9
10
0

注:对于Next, 0的值等价于NULL指针。

上面的状态用链表形式表示为:cursor_space[0]—>cursor_space[1]—>cursor_space[2]—>cursor_space[3]—>cursor_space[4]—>cursor_space[5]—>cursor_space[6]—>cursor_space[7]—>cursor_space[8]—>cursor_space[9]—>cursor_space[10]—>NULL.

为执行malloc功能,将(在表头后面的)第一个元素从freelist中删除。为了执行free功能,我们将该单元放在freelist的前端。

malloc和free的游标实现如下:

static position
cursor_alloc(void)
{position p;p = cursor_space[0].next;cursor_space[0].next = cursor_space[p].next;return p;
}static void
cursor_free(position p)
{cursor_space[p].next = cursor_space[0].next;cursor_space[0].next = p;
}

为加深理解,请参考如下实例:

Slot Element Next
0
1
2
3
4
5
6
7
8
9
10
-
b
f
header
-
header
-
c
d
e
a
6
9
0
7
0
10
4
8
2
0
1

如果单链表L的值是5,M的值是3,我们又规定了freelist表头为0,因此,从上表中我们可以得到三个链表:

freelist:cursor_space[0]—>cursor_space[6]—>cursor_space[4]—>NULL

L:header—>a—>b—>e—>NULL

M:header—>c—>d—>f—>NULL

freelist是分配L、M链表后还剩余的可分配空间。

游标实现

/* return ture if L is empty */
int isempty(list L)
{return cursor_space[L].next = 0;
}

/* return true if P is the last position in list L */int islast(position p, list L)
{return cursor_space[P].next == 0;
}

/* return position of X in L; 0 if not found */
/* uses a header node */position find(element_type X, list L)
{position p;p = cursor_space[L].next;while(p && cursor_space[p].element != X)p = cursor_space[p].next;return p;
}

/* delete first occurence of X from a list */
/* assume use of a header node */void delete(element_type X, list L)
{position p, tmpcell;p = find_previous(X, L);if(!islast(p, L)){tmpcell = cursor_space[p].next;cursor_space[p].next = cursor_space[tmpcell].next;cursor_free(tmpcell);}
}

/* insert (after legal position P) */void insert(element_type X, list L, position P)
{position tmpcell;tmpcell = cursor_alloc();if(tmpcell == 0)fatal_error("out of sapce!!!");cursor_space[tmpcell].element = X;cursor_space[tmpcell].next = cursor_space[P].next;cursor_space[P].next = tmpcell;
}

转载于:https://www.cnblogs.com/nufangrensheng/p/3594844.html

链表的游标(cursor)实现相关推荐

  1. SQL Server 数据库的维护(四)__游标(cursor)

    --维护数据库-- --游标(cursor)-- --概述: 注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制.可以将游标理解为指针.指针 ...

  2. PLSQL 循环游标 cursor loop fetch into

    PLSQL 循环游标 cursor 的一点心得体会 set serveroutput on---------------打印输出信息,默认是FALSE declare ---------------- ...

  3. Oracle中游标Cursor介绍

    转自:http://zohan.group.iteye.com/group/wiki/2278-cursor Oracle中游标Cursor介绍 一  概念 游标是SQL的一个内存工作区,由系统或用户 ...

  4. 游标cursor,游标循环和记录变量的定义

    1.游标 游标使用分为四步骤. a.声明游标 cursor 游标名(参数1 数据类型[,参数2 数据类型]) b.打开游标 open 游标名[(实际参数1[,实际参数2.........])]: c. ...

  5. VB6基本数据库应用(十):【增补篇】游标Cursor和锁Lock简介

    同系列的第十篇,上一篇在http://blog.csdn.net/jiluoxingren/article/details/48606399 [增补篇]游标Cursor和锁Lock简介 说起来,我自己 ...

  6. 【Python之pymysql库学习】二.游标cursor的相关知识(保姆级图文+实现代码)

    目录 读取的数据类型 读取的数据转为字典类型效果 读取的数据转为字典类型实现思路 读取的数据转为字典类型实现代码 关于游标的重置 总结 欢迎关注 『Python之pymysql库学习』 系列,持续更新 ...

  7. cursor java_ORACLE中的游标Cursor总结

    游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. 游标可分为: 1.       静态游标:分为显式(explicit)游标和 ...

  8. oracle 记录给游标,Oracle游标 CURSOR实例详解

    一.游标概述: 游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果. 每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理. 作用 ...

  9. Oracle中游标Cursor基本用法详解

    这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...

  10. SQL游标(cursor)详细说明及内部循环使用示例

    游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...

最新文章

  1. java mvc 小程序_[Java教程]Spring MVC 的环境搭建和入门小程序
  2. elasticSearch6源码分析(6)http和transport模块
  3. linux删除旧网卡,如何删除旧网卡驱动
  4. APT***的那些事
  5. android如何删除项目,AndroidStudio中怎样删除项目
  6. ubuntu16.04下安装mysql详细步骤
  7. 解决复制项目后名称不改变的问题:org.eclipse.wst.common.component
  8. CodeChef June Challenge 2017
  9. MySQL 5.7.12新增MySQL Shell命令行功能
  10. Win8.1下COCOS2D-X 3.4环境搭建
  11. 变频器的工作原理与结构介绍
  12. js会员头像上传拖动处理头像类
  13. ReactOS的SVN服务器
  14. Python将PDF转成图片—PyMuPDF和pdf2image
  15. php 手机号归属地 dat,GitHub - china-qd/phonedata: 手机号码归属地信息库、手机号归属地查询 phone.dat 最后更新:2020年04月...
  16. 精通 CSS+DIV 网页样式与布局 62
  17. 调试经验——键盘C键V键和H键失灵
  18. echarts实现多个y轴
  19. python爬取上市公司套期保值公告(巨潮网)--使用Selenium方法
  20. 【爆肝整理】现代网络安全基础术语词典,网络安全学习者必备

热门文章

  1. [C++]实现10以内整数的简单科学计算器
  2. Ajax技术(WEB无刷新提交数据)
  3. Android性能优化---布局优化
  4. WCF读书笔记(1)
  5. 奇盾安防监控视频恢复案例
  6. Ubuntu 16.04服务器 软件的安装及配置
  7. linux 下 maven 安装配置
  8. 关于JavaScript 中的变量
  9. 感悟Microsoft summer Camp 2010
  10. Enterprise Library引起的A reference to 'System.Design' could not be added