静态链表
来源:互联网 发布:linux运维之道 百度云 编辑:程序博客网 时间:2024/06/08 19:07
使用游标(cursor)来模拟指针,由程序员自己编写“分配结点”和“回收结点”的过程。
每个节点应含有两个域:element域和next域。
next域是游标指示器,指示其后继结点在结构数组中的相对位置(即数组的下标),数组的第0个分量可以设计成表的头结点。
//文件 CursorList.h,静态链表的定义#ifndef CursorList_#define CursorList_template <class Object>class CursorListItr;template <class Object>class CursorList{public: CursorList(); CursorList(const CursorList & rhs); ~CursorList(); bool isEmpty() const; void makeEmpty(); CursorListItr<Object> first() const; void insert(const Object & x, const CursorListItr<Object> & p); CursorListItr<Object> find(const Object & x) const; CursorListItr<Object> findPrevious(const Object & x) const; void remove(const Object & x);public: struct CursorNode { CursorNode() : next(0) {} private: CursorNode(const Object & theElement, int n):element(theElement), next(n) {} Object element; int next; friend class CursorList<Object>; friend class CursorListItr<Object>; };private: int header; static vector<CursorNode> cursorSpace; static void initializeCursorSpace(); static int alloc(); static void free(int p); friend class CursorListItr<Object>;};//CursorListItr类:维护 "当前位置"template <class Object>class CursorListItr{public: CursorListItr() : current(0) {} bool isPastEnd() const { return current == 0; } void advance() { if (!isPastEnd()) current = CursorList<Object>::cursorSpace[current].next; } const Object & retrieve() const { if (isPastEnd()) throw BadIterator(); return CursorList<Object>::cursorSpace[current].element; }private: int current; //当前位置 friend class CursorList<Object>; CursorListItr(int theNode) : current(theNode) { }};#endif // CursorList_
//静态链表的主要实现如下面代码所示#include "CursorList.h"//初始化template <class Object>void CursorList<Object>::initializeCursorSpace(){ static int cursorSpaceIsInitialized = false; if (!cursorSpaceIsInitialized) { cursorSpace.resize(100); for (int i = 0; i < cursorSpace.size(); i++) cursorSpace[i].next = i + 1; cursorSpace[cursorSpace.size() - 1].next = 0; cursorSpaceIsInitialized = true; }}//分配结点template <class Object>int CursorList<Object>::alloc(){ int p = cursorSpace[0].next; cursorSpace[0].next = cursorSpace[p].next; return p;}//释放结点template <class Object>void CursorList<Object>::free(int p){ cursorSpace[p].next = cursorSpace[0].next; cursorSpace[0].next = p;}//构造静态表template <class Object>CursorList<Object>::CursorList(){ initializeCursorSpace(); header = alloc(); cursorSpace[header].next = 0;}//逻辑判空template <class Object>bool CursorList<Object>::isEmpty() const{ return cursorSpace[header].next == 0;}//在p所指向单元后插入xtemplate <class Object>void CursorList<Object>::insert(const Object & x, const CursorListItr<Object> & p){ if (p.current != 0) { int pos = p.current; int tmp = alloc(); cursorSpace[tmp] = CursorNode(x, cursorSpace[pos].next); cursorSpace[pos].next = tmp; }}//返回值为x的第一个结点template <class Object>CursorListItr<Object> CursorList<Object>::find(const Object & x) const{ int itr = cursorSpace[header].next; while (itr != 0 && cursorSpace[itr].element != x) itr = cursorSpace[itr].next; return CursorListItr<Object>(itr);}//返回值为x的第一个结点的前驱template <class Object>CursorListItr<Object> CursorList<Object>::findPrevious(const Object & x) const{ int itr = header; while (cursorSpace[itr].next != 0&&cursorSpace[cursorSpace[itr].next].element != x) itr = cursorSpace[itr].next; return CursorListItr<Object>(itr);}//删除第一个值为 x的元素template <class Object>void CursorList<Object>::remove(const Object & x){ CursorListItr<Object> p = findPrevious(x); //查找前驱 int pos = p.current; if (cursorSpace[pos].next != 0) { int tmp = cursorSpace[pos].next; cursorSpace[pos].next = cursorSpace[tmp].next; free (tmp); }}
0 0
- 静态链表
- VB静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表实例
- 静态链表
- 静态链表。实现。
- 静态链表
- 静态链表
- 静态链表例子
- 静态链表模版
- 静态链表
- 【数据结构】静态链表
- 静态链表
- 静态链表
- 微信调用第三方API
- php socket_recv 和 socket_read
- 《Linux Shell编程学习笔记之一》
- C语言学习日记11
- v4l2文档之——media framework
- 静态链表
- 【SAP】自定义权限对象
- python将list转为matrix
- Android 屏幕适配方案系列二
- 我的资源
- C++ inline 与#define 区别联系
- 淘宝搜索框效果
- 计正和负
- hadoop2.2.0集群搭建(一)集群规划