静态链表StaticLinkList的C++实现代码与可用头文件下载
来源:互联网 发布:音效师前景 知乎 编辑:程序博客网 时间:2024/06/06 16:28
静态链表的头文件以及使用范例与说明的下载地址:
http://download.csdn.net/detail/banana_416432275/6965441
静态链表:用一个包含以下一个元素作为游标的结构体的静态数组,分别模拟成两条链表,一条是存放元素的链表,一条是存放备用区域的链表。数组的首元素纪录备用链表的第一个元素,数组的末元素纪录已存在数据链表的第一个元素。
下面粘出头文件代码,欢迎交流
#include<iostream>#define Status int#define OK 1#define ERROR 0#define MAXSIZE 100template<class ElemType>struct Component{ ElemType data; // 数据 int cur; // 游标 };template<class ElemType>class StaticLinkList{ private: Component<int> L[MAXSIZE]; // 根据需要修改此处<>内类型可使用其他类型的静态链表 public: Status InitList(); int Malloc_SSL(); Status ListInsert (int i, ElemType e); void Free_SSL(int k); Status ListDelete (int k); int ListLength(); ElemType GetElem(int i);};template<class ElemType>Status StaticLinkList<ElemType>::InitList(){// 初始化静态链表 int i; // 循环设置所有的游标进行初始化 for(i = 0; i < MAXSIZE-1; i++) L[i].cur = i + 1; // 目前静态链表空,最后一个元素的cur值为0 L[MAXSIZE-1].cur = 0; return OK;}template<class ElemType>int StaticLinkList<ElemType>::ListLength(){// 返回长度 int j = 0; int i = L[MAXSIZE - 1].cur; while(i) { i = L[i].cur; j++; } return j;}template<class ElemType>int StaticLinkList<ElemType>::Malloc_SSL(){// 开辟备用空间,返回分配结点的下标,失败时返回0; // 获取当前备用空间下的第一个下标 int i = L[0].cur; if (L[0].cur) {// 将已获取的备用空间的一下个空间设为当前备用空间的第一个 L[0].cur = L[i].cur; } return i;}template<class ElemType> Status StaticLinkList<ElemType>::ListInsert (int i, ElemType e){ int j, k, n; k = MAXSIZE - 1; // k是最后一个元素的下标 int length = ListLength(); if (i < 1 || i > length + 1 || length >= MAXSIZE - 2) { // 第三个条件为链表已满 return ERROR; } // 获取备用空间的下标 j = Malloc_SSL(); if(j) { L[j].data = e; // 找到第i个元素之前的位置 for (n = 1; n <= i-1; n++) { k = L[k].cur; } L[j].cur = L[k].cur; L[k].cur = j; } return ERROR;}template<class ElemType>void StaticLinkList<ElemType>::Free_SSL(int k){ // 将第一个元素cur值赋值给要删除的分量cur L[k].cur = L[0].cur; // 把要删除的分量下标赋值给第一个元素的cur L[0].cur = k; }template<class ElemType>Status StaticLinkList<ElemType>::ListDelete (int i){ int j, k; // i不合法时删除失败 if (i < 1 || i > ListLength()) { return ERROR; } k = MAXSIZE - 1; // 循环至k到要删除的节点前 for(j = 1; j <= i-1; j++) { k = L[k].cur; } j = L[k].cur; // 将该节点排出在元素链表之外 L[k].cur = L[j].cur; // 释放该节点 Free_SSL(L, j); return OK; }template<class ElemType>ElemType StaticLinkList<ElemType>::GetElem(int i){ int n; int k = MAXSIZE - 1; if (i < 1 || i > ListLength()) {// 如果i的取值不在范围内返回一个-1 return -1; } for (n = 1; n <= i; n++) { k = L[k].cur; } return L[k].data;}
静态链表的优缺点:
优点:*在插入和删除操作时,只需要修改游标,不需要移动移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:*没有解决连续存储分配带来的表长难以确定的问题
*失去了顺序存储结构伴随存取的特性
总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能离的方法。尽管大家不一定用得上,但这样得思考方式是非常巧妙得,应该理解其思想,以备不时之需。
0 0
- 静态链表StaticLinkList的C++实现代码与可用头文件下载
- StaticLinkList 静态链表
- 写文件头的算法流程及C代码实现
- c/c++头文件与cpp文件的切换实现
- C语言链表的实现(修改版)头文件
- STM32实现IIR滤波器,可用matlab生成的头文件
- 静态链表的实现与操作(C语言实现)
- 论坛可用的伪静态规则代码.htaccess文件
- 头文件与实现文件的关系
- 头文件与实现文件的关系
- asp.net(c#)文件下载实现代码
- C/C++头文件与实现文件中的内容安排
- c++ 头文件与c 头文件
- C++头文件与C头文件
- 【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
- 顺序表的头文件和头文件的实现
- 与string相关的头文件解析(C/C++)
- C头文件与库文件的区别
- Java中静态代理
- 关于如何通过apktool获取apk package name(包名)以及activity name
- COCOS2D-X中的Action测试练习
- c++ const
- asio::streambuf::consume(int n)
- 静态链表StaticLinkList的C++实现代码与可用头文件下载
- Calendar获取年、月、日、时、分、秒、毫秒
- apk签名原理及实现
- 趣写算法系列之--匈牙利算法
- MYSQL FUNCTION mysql.redis_servers_set_v2 does not exist
- 实现深拷贝的类 Deep Copy
- S3C6410按键驱动--中断方式
- HTTP请求 GET POST 网络编程实现
- POJ 3321 Apple Tree(dfs+树状数组)