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

发布时间 - 2026-01-11 02:01:56    点击率:

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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  PHP 500报错的快速解决方法  在线教育网站制作平台,山西立德教育官网?  微信小程序 闭包写法详细介绍  如何用PHP快速搭建CMS系统?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  中国移动官方网站首页入口 中国移动官网网页登录  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何快速辨别茅台真假?关键步骤解析  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel怎么为数据库表字段添加索引以优化查询  高防服务器租用指南:配置选择与快速部署攻略  什么是javascript作用域_全局和局部作用域有什么区别?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在Windows 2008云服务器安全搭建网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何在IIS服务器上快速部署高效网站?  javascript基本数据类型及类型检测常用方法小结  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何在腾讯云服务器上快速搭建个人网站?  如何在云服务器上快速搭建个人网站?  如何在搬瓦工VPS快速搭建网站?  Laravel怎么在Controller之外的地方验证数据  如何在阿里云ECS服务器部署织梦CMS网站?  如何快速搭建支持数据库操作的智能建站平台?  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  黑客如何通过漏洞一步步攻陷网站服务器?  如何在企业微信快速生成手机电脑官网?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何实现多对多模型关联?(Eloquent教程)  如何用腾讯建站主机快速创建免费网站?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】