fatal.h

#include <stdio.h>
#include <stdlib.h> #define Error(Str) FatalError(Str)
#define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1)

cursor.h

typedef int ElementType;
#define SpaceSize 100 #ifndef _Cursor_H
#define _Cursor_H typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position; void InitializeCursorSpace(void); List MakeEmpty(List L);
int IsEmpty(const List L);
int IsLast(const Position P, const List L);
Position Find(ElementType X, const List L);
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, const List L);
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
Position Header(const List L);
Position First(const List L);
Position Advance(const Position P);
ElementType Retrieve(const Position P); #endif

cursor.c

#include "cursor.h"
#include <stdlib.h>
#include "fatal.h" /* Place in the interface file */
struct Node
{
ElementType Element;
Position Next;
}; struct Node CursorSpace[SpaceSize]; static Position CursorAlloc(void)
{
Position P; P = CursorSpace[0].Next;
CursorSpace[0].Next = CursorSpace[P].Next; return P;
} static void CursorFree(Position P)
{
CursorSpace[P].Next = CursorSpace[0].Next;
CursorSpace[0].Next = P;
} void InitializeCursorSpace(void)
{
int i; for (i = 0; i < SpaceSize; i++)
CursorSpace[i].Next = i + 1;
CursorSpace[SpaceSize - 1].Next = 0;
} List MakeEmpty(List L)
{
if (L != 0)
DeleteList(L);
L = CursorAlloc();
if (L == 0)
FatalError("Out of memory!");
CursorSpace[L].Next = 0;
return L;
} /* Return true if L is empty */
int IsEmpty(const List L)
{
return CursorSpace[L].Next == 0;
} /* Return true if P is the last position in list L */
/* Parameter L is unused in this implementation */
int IsLast(const Position P, const List L)
{
return CursorSpace[P].Next == 0;
} /* Return Position of X in L; 0 if not found */
/* Uses a header node */
Position Find(ElementType X, const List L)
{
Position P; P = CursorSpace[L].Next;
while (P && CursorSpace[P].Element != X)
P = CursorSpace[P].Next; return P;
} /* Delete from a list */
/* Assume that the position is legal */
/* Assume use of a header node */
void Delete(ElementType X, List L)
{
Position P, TmpCell; P = FindPrevious(X, L); if (!IsLast(P, L)) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = CursorSpace[P].Next;
CursorSpace[P].Next = CursorSpace[TmpCell].Next;
CursorFree(TmpCell);
}
} /* If X is not found, then Next field of returned value is 0 */
/* Assumes a header */
Position FindPrevious(ElementType X, const List L)
{
Position P; P = L;
while (CursorSpace[P].Next &&
CursorSpace[CursorSpace[P].Next].Element != X)
P = CursorSpace[P].Next; return P;
} /* Insert (after legal position P) */
/* Header implementation assumed */
/* Parameter L is unused in this implementation */
void Insert(ElementType X, List L, Position P)
{
Position TmpCell; TmpCell = CursorAlloc();
if (TmpCell == 0)
FatalError("Out of space!!!"); CursorSpace[TmpCell].Element = X;
CursorSpace[TmpCell].Next = CursorSpace[P].Next;
CursorSpace[P].Next = TmpCell;
} /* Correct DeleteList algorithm */
void DeleteList(List L)
{
Position P, Tmp; P = CursorSpace[L].Next; /* Header assumed */
CursorSpace[L].Next = 0;
while (P != 0)
{
Tmp = CursorSpace[P].Next;
CursorFree(P);
P = Tmp;
}
} Position Header(const List L)
{
return L;
} Position First(const List L)
{
return CursorSpace[L].Next;
} Position Advance(const Position P)
{
return CursorSpace[P].Next;
} ElementType Retrieve(const Position P)
{
return CursorSpace[P].Element;
}

testcurs.c

#include <stdio.h>
#include "cursor.h" void PrintList(const List L)
{
Position P = Header(L); if (IsEmpty(L))
printf("Empty list\n");
else
{
do
{
P = Advance(P);
printf("%d ", Retrieve(P));
} while (!IsLast(P, L));
printf("\n");
}
} int main()
{
List L;
Position P;
int i; InitializeCursorSpace();
L = MakeEmpty(0);
P = Header(L);
PrintList(L); for (i = 0; i < 10; i++)
{
Insert(i, L, P);
PrintList(L);
P = Advance(P);
}
for (i = 0; i < 10; i += 2)
Delete(i, L); for (i = 10; i < 15; i++)
{
Insert(i, L, P);
PrintList(L);
P = Advance(P);
} for (i = 0; i < 10; i++)
if (Find(i, L) == 0)
printf("Element %d Find fails\n", i); printf("Finished deletions\n"); PrintList(L); DeleteList(L); return 0;
}

函数调用关系图(Call graph)

3.线性表-cursor的更多相关文章

  1. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...

  2. 顺序存储线性表_ArrayList

    相信大家在日常开发过程中 List 应该使用的非常非常多,今天就来简单学习一下 List 的数据结构 顺序存储线性表. 一.什么是顺序存储线性表 顺序存储线性表是最基本.最简单.也是最常用的一种数据结 ...

  3. 线性表Linearlist

    顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST         1.置空表 void SetNull(&L)     2.求长度 int Length(L)     3.取元素 ...

  4. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  5. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  6. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  7. Java集合类学习笔记(各种线性表性能分析)

    ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...

  8. 动态分配的顺序线性表的十五种操作—C语言实现

    线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...

  9. Java Se :线性表

    Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...

随机推荐

  1. Java 8之二小坑:stream parallel 和 lamada

    Stream:parallel乱序 Java 8 stream流为处理集合时非常方便.遇到的一个坑是为了提高在多核cpu下的性能,尝试了parallel().数据源是HashSet的,在做分割的时候发 ...

  2. webstrom配置sass与less

    1.less 安装一个稳定版的node.[例如node-v4.4.4-x64] 然后直接在webstrom里导入那个lessc.cmd 2.sass 安装ruby. 安装完之后点开,Start那个安装 ...

  3. 【转载总结】jQuery和HTML5全屏焦点图

    选项设置与说明 Slider Revolution提供了很多参数选项设置: delay: 滑动内容停留时间.默认9000毫秒 startheight: 滑动内容高度,默认490像素. startwid ...

  4. 动态执行python脚本

    前言 存在许多独立的python脚本,这些脚本可能会增加,也可能会减少,现在需要按照某种顺序调度这些程序.在python的standard library中,有一个模块imp可以实现动态的调用ptho ...

  5. servlet 之 复习

    servlet 他是我们第一个动态资源,servlet和JSP都是. servlet ===> server applet 运行在服务器端的小程序. 1.获得请求 2.处理请求 3.完成响应 s ...

  6. java基本算法之快速排序

    快速排序:是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确 ...

  7. assign more memory to Gradle

    Please assign more memory to Gradle in the project's gradle.properties file.For example, the followi ...

  8. xamarin真的是一个鸡肋吗?

    team leader 极力推荐 Xamarin,于是下载下来体验了一把,并没有觉得用它来开发 App 会爽到哪里去,可能对于从事 C#开发的开发人员来说是个福音吧.于是看看别人对其评价如何,现粘贴如 ...

  9. Jetty使用教程(四:24-27)—Jetty开发指南

    二十四.处理器(Handler ) 24.1 编写一个常用的Handler Jetty的Handler组件用来处理接收到的请求. 很多使用者不需要编写Jetty的Handler ,而是通过使用Serv ...

  10. Jquery Mobile开发以及Js对象动态绑定

    动态创建对象并绑定属性: var instantiate = function (Type, args) { var Constructor = function () { }; Constructo ...