双向循环链表C++实现

1.单链表:

结构图:

2.双向链表:

3.双向循环链表:

对于本程序中,则是给定一个_head  头结点,而不是指针,因为这样更加方便避免一些空判断问题

/*
版权信息:狼
文件名称:BidCirList.h
文件标识:
文件摘要:
利用C++实现简单的双向链表功能。增,删,查,改
//太烦了。。我直接给个 带头结点的 表
//swap 移花接木已经是个给力的方法。。just try
当前版本:1.1
作 者:狼
完成时间:2015-12-13 */
#ifndef _BIDCIRLIST_H
#define _BIDCIRLIST_H #include"afxstd.h" typedef int DataType;
typedef struct ListNode
{
ListNode(DataType x=)
: _data(x)
//默认初始化是自环而非 NULL
, _prev(this)
, _late(this)
{} DataType _data;
struct ListNode* _prev;
struct ListNode* _late;
}ListNode; class BidCirList
{
public:
BidCirList()
:_head()
{} BidCirList(DataType *array, size_t n = )
:_head()
{
size_t i = ;
while (n--)
{
InsertAter(array[i++]);
}
} BidCirList(BidCirList & list)
:_head()
{
ListNode* cur = list._head._prev;
while (cur)
{
InsertAter(cur->_data);
cur = cur->_prev;
if (cur == &list._head)
break;
}
} ~BidCirList()
{
Destoty();
} BidCirList operator+(BidCirList& list)
{
BidCirList tmp(*this);
ListNode* cur = list._head._prev; while (cur != &list._head)
{
tmp.InsertAter(cur->_data);
cur = cur->_prev;
}
return tmp;
} BidCirList& operator = (BidCirList& list)
{
if (this != &list)
{
BidCirList S(list); Swap(S);
}
return *this;
} //清空空间
void Destoty()
{
ListNode*cur = &_head;
while (cur->_prev != &_head)
{
DelPrev();
}
} //删除结点之前的结点。默认为头
void DelPrev(ListNode *del = NULL)
{
if (_head._prev == &_head)
return;
if (del == NULL)
{
//删除头之前
_head._prev = _head._prev->_prev;
delete _head._prev->_late; _head._prev->_late = &_head;
}
else
{
del->_prev = del->_prev->_prev;
delete del->_prev->_late; del->_prev->_late = del;
}
} //删除结点之后一个,,默认为头
void DelLate(ListNode *del = NULL)
{
if (_head._prev == &_head)
return;
if (del == NULL)
{
_head._late = _head._late->_late;
delete _head._late->_prev; _head._late->_prev = &_head;
}
else
{
del->_late = del->_late->_late;
delete del->_late->_prev; del->_late->_prev = del;
}
} //在结点之前插入,默认为头
void InsertAter(DataType x ,ListNode* ins= NULL)
{
ListNode* tmp = new ListNode(x); if (ins == NULL)
{
tmp->_prev = &_head;
tmp->_late = _head._late; tmp->_late->_prev = tmp;
tmp->_prev->_late = tmp;
}
else
{
tmp->_prev = ins;
tmp->_late = ins->_late; tmp->_late->_prev = tmp;
tmp->_prev->_late = tmp;
}
} ListNode* Find(DataType x)
{
ListNode* cur = _head._prev;
while (cur)
{
if (cur == &_head)
return NULL;
if (cur->_data == x)
{
return cur;
}
cur = cur->_prev;
}
} void Erase(ListNode * node)
{
if (node == &_head)
{
return;
}
else
{
ListNode* tmp = node;
node->_prev->_late = node->_late;
node->_late->_prev = node->_prev;
delete tmp;
tmp = NULL;
}
} //反向打印
void PrintPrev()
{
ListNode* cur = _head._prev;
while (cur)
{
if (cur == &_head)
break;
cout << cur->_data << " -> ";
cur = cur->_prev;
}
cout << " Over! " << endl;
}
//正向打印
void PrintLate()
{
ListNode* cur = _head._late; while (cur)
{
if (cur == &_head)
break;
cout << cur->_data << " -> ";
cur = cur->_late;
}
cout << " Over! " << endl;
} void Swap(BidCirList &list)
{
::swap(_head._prev->_late, list._head._prev->_late);
::swap(_head._prev, list._head._prev); ::swap(_head._late->_prev, list._head._late->_prev);
::swap(_head._late, list._head._late); } private:
ListNode _head;
}; #endif

C++双向循环链表实现的更多相关文章

  1. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  2. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  3. 双向循环链表的Java版本实现

    1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...

  4. c语言编程之双向循环链表

    双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...

  5. Linux内核中的通用双向循环链表

    开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核.看到双向链表时,觉得挺有意思的,此文记下. 作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的 ...

  6. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  7. 基于visual Studio2013解决算法导论之025双向循环链表

     题目 双向循环链表 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...

  8. 双向循环链表(C语言描述)(四)

    下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...

  9. 双向循环链表(C语言描述)(一)

    双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...

  10. python实现 双向循环链表

    最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...

随机推荐

  1. MBR和GPT(分区)

    MBR:Master Boot Record GPT:Guid Partition Table (全局唯一标识符分区表) GPT is the new standard and is graduall ...

  2. 使用stringstream格式化字符串

    stringstream所在头文件为<sstream> 一般有如下常用功能: 1.安全格式化字符串 stringstream常用来安全的格式化若干个字符串,数值到一个缓冲区, 而不用担心溢 ...

  3. C++基础之头文件和源文件的关系

    今天找了个解析xml的开源C++项目tinyxml,按照网上的说法去编译,但是一直编译不通过,"无法打开头文件tinyxml.h",但是明明我在工程底下有了这个文件,对于我这种初学 ...

  4. 来自IOS开发工程师的零基础自学HTML5经验分享

    移动互联网的火爆,而Html具有跨平台.开发快的优势,越来越受到开发者的青睐.感谢IOS开发工程师“小木___Boy”’带来的HTML5学习经验分享. 一.学习途径 1.很多视频网站 比如慕课.和极客 ...

  5. windows 下安装 rabbitmq报init terminating in do_boot错误

    好长时间没有写东西了,记一个安装笔记吧. 目前市面上比较常用的几个消息中间件,rabbitmq算是风评比较好的,所以就拿来安装一下玩玩喽(很有可能也仅限于是安装一下....)安装过程不表,无非是下载E ...

  6. Mac Outlook邮箱MicrosoftExchange邮箱快满了,请减小邮箱大小。

    这两天我的Mac电脑中的Exchange总是收到公司的邮箱发来的[存储空间不足的告警邮件] MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e@your ...

  7. 【android】开源一个企业通讯录app

    软件背景:该app不是替代手机通讯录,而是对其一种补充.项目只是通讯录客户端,数据源是访问本地.还是访问远程服务器,由你来实现 开源地址:http://git.oschina.net/yso/Smar ...

  8. 《Unity3D》通过对象池模式,管理场景中的元素

    池管理类有啥用? 在游戏场景中,我们有时候会需要复用一些游戏物体,比如常见的子弹.子弹碰撞类,某些情况下,怪物也可以使用池管理,UI部分比如:血条.文字等等 这些元素共同的特性是:存在固定生命周期,使 ...

  9. Salesforce中通过SOAP API和Metadata API开发java的web server服务

    1.下载Salesforce平台中WSDL文件 在Salesforce中创建了自己需要用到的对象后,我们想要在别的应用中读写纪录到对象中,首先需要的是自己Salesforce平台的权限通过.登陆自己的 ...

  10. Java linkedList详细介绍及使用示例

    ①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...