静态链表StaticLinkList的C++实现代码与可用头文件下载
2014-02-26 18:40
726 查看
静态链表的头文件以及使用范例与说明的下载地址:
http://download.csdn.net/detail/banana_416432275/6965441
静态链表:用一个包含以下一个元素作为游标的结构体的静态数组,分别模拟成两条链表,一条是存放元素的链表,一条是存放备用区域的链表。数组的首元素纪录备用链表的第一个元素,数组的末元素纪录已存在数据链表的第一个元素。
下面粘出头文件代码,欢迎交流
静态链表的优缺点:
优点:*在插入和删除操作时,只需要修改游标,不需要移动移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:*没有解决连续存储分配带来的表长难以确定的问题
*失去了顺序存储结构伴随存取的特性
总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能离的方法。尽管大家不一定用得上,但这样得思考方式是非常巧妙得,应该理解其思想,以备不时之需。
http://download.csdn.net/detail/banana_416432275/6965441
静态链表:用一个包含以下一个元素作为游标的结构体的静态数组,分别模拟成两条链表,一条是存放元素的链表,一条是存放备用区域的链表。数组的首元素纪录备用链表的第一个元素,数组的末元素纪录已存在数据链表的第一个元素。
下面粘出头文件代码,欢迎交流
#include<iostream> #define Status int #define OK 1 #define ERROR 0 #define MAXSIZE 100 template<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; }
静态链表的优缺点:
优点:*在插入和删除操作时,只需要修改游标,不需要移动移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:*没有解决连续存储分配带来的表长难以确定的问题
*失去了顺序存储结构伴随存取的特性
总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能离的方法。尽管大家不一定用得上,但这样得思考方式是非常巧妙得,应该理解其思想,以备不时之需。
相关文章推荐
- 采用struts2+hibernate实现保存文件到Oracle数据库&&并附下载代码【导入即可用】;数据库中保存blob类型的二进制文件
- 实现从服务器下载文件代码
- C#实现文件上传及文件下载功能实例代码
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
- php实现文件下载代码分享
- PHP通过header实现文本文件下载的代码
- PHP通过header实现文本文件下载的代码
- 使用PHP下载CSS文件中的所有图片【几行代码即可实现】
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
- ASP.NET 大文件下载的实现思路及代码
- php实现文件下载的一段代码
- .net 代码实现文件下载
- 实现文件下载的java代码
- c++ 使用socket实现C/S端文件的下载传输
- Java实现多线程文件下载的代码示例
- C++在头文件中编写实现代码的坏处
- Python实现多线程下载文件的代码实例