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

 更新时间:2017年06月23日 16:34:23   投稿:lqh  
这篇文章主要介绍了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++交换指针实例

    这篇文章主要介绍了C++交换指针实例,针对C与C++交换指针的方法进行了较为详细的对比分析,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • OpenCV计算图像的水平和垂直积分投影

    OpenCV计算图像的水平和垂直积分投影

    这篇文章主要为大家详细介绍了OpenCV计算图像的水平和垂直积分投影,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 浅谈C++基类的析构函数为虚函数

    浅谈C++基类的析构函数为虚函数

    本文重点:应该为多态基类声明虚析构器。一旦一个类包含虚函数,它就应该包含一个虚析构器。如果一个类不用作基类或者不需具有多态性,便不应该为它声明虚析构器。
    2015-10-10
  • C语言实现学生成绩管理系统实战教学

    C语言实现学生成绩管理系统实战教学

    在本篇文章里小编给大家分享了关于C语言实现学生成绩管理系统实战教学内容,有兴趣的朋友们可以跟着学习参考下。
    2019-01-01
  • C++里最容易忽视却不能忽视的问题(必看)

    C++里最容易忽视却不能忽视的问题(必看)

    在C++里最容易忽视却不能忽视的问题都有哪些呢?下面小编就为大家介绍一下。一起跟随小编过来看看吧
    2016-05-05
  • C++算法与泛型算法(algorithm、numeric)

    C++算法与泛型算法(algorithm、numeric)

    这篇文章主要介绍了C++算法与泛型算法(algorithm、numeric),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • VC中BASE64编码和解码使用详解

    VC中BASE64编码和解码使用详解

    Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中, 这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。
    2015-11-11
  • C实现与 uint64_t 相同功能的类

    C实现与 uint64_t 相同功能的类

    本文给大家分享的是笔者实现的仿uint64_t的类,可以用在不支持uint64_t的平台上,虽然现在功能还不完善,但是还是分享给大家,也算是给大家一个思路吧。
    2015-12-12
  • 用c++实现x的y次幂的代码

    用c++实现x的y次幂的代码

    以下实例是对使用c++实现x的y次幂的解决方法进行了介绍。需要的朋友参考下
    2013-05-05

最新评论