全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ 实现静态单链表的实例

C++ 实现静态单链表的实例

利用数组实现的静态单链表,与严蔚敏书实现略有不同,不另设回收空间。有任何BUG或错误,希望各位朋友多多反馈~~感激不尽

/* Author : Moyiii 
 * Mail: lc09@vip.qq.com 
 * 静态链表实现,仅作学习之用,当然如果 
 * 你想拿去用,随你好啦。 
*/ 
 
#include <iostream> 
 
using namespace std; 
 
#define MAX_LIST_SIZE 100 
 
class Node 
{ 
public: 
  int data; 
  int cur; 
}; 
 
 
class SLinkList 
{ 
public: 
  SLinkList(); 
  //和普通的线性链表区别不是很大。除了两个分配 
  //和回收节点空间的函数,具体算法请参考课本或 
  //网络资料 
  int newNode(); 
  bool deleteNode(int pos); 
  bool insertElem(int pos, int elem); 
  bool deleteElem(int pos); 
  int& getElem(int pos); 
  int getLength(); 
  bool isEmpty(); 
  void print(); 
  void clear(); 
 
private: 
  int head;//这个可以不要,默认等于0 
  int space; 
  int length; 
  Node *elems; 
}; 
 
 
SLinkList :: SLinkList() 
{ 
  // 0号位置为头几点,不可以更改,初始指向自己 
  // 从1~MAXLENGTH为可分配节点,最初由space管理 
 
  elems = new Node[MAX_LIST_SIZE]; 
  if(!elems) 
  { 
    cout << "Malloc failed!" << endl; 
  } 
 
  head = space = length = 0; 
 
  for(int i = 0; i < MAX_LIST_SIZE; ++i) 
  { 
    elems[i].data = i; 
    elems[i].cur = i + 1; 
  } 
  elems[MAX_LIST_SIZE - 1].cur = 0; 
  elems[0].cur = 0; 
  space = 1; 
} 
 
//从space指向的备用节点链表中取下一个节点 
int SLinkList :: newNode() 
{ 
  if(space == 0) 
  { 
    cout << "Space is full!" << endl; 
    return 0; 
  } 
 
  int pos = space; 
  space = elems[space].cur; 
  elems[pos].cur = 0; 
  return pos; 
} 
 
//回收节点空间 
bool SLinkList :: deleteNode(int pos) 
{ 
  if(pos == 0) 
  { 
    cout << "Free space Error!" << endl; 
    return false; 
  } 
  elems[pos].cur = space; 
  space = pos; 
  return true; 
} 
 
//插入节点,思路类似,找到被删除节点的前一个节点 
//然后更改指向 
bool SLinkList :: insertElem(int pos, int elem) 
{ 
  if(length == MAX_LIST_SIZE) 
  { 
    cout << "Space is Full" << endl; 
    return false; 
  } 
 
  if(pos < 1 || pos > length + 1) 
  { 
    cout << "Insert Over Bound" << endl; 
    return false; 
  } 
 
  int index = head; 
  for(int i = 1; i <= pos - 1; ++i) 
  { 
    index = elems[index].cur; 
  } 
 
  int node = newNode(); 
  if(node == 0) 
  { 
    cout << "Space malloc failed" << endl; 
    return false; 
  } 
  elems[node].data = elem; 
  elems[node].cur = elems[index].cur; 
  elems[index].cur = node; 
 
  length++; 
  return true; 
} 
 
//一回事,注意把删除的节点回收给space 
bool SLinkList :: deleteElem(int pos) 
{ 
  if(pos < 1 || pos > length) 
  { 
    cout << "Delete Node over Bound!" << endl; 
    return false; 
  } 
 
  int index = head; 
 
  for(int i = 1; i <= pos - 1; ++i) 
  { 
    index = elems[index].cur; 
  } 
 
  int node = elems[index].cur; 
  elems[index].cur = elems[node].cur; 
 
  deleteNode(node); 
 
  length--; 
 
  return true; 
} 
 
void SLinkList :: print() 
{ 
  int index = elems[head].cur; 
  while(index != 0) 
  { 
    cout << elems[index].data << " "; 
    index = elems[index].cur; 
  } 
  cout << endl; 
  return; 
} 
 
int SLinkList :: getLength() 
{ 
  return length; 
} 
 
bool SLinkList :: isEmpty() 
{ 
  if(length == 0) 
  { 
    return true; 
  } 
  else 
  { 
    return false; 
  } 
} 
 
int& SLinkList :: getElem(int pos) 
{ 
  int index = head; 
  for(int i = 1; i <= pos; ++i) 
  { 
    index = elems[index].cur; 
  } 
  return elems[index].data; 
} 
 
void SLinkList :: clear() 
{ 
  for(int i = 0; i < MAX_LIST_SIZE; ++i) 
  { 
    elems[i].data = i; 
    elems[i].cur = i + 1; 
  } 
  elems[MAX_LIST_SIZE - 1].cur = 0; 
  elems[0].cur = 0; 
  space = 1; 
} 
 
int main() 
{ 
  //测试数据,测试插入删除空间是否溢出 
  SLinkList myList; 
 
  for(int i = 1; i <= 105; ++i) 
  { 
    myList.insertElem(1,i); 
  } 
 
  //myList.print(); 
 
  for(int i = 1; i <= 105; ++i) 
  { 
    myList.deleteElem(1); 
  } 
 
  //myList.print(); 
 
  //普通测试 
 
  for(int i = 1; i <= 10; ++i) 
  { 
    myList.insertElem(1,i); 
  } 
 
  myList.print(); 
  cout << "Length= " << myList.getLength() <<endl; 
 
  myList.deleteElem(5); 
 
  myList.print(); 
 
  cout << "Length= " << myList.getLength() <<endl; 
 
  cout << myList.isEmpty() << endl; 
 
  int &elem = myList.getElem(3); 
 
 
  elem = 99; 
 
  myList.print(); 
 
  myList.clear(); 
 
  myList.print(); 
 
  return 0; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 实现静态单链表  # 静态单链表  # C++实现LeetCode(141.单链表中的环)  # C++实现LeetCode(142.单链表中的环之二)  # C++单链表实现大数加法  # C++实现单链表的构造  # C++使用模板实现单链表(类外实现)  # C++使用模板实现单链表  # 利用C++简单实现顺序表和单链表的示例代码  # C++中单链表的建立与基本操作  # C++编程语言实现单链表详情  # 链表  # 不可以  # 你想  # 感激不尽  # 希望能  # 几点  # 谢谢大家  # 之用  # 好啦  # 拿去  # 仅作  # 随你  # 请参考  # 中取  # 有任何  # 最初  # 测试数据  # namespace  # std  # bool 


相关文章: 长沙做网站要多少钱,长沙国安网络怎么样?  c++ stringstream用法详解_c++字符串与数字转换利器  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  宁波免费建站如何选择可靠模板与平台?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站主机与服务器功能差异如何区分?  如何选择高效便捷的WAP商城建站系统?  PHP正则匹配日期和时间(时间戳转换)的实例代码  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何用免费手机建站系统零基础打造专业网站?  如何在腾讯云免费申请建站?  智能起名网站制作软件有哪些,制作logo的软件?  ui设计制作网站有哪些,手机UI设计网址吗?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何通过cPanel快速搭建网站?  建站之星安装步骤有哪些常见问题?  微信h5制作网站有哪些,免费微信H5页面制作工具?  python的本地网站制作,如何创建本地站点?  西安专业网站制作公司有哪些,陕西省建行官方网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何选择PHP开源工具快速搭建网站?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  香港服务器租用费用高吗?如何避免常见误区?  如何通过VPS建站实现广告与增值服务盈利?  北京企业网站设计制作公司,北京铁路集团官方网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  小型网站建站如何选择虚拟主机?  红河网站制作公司,红河事业单位身份证如何上传?  建站之星如何快速更换网站模板?  如何选择域名并搭建高效网站?  ,石家庄四十八中学官网?  购物网站制作公司有哪些,哪个购物网站比较好?  如何用VPS主机快速搭建个人网站?  定制建站是什么?如何实现个性化需求?  安徽网站建设与外贸建站服务专业定制方案  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  寿县云建站:智能SEO优化与多行业模板快速上线指南  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  C++用Dijkstra(迪杰斯特拉)算法求最短路径  建站主机是什么?如何选择适合的建站主机?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  建站主机选购指南与交易推荐:核心配置解析  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何高效利用200m空间完成建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。