静态链表(C++实现)——基于数据结构(沈俊版)

初学数据结构,不喜勿喷。欢迎大佬们指正!

静态链表是利用数组来模拟存储空间来实现链表的,如果为数组中每一个元素附加一个链接指针(数组下标),就形成静态链表结构。它允许不改变各元素的物理位置,只要重新链接就能改变这些元素的逻辑顺序。由于它是利用数组定义的,在整个运算过程中存储空间的大小不会发生改变,因此称为静态链表。

静态链表(C++)源代码

// StaticLinkList.h
#ifndef STATICLINKLIST_H       //静态链表类模板头文件,仅供学习数据结构参考使用
#define STATICLINKLIST_K
#define MAXSIZE 1000
#include<iostream>
using namespace std;template <typename T>          //提前声明类模板
class StaticLinkList;template <typename T>
class Node                 //节点类
{private:T data;                //数据域,存放任意类型的数据int next;              //指针域,存放指向下一个节点的指针;每条链链尾元素的next值为-1friend class StaticLinkList<T>;  //声明友元,以便访问私有成员
};template <typename T>
class StaticLinkList         //静态链表类
{private:                    //静态链表分为两条链(严格上说是在同一片连续的存储空间上同时存放,每条链相邻元素之间逻辑上相连,但物理存储上不一定相连)int avail;              //avail作为可利用空间表表(不带头结点的链表)头指针,在无实际静态链表时值为0,即可利用空间表的开始int head;               //head作为实际静态链表(带头结点的链表)的头指针,一般置为0Node<T> *sll;           //用于存放静态链表的节点数组int size;               //记录链表容量
public:StaticLinkList();        //默认的构造函数StaticLinkList(T v[],int n,int Size=MAXSIZE);     //用连续的一组数构造静态链表virtual ~StaticLinkList();StaticLinkList(const StaticLinkList<T> &List);StaticLinkList<T> & operator=(const StaticLinkList<T> &List);void Insert(const T &e,const int &n);             // 指定逻辑顺序(第n个元素后)插入新元素void InsertElem(const T &e);                      // 静态链表表头之前插入新元素void FreeList();void DeleteElem(const int &n,T &e);void SetElem(const int &n,const T &e);void Reverse();                                   //实际静态链表逻辑顺序转置,可用空间表不变int Search(const T &e) const;                      //查找某个元素在实际静态链表中的逻辑顺序,若匹配失败则返回-1int Getlength() const;                           //获得实际静态链表的长度(元素个数)bool Full() const;bool Empty() const;void Output(ostream &out) const;
};template <typename T>
StaticLinkList<T>::StaticLinkList()
{avail = 0;head = -1;                         //链表未使用前head=-1size = MAXSIZE;sll = new Node<T>[MAXSIZE];for(int i=0;i<MAXSIZE-1;i++)sll[i].next = i+1;sll[MAXSIZE-1].next = -1;           //可利用表表尾节点的next域为-1}template <typename T>
StaticLinkList<T>::StaticLinkList(T v[],int n,int Size)     //用连续的一组数构造静态链表,未考虑异常处理
{head = 0;size = Size;sll = new Node<T>[Size];for(int i=0;i<Size-1;i++)             //初始化所有节点的next域,使得每个节点逻辑上相连sll[i].next = i+1;sll[Size-1].next = -1;                //表尾节点next域一定为0for(int i=1;i<=n;i++)sll[i].data = v[i-1];sll[n].next = -1;                     //实际静态链表最后一个节点next域表示为-1avail = (n+1)>=Size?-1:(n+1);         //判断是否存在可利用表以及avail指针的值
}template <typename T>
StaticLinkList<T>::~StaticLinkList()
{FreeList();
}template <typename T>
StaticLinkList<T>::StaticLinkList(const StaticLinkList<T> &List)
{*this = List;
}template <typename T>
StaticLinkList<T> & StaticLinkList<T>::operator=(const StaticLinkList<T> &List) //实现深拷贝
{if( &List == this )                 //判断是否为自身return *this;FreeList();if(List.Empty())return *this;sll = new Node<T>[List.size];head = List.head;avail = List.avail;size = List.size;for(int i=0;i<size;i++)sll[i].next = List.sll[i].next;    //拷贝next域int x = List.head;while(x!=-1)                           //拷贝实际静态链表的数据域{sll[x].data = List.sll[x].data;x = sll[x].next;                  //类似于动态链表的 p = p-> next语句,该语句可以让x指针指向实际静态链表的下一节点}return *this;
}template <typename T>
void StaticLinkList<T>::Insert(const T &e,const int &n)   // 指定逻辑顺序(第n个元素后)插入新元素
{if(Full())                              //判断是否表满{cout<<"链表已满,插入失败!"<<endl;return;}if( !Empty() )                      //当实际静态链表中已有节点时:{int t = avail,x = head;          //找到并用t取可利用表表头指针avail,并用其指向的节点存放新数据,下面完善指针指向关系avail = sll[avail].next;         // avail指向可利用表下一节点for(int i=0;i<n;i++)x = sll[x].next;             //找到原实际静态链表(逻辑上)第n个节点,其next域应赋值为tsll[t].next = sll[x].next;       //新节点的next域指向之前x的next域,实现连接sll[x].next = t;sll[t].data = e;}else                               //若此时为未使用的空链表:{head = 0;avail = 2;sll[1].data = e;sll[1].next = -1;             //直接在sll[1]位置插入数据}
}template <typename T>
void StaticLinkList<T>::InsertElem(const T &e)        // 静态链表表头之前插入新元素
{if(Full()){cout<<"链表已满,插入失败!"<<endl;return;}if( !Empty()){int t = avail ;avail = sll[avail].next;sll[t].next = sll[head].next;sll[t].data = e;sll[head].next = t;}else{head = 0;avail = 2;sll[1].data = e;sll[1].next = -1;}}template <typename T>
void StaticLinkList<T>::FreeList()
{head = -1;avail = 0;if(sll != NULL )delete [] sll;
}template <typename T>
void StaticLinkList<T>::DeleteElem(const int &n,T &e)
{if(Empty()){cout<<"链表为空,无法删除!"<<endl;return;}int x = head,y = head,z = avail;for(int i=0;i<n-1;i++)y = sll[y].next;x = sll[y].next;e = sll[x].data;sll[y].next = sll[x].next;avail = x;sll[avail].next = z;if(Empty()){avail = 0;head = -1;for(int i=0;i<size-1;i++)sll[i].next = i+1;sll[size-1].next = -1;}
}template <typename T>
void StaticLinkList<T>::SetElem(const int &n,const T &e)
{if(Empty())return;int x = head;for(int i=0;i<n;i++)x = sll[x].next;sll[x].data = e;
}template <typename T>
void StaticLinkList<T>::Reverse()
{if( Empty() || Getlength() == 1 )return;int a[Getlength()+1],x = head,j=0;while(x != -1){a[j++] = sll[x].next;x = sll[x].next;}x = 0;int n = Getlength();for(int i = 1;i<= n;i++){sll[x].next = a[n-i];x = sll[x].next;}sll[x].next = -1;}template <typename T>
int StaticLinkList<T>::Search(const T &e) const
{int pos = -1,x = head,i=0;while(x != -1){if( e == sll[x].data )pos = i;x = sll[x].next;i++;}return pos;
}template <typename T>
int StaticLinkList<T>::Getlength() const
{int num = 0,x = head;while(x != -1){x = sll[x].next;if( x != -1)num++;}return num;
}template <typename T>
bool StaticLinkList<T>::Full() const
{if(Getlength() == size - 1)return true;elsereturn false;
}template <typename T>
bool StaticLinkList<T>::Empty() const
{if(Getlength() == 0)return true;elsereturn false;
}template <typename T>
void StaticLinkList<T>::Output(ostream &out) const
{if( !Empty() ){out<<"实际静态链表:Head-->";out<<"sll["<<head<<']'<<"///"<<"-->";int x = head;x = sll[x].next;while( x!=-1 ){out<<"sll["<<x<<']'<<sll[x].data<<"-->";x = sll[x].next;}out<<"-1"<<endl;}elseout<<"无实际静态链表"<<endl;if( !Full() ){out<<"可利用空间表:Avail-->";int x = avail,i = 1;for(int i=0;i<10 && x != -1;i++ ){out<<"sll["<<x<<']'<<"-->";x = sll[x].next;}out<<"-1";}elseout<<"无可用空间"<<endl;
}template <typename T>
ostream & operator<<(ostream &out,const StaticLinkList<T> &List)
{List.Output(out);return out;
}
#endif // STATICLINKLIST_H

静态链表(C++实现)——基于数据结构(沈俊版)(初学者食用)相关推荐

  1. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  2. C语言中链表的英文名字,数据结构C语言版 循环链表表示和实现(国外英文).doc

    数据结构C语言版 循环链表表示和实现(国外英文) 数据结构C语言版 循环链表表示和实现(国外英文资料) Data structure, C language, circular list repres ...

  3. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  4. 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表

    循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...

  5. c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...

    「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...

  6. 数据结构 2-3-4 静态链表

    一.概念 静态链表相当于混合了数组和链表,单独的链表,使用next指针指向内存空间中下一个节点的位置来实现连接的,而数组中是用相对位置来实现,将二者混合,保留指向下一个的指针,但这个指针不是指针,而是 ...

  7. Scratch 与C语言实现数据结构静态链表的建立及操作

    Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...

  8. 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)

    目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生.这个标题是随手打上去的,感觉还蛮顺口,就这样了. 这个学期在学[数据结构与算法],而这是我面对的第一个实验题.因 ...

  9. C语言实现STL静态链表,先进后出的数据结构-栈 一

    1. 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构. 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而 ...

最新文章

  1. NXT节点搭建(三)安装Nxt客户端
  2. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第2章-连通性保持条件下多智能体系统群集运动控制
  3. 听“汉代风云”,看“晁错之死”
  4. php的pdo如何访问SQLserver_php使用pdo连接sqlserver示例分享
  5. 【2013.4.6】微软暑期实习生答案(zz)
  6. 环形数组求最大子数组之和
  7. 利用膨胀和腐蚀获取图像边缘 matlab实现
  8. 远程服务器窗口调大,远程桌面缩放
  9. Appium国内下载地址
  10. 最优化方法——梯度下降法、牛顿法、LM算法
  11. 赤兔AVI视频恢复软件找回永久删除的avi视频
  12. Shadowmask
  13. buff系统 游戏中_原神buff状态有哪些 buff状态系统解析
  14. java 计算行驶里程,js根据经纬度换算行驶里程
  15. JAVA计算机毕业设计智能停车场管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  16. 如何利用手机作为电脑的麦克风
  17. 2022面试技巧大全
  18. 四大ERP供应商SAP、Oracle、用友、金蝶哪个好
  19. 前端项目一键换肤vue+element(ColorPicker)
  20. ubuntu22安装多端同步的笔记软件——joplin

热门文章

  1. 迪米特法则(最少知道原则)
  2. IE7、IE6和火狐兼容性问题
  3. 2010年下半年 系统集成项目管理工程师 下午试卷
  4. spring boot 源码解析43-JmxMetricWriter详解
  5. PHP刹车助力,自动刹车辅助都是骗人玩意儿?
  6. spring factory-method和factory-bean 使用
  7. far在c语言中作用,C语言中的far关键字
  8. Swin Transformer全方位解读【ICCV2021马尔奖】
  9. Android图文混排(仿QQ空间评论)
  10. gStore:A Graph-based SPARQL Query Engine---part1