利用C++简单实现顺序表和单链表的示例代码

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

本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:

一、顺序表示例代码:

#include <assert.h>
#include <iostream>
using namespace std;

typedef int Datatype;

class SeqList
{
public:
 SeqList()
  :_array(NULL)
  ,_size(0)
  ,_capacity(0)
 {
 }

 SeqList(const SeqList& s)
 {
  _array = (Datatype*)malloc(s._size*(sizeof(Datatype)));
  memcpy(_array, s._array, s._size*(sizeof(Datatype)));
  _size = _capacity = s._size;
 }

 SeqList& operator=(SeqList& s)
 {
  free(_array);
  Swap(s);
  return *this;
 }

 void Swap(SeqList& s)
 {
  _array = s._array;
  _size = s._size;
  _capacity = s._capacity;
 }

 ~SeqList()
 {
  if (_array)
  {
   free(_array);
   _array = NULL;
   _size = _capacity = 0;
  }
 }

 void Print()
 {
  for (size_t i = 0; i < _size; i++)
  {
   cout << _array[i] << " ";
  }
  cout << endl;
 }

 void CheckCapcacity()
 {
  if (_size == _capacity)
  {
   _capacity = 2 * _capacity + 3;
   _array = (Datatype*)realloc(_array, _capacity*sizeof(Datatype));
   assert(_array);
  }
 }

 //后插
 void PushBack(Datatype x)
 {
  Insert(_size, x);
 }

 //前插
 void PushFront(Datatype x)
 {
  Insert(0, x);
 }

 //删除最后一个
 void PopBack()
 {
  Erase(_size);
 }

 //删除第一个
 void PopFront()
 {
  Erase(0);
 }

 //[]运算符重载
 Datatype& operator[](size_t pos)
 {
  assert(pos < _size);
  return _array[pos];
 }

 //pos位置前插入x
 void Insert(size_t pos, Datatype x)
 {
  assert(pos <= _size);
  CheckCapcacity();
  int end = (int)_size - 1;
  if (pos == 0)
  {
   while (end >= 0)
   {
    _array[end + 1] = _array[end];
    end--;
   }
   _array[0] = x;
  }
  else
  {
   while (end >= (int)pos)
   {
    _array[end + 1] = _array[end];
    end--;
   }
   _array[pos] = x;
  }
  _size++;
 }

 //删除pos位置的元素
 void Erase(size_t pos)
 {
  assert(pos < _size);
  //popfront的实现
  if (_size > 0)
  {
   if (pos == 0)
   {
    int end = 0;
    while (end < (int)_size - 1)
    {
     _array[end] = _array[end + 1];
     end++;
    }
    _size--;
   }
   //popback的实现
   else if (pos == _size)
   {
    _size--;
   }
   //erase
   else
   {
    int end = pos;
    while (end < (int)_size - 1)
    {
     _array[end] = _array[end + 1];
     end++;
    }
    _size--;
   }
  }
  return; 
 }

private:
 Datatype* _array;
 size_t _size;
 size_t _capacity;
};

二、单链表(不含头结点)示例代码

#include <iostream>
#include <assert.h>
using namespace std;

typedef int DataType;

struct SListNode
{
 SListNode* _next;
 DataType _data;

 SListNode(DataType x)
  :_data(x)
  , _next(NULL)
 {}
};

typedef SListNode Node;

class SList
{
public:
 SList()
  :_head(NULL)
  , _tail(NULL)
 {}

 SList(const SList& s)
  :_head(NULL)
  ,_tail(NULL)
 {
  Copy(s);
 }

 SList& operator=(const SList& s)
 {
  Destroy();
  Copy(s);
  return *this;
 }

 ~SList()
 {
  Destroy();
 }


 void Copy(const SList& s)
 {
  Node* cur = s._head;
  while (cur)
  {
   PushBack(cur->_data);
   cur = cur->_next;
  }
 }

 void Destroy()
 {
  Node* cur = _head;
  while (_head != NULL)
  {
   cur = _head;
   _head = cur->_next;
   delete cur;
  }
  _head = _tail = NULL;
 }

 void PushBack(DataType x)
 {
  if ((_head == NULL)&&(_tail == NULL))
  {
   _head = _tail = new Node(x);
  }
  else
  {
   _tail->_next = new Node(x);
   _tail = _tail->_next;
  }
 }

 void PopBack()
 {
  if (_head == NULL)
  {
   return;
  }
  else if (_head ->_next == NULL)
  {
   delete _head;
   _head = _tail = NULL;
  }
  else
  {
   Node* tmp = _head;
   while (tmp->_next->_next != NULL)
   {
    tmp = tmp->_next;
   }
   _tail = tmp;
   tmp->_next = NULL;
  }  
 }

 void PushFront(DataType x)
 {
  if ((_head == NULL) && (_tail == NULL))
  {
   _head = _tail = new Node(x);
  }
  else
  {
   Node* tmp = new Node(x);
   tmp->_next = _head;
   _head = tmp;
  }
 }

 void PopFront()
 {
  if (_head == NULL)
  {
   return;
  }
  Node* cur = _head;
  _head = _head->_next;
  delete cur;
 }

 Node* Find(DataType x)
 {
  Node* tmp = _head;
  while (tmp)
  {
   if (tmp->_data == x)
    return tmp;
   tmp = tmp->_next;
  }
  return NULL;
 }

 // 插入一个节点在pos的前面
 void Insert(Node* pos, DataType x)
 {
  assert(pos);
  if (pos == 0)
  {
   PushFront(x);
  }
  else
  {
   Node* cur = _head;
   while (cur->_next != pos)
   {
    cur = cur->_next;
   }
   Node* tmp = new Node(x);
   tmp->_next = pos;
   cur->_next = tmp;
  }
 }

 void Erase(Node* pos)
 {
  assert(pos);
  if (pos == 0)
  {
   PopFront();
  }
  else if (pos->_next == NULL)
  {
   PopBack();
  }
  else
  {
   Node* cur = _head;
   while (cur->_next != pos)
   {
    cur = cur->_next;
   }
   Node* tmp = cur->_next;
   cur->_next = tmp->_next;
   delete tmp;
  }
 }

 void Print()
 {
  Node* tmp = _head;
  while (tmp != NULL)
  {
   cout <<tmp->_data << "->";
   tmp= tmp->_next;
  }
  cout <<"NULL"<<endl;
 }

private:
 Node* _head;
 Node* _tail;
};

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持


# c  # 单链表  # 实现顺序表  # c语言单链表  # C++顺序表的基本操作实现  # C++实现数据结构的顺序表详解  # C++顺序表实现图书管理系统  # C++实现基于静态数组的顺序表  # C++实现动态顺序表(vector)  # C++实现动态顺序表  # C++实现顺序表的常用操作(插入删出查找输出)  # C++实现顺序表的方法  # C++超详细分析顺序表  # 链表  # 相关内容  # 第一个  # 给大家  # 不含  # 这篇文章  # 谢谢大家  # 多说  # 运算符  # 有疑问  # operator  # public  # SeqList  # Datatype  # const  # typedef  # int  # amp  # memcpy  # sizeof 


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


相关推荐: Linux网络带宽限制_tc配置实践解析【教程】  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Android使用GridView实现日历的简单功能  如何挑选最适合建站的高性能VPS主机?  高性价比服务器租赁——企业级配置与24小时运维服务  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel如何使用.env文件管理环境变量?(最佳实践)  中国移动官方网站首页入口 中国移动官网网页登录  linux top下的 minerd 木马清除方法  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  实例解析angularjs的filter过滤器  如何在Tomcat中配置并部署网站项目?  制作公司内部网站有哪些,内网如何建网站?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  JavaScript如何实现路由_前端路由原理是什么  黑客如何通过漏洞一步步攻陷网站服务器?  潮流网站制作头像软件下载,适合母子的网名有哪些?  公司门户网站制作流程,华为官网怎么做?  Python文件异常处理策略_健壮性说明【指导】  js实现获取鼠标当前的位置  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel怎么调用外部API_Laravel Http Client客户端使用  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何处理异常和错误?(Handler示例)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  微信小程序 input输入框控件详解及实例(多种示例)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何在宝塔面板创建新站点?  如何在云指建站中生成FTP站点?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  如何快速上传自定义模板至建站之星?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  无锡营销型网站制作公司,无锡网选车牌流程?  用yum安装MySQLdb模块的步骤方法  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  制作旅游网站html,怎样注册旅游网站?  JavaScript如何操作视频_媒体API怎么控制播放  Laravel如何编写单元测试和功能测试?(PHPUnit示例)