第一、包含DoubleLinkNode 模板类和DoubleLinkList 模板类

#pragma once
#include<iostream>
using namespace std; template <typename T> class DoubleLinkList;//这里必须声明 template<typename T> class DoubleLinkNode {
public:
T getData() {
return m_data;
}
private:
DoubleLinkNode() :m_pprior(NULL), m_pnext(NULL) {}
DoubleLinkNode(const T item, DoubleLinkNode<T>* prior, DoubleLinkNode<T>* pnext) :m_data(item), m_pprior(prior), m_pnext(pnext)
{} ~DoubleLinkNode() {
m_pprior = NULL;
m_pnext = NULL;
}
friend class DoubleLinkList<T>;
DoubleLinkNode* m_pprior;
DoubleLinkNode* m_pnext;
T m_data;
}; template <typename T> class DoubleLinkList {
public:
DoubleLinkList() {
head = new DoubleLinkNode<T>();
}
~DoubleLinkList() {
delete head;
}
void cleanDoubleLink();
bool insertNode(T data);
bool insertNode(T data,int n);
void printAll();
bool deleteNode(T data);
DoubleLinkNode<T>* findNode(int n);
DoubleLinkNode<T>* findData(T data);
bool deleteNodeByIndex(int i);
T getData(int i); private:
friend class DoubleLinkNode<T>;
DoubleLinkNode<T> *head;
}; template <typename T> void DoubleLinkList<T>::cleanDoubleLink() {
DoubleLinkNode<T> *pmove = head->m_pnext,*pdel;
while (pmove != NULL)
{
pdel = pmove;
pmove = pmove->m_pnext;
delete pdel;
}
head->m_pnext = NULL;
} template<typename T> bool DoubleLinkList<T>::insertNode(T data) {
DoubleLinkNode<T> *pmove = head;
while (pmove->m_pnext!=NULL)
{
pmove = pmove->m_pnext;
} DoubleLinkNode<T> *newNode = new DoubleLinkNode<T>(data,pmove,NULL);
pmove->m_pnext = newNode;
return true;
} template<typename T> bool DoubleLinkList<T>::insertNode(T item,int n) {
DoubleLinkNode<T> *pmove = head;
for (int i = 1; i < n; i++)
{
pmove = pmove->m_pnext;
if (pmove==NULL && i<n-1)
{
cout << "超出链表长度" << endl;
return false;
}
}
DoubleLinkNode<T> *newNode = new DoubleLinkNode<T>();
newNode->m_data = item; newNode->m_pnext = pmove->m_pnext;
newNode->m_pprior = pmove->m_pprior;
if (pmove->m_pnext!=NULL)
{
pmove->m_pnext->m_pprior = newNode;
}
pmove->m_pnext = newNode;
return true;
} template<typename T> void DoubleLinkList<T>::printAll() {
DoubleLinkNode<T>* pmove = head->m_pnext;
while (pmove!=NULL)
{
cout << pmove->m_data << " ";
pmove = pmove->m_pnext;
}
cout << endl;
} template<typename T> bool DoubleLinkList<T>::deleteNode(T item) {
DoubleLinkNode<T>* pmove = head;
while (pmove->m_pnext!=NULL)
{
if (pmove->m_data==item)
{
break;
}
pmove = pmove->m_pnext;
}
if (pmove==NULL)
{
cout << "没有找到该item" << endl;
return false;
} pmove->m_pprior->m_pnext = pmove->m_pnext;
if (pmove->m_pnext!=NULL)
{
pmove->m_pnext->m_pprior = pmove->m_pprior;
}
delete pmove;
return true;
} template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findNode(int n) {
if (n<1)
{
cout << "指定位置无效" << endl;
exit(1);
}
DoubleLinkNode<T>* pmove = head; for (int i = 1; i <= n; i++)
{
pmove = pmove->m_pnext;
if (pmove==NULL)
{
cout << "指定节点不存在!" << endl;
exit(1);
}
}
return pmove;
} template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findData(T item) {
DoubleLinkNode<T>* pmove = head;
while (pmove->m_pnext != NULL)
{
pmove = pmove->m_pnext; if (pmove == NULL)
{
cout << "没有找到所查节点" << endl;
exit(1);
}
if (pmove->m_data == item)
{
break;
}
return pmove;
}
} template<typename T> bool DoubleLinkList<T>::deleteNodeByIndex(int n) {
DoubleLinkNode<T>*pmove = head->m_pnext;
for (int i = 1; i < n; i++)
{
if (pmove == NULL && i < (n - 1))
{
cout << "没有找到该位置,删除失败" << endl;
return false;
}
pmove = pmove->m_pnext;
}
if (pmove->m_pnext!=NULL)
{
pmove->m_pprior->m_pnext = pmove->m_pnext;
pmove->m_pnext->m_pprior = pmove->m_pprior;
}
else
{
pmove->m_pprior->m_pnext = NULL;
}
delete pmove;
return true;
} template<typename T> T DoubleLinkList<T>::getData(int n) {
DoubleLinkNode<T>* pmove = head->m_pnext;
for (int i = 1; i < n; i++)
{
if (pmove==NULL && i<(n-1))
{
cout << "没有找到" << endl;
exit(1);
}
pmove = pmove->m_pnext;
} if (pmove==NULL)
{
cout << "节点不存在" << endl;
}
return pmove->getData();
}

  

c++ 双向链表操作总结的更多相关文章

  1. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  2. C语言双向链表

    原文:C语言双向链表 今天写了点双向链表的各种操作,写插入的时候费了点时间,不过,现在看来还是值得耗费那点时间去写的,这种小东西应该能信手拈来才行啊. /*双向链表*/ #include <st ...

  3. 双向链表的实现——java

    实现类: /** * Java 实现的双向链表. * 注:java自带的集合包中有实现双向链表,路径是:java.util.LinkedList * * @author skywang * @date ...

  4. 2019 SCUT SE 新生训练第四波 L - Boxes in a Line——双向链表

    先上一波题目 https://vjudge.net/contest/338760#problem/L 这道题我们维护一个双向链表 操作1 2 3 都是双向链表的基本操作 4操作考虑到手动将链表反转时间 ...

  5. Linux内核【链表】整理笔记(1)

    我们都知道Linux内核里的双向链表和学校里教给我们的那种数据结构还是些不一样.Linux采用了一种更通用的设计,将链表以及其相关操作函数从数据本身进行剥离,这样我们在使用链表的时候就不用自己去实现诸 ...

  6. php内存管理

    1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的 ...

  7. 130行C语言实现个用户态线程库——ezthread

    准确的说是除掉头文件,测试代码和非关键的纯算法代码(只有双向环形链表的ADT),核心代码只有130行左右,已经是蝇量级的用户态线程库了.把这个库取名为ezthread,意思是,这太easy了,人人都可 ...

  8. JAVA提高十一:LinkedList深入分析

    上一节,我们学习了ArrayList 类,本节我们来学习一下LinkedList,LinkedList相对ArrayList而言其使用频率并不是很高,因为其访问元素的性能相对于ArrayList而言比 ...

  9. Java基础系列--HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...

随机推荐

  1. Express 开发与部署最佳实践 -- 待续

    链接 nginx 代理缓存  压缩 等 全部采用异步 使用try catch  处理同步异常  promise 处理异步 异常,  而不是使用 domains  或者 uncaughtExceptio ...

  2. 源码编译tmux

    (1)clone 源代码仓库: $ git clone https://github.com/tmux/tmux.git (2) 编译之前先安装libevent,去官网下载tar包: http://l ...

  3. Shell 命令行求两个文件每行对比的相同内容

    Shell 命令行求两个文件每行对比的相同内容 遇到的一个实际问题是,2017年08月01日起,所有未经实名的域名,全部停止解析.而我手上有不少域名,其中很多都是没有实名的.但我不知道哪些实名了,哪些 ...

  4. HBase架构解析

    Hbase组件  客户端Client 整个HBase集群的入口 使用HBase RPC机制与HMaster和HRegionserver通信 与HMaster通信进行管理类的操作 与HRegionse ...

  5. 大牛deep learning入门教程

    雷锋网(搜索"雷锋网"公众号关注)按:本文由Zouxy责编,全面介绍了深度学习的发展历史及其在各个领域的应用,并解释了深度学习的基本思想,深度与浅度学习的区别和深度学习与神经网络之 ...

  6. 汇编语言---键盘KeyCode值列表

    键盘KeyCode值列表 收藏 keycode   0 =keycode   1 =keycode   2 =keycode   3 =keycode   4 =keycode   5 =keycod ...

  7. python 之头像上传,预览

    上传头像 我们需要实现的效果是:当我们点击默认头像,用户可以进行选择要上传的头像文件,其原理就是头像的img标签与文件input(file类型)框重合或者关联,可以通过如下两种方式进行实现: 方法一l ...

  8. 【剑指offer】二叉树中和为某一值的路径,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 1.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径由结点和有向边组成,从根结点到叶节点. // 二叉树结点的定义 st ...

  9. HDU - 5942 :Just a Math Problem (莫比乌斯)

    题意:略. 思路:问题转化为1到N,他们的满足mu[d]!=0的因子d个数.  即1到N的因子的莫比乌斯系数平方和. (经验:累加符号是累加的个数,我们把常数提到前面,然后用杜教筛累加个数即可. ht ...

  10. threejs Object的点击(鼠标)事件(获取点击事件的object)

    objects=[]; raycaster = new THREE.Raycaster(); mouse = new THREE.Vector2(); //监听全局点击事件,通过ray检测选中哪一个o ...