全网整合营销服务商

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

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

利用C++实现双链表基本接口示例代码

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。

本文主要给大家介绍了关于C++实现双链表基本接口的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍吧。

首先先简单通过图示区分单链表和双链表的结构差异:

单链表的基本接口实现可参考:单链表简单实现

接下来就是双链表的基本接口实现:

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

typedef int DataType;

struct ListNode
{
 ListNode* _next;
 ListNode* _prev;
 DataType _data;

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

typedef ListNode Node;

class List
{

public:
 List()
  :_head(NULL)
  ,_tail(NULL)
 {}

 List(const List& l)
  :_head(NULL)
  ,_tail(NULL)
 {
  Copy(l);
 }

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

 List& operator=(const List& l)
 {
  Destory();
  Copy(l);
  return *this;
 }

 ~List()
 {
  Destory();
 }

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

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

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

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

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

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

 // 在pos的前面插入x
 void Insert(Node* pos, DataType x)
 {
  assert(pos);
  if ((pos == 0) || (pos->_prev == NULL))
  {
   PushFront(x);
  }
  else
  {
   Node* font = pos->_prev;
   Node* tmp = new Node(x);
   tmp->_prev = font;
   tmp->_next = pos;
   font->_next = tmp;
   pos->_prev = tmp;
  }
 }

 //删除pos位置的元素
 void Erase(Node* pos)
 {
  assert(pos);
  if ((pos == 0) || (pos->_prev == NULL))
  {
   PopFront();
  }
  else if (pos->_next == NULL)
  {
   PopBack();
  }
  else
  {
   Node* font = pos->_prev;
   Node* last = pos->_next;
   font->_next = last;
   last->_prev = font;
   delete pos;
  }
 }

 //逆序整个双链表
 void Reverse()
 {
  Node* cur = _head;
  while (cur)
  {
   swap(cur->_next,cur->_prev);
   cur = cur->_prev;
  }
  swap(_head, _tail);
 }


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

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

注:在一些操作实现时,一定要要考虑清楚各种情况,再进行情况的分类尽量提高代码的复用程度。

总结

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


# c  # 链表接口  # 双向链表  # c语言双向链表  # C++ 双链表的基本操作(详解)  # C数据结构之双链表详细示例分析  # C/C++ 双链表之逆序的实例详解  # C语言双向链表的表示与实现实例详解  # C语言实现双向链表  # C语言之双向链表详解及实例代码  # C语言数据结构 双向链表的建立与基本操作  # C语言中双向链表和双向循环链表详解  # C语言 数据结构双向链表简单实例  # C语言实现数据结构和双向链表操作  # C语言实现的双链表功能完整示例  # 链表  # 是一种  # 相关内容  # 给大家  # 这篇文章  # 谢谢大家  # 多说  # 复用  # 线性表  # 有疑问  # namespace  # std  # assert  # iostream  # gt  # lt  # typedef  # ListNode  # struct  # DataType 


相关文章: 西安专业网站制作公司有哪些,陕西省建行官方网站?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何通过服务器快速搭建网站?完整步骤解析  Swift中循环语句中的转移语句 break 和 continue  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何高效搭建专业期货交易平台网站?  建站之星导航如何优化提升用户体验?  网站制作的步骤包括,正确网址格式怎么写?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何在万网自助建站平台快速创建网站?  广州美橙建站如何快速搭建多端合一网站?  小建面朝正北,A点实际方位是否存在偏差?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  股票网站制作软件,网上股票怎么开户?  如何快速登录WAP自助建站平台?  外贸公司网站制作哪家好,maersk船公司官网?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在自有机房高效搭建专业网站?  网站制作壁纸教程视频,电脑壁纸网站?  C#怎么创建控制台应用 C# Console App项目创建方法  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站主机选哪家性价比最高?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  香港服务器如何优化才能显著提升网站加载速度?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站ABC备案流程中有哪些关键注意事项?  高性价比服务器租赁——企业级配置与24小时运维服务  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星如何一键生成手机站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何彻底删除建站之星生成的Banner?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  建站之星2.7模板:企业网站建设与h5定制设计专题  独立制作一个网站多少钱,建立网站需要花多少钱?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  建站主机核心功能解析:服务器选择与网站搭建流程指南  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  宝塔建站后网页无法访问如何解决?  非常酷的网站设计制作软件,酷培ai教育官方网站?  javascript中的try catch异常捕获机制用法分析  如何在Ubuntu系统下快速搭建WordPress个人网站?  香港服务器租用费用高吗?如何避免常见误区?  建站10G流量真的够用吗?如何应对访问高峰?  如何通过主机屋免费建站教程十分钟搭建网站?  如何在建站主机中优化服务器配置?  如何自定义建站之星模板颜色并下载新样式?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法 

您的项目需求

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