第一、包含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. JQ上传预览+存数据库

    因为之前老师讲的方法有不少BUG 现在经过完善已经修复 之前老是讲的方法是每一张都会被传到后台文件夹里面去 导致在预览过程中如果刷新页面 那么预览的图片不能从后台文件夹中删除  这个方法实现在本地预览 ...

  2. 使用treemap 遍历map参数

    遍历格式 XXX=123&XXX=456.....参数为map treemap是一个有序的key-value集合,它是通过红黑树实现的 TreeMap<String, String> ...

  3. Android内存优化(三)避免可控的内存泄漏

    相关文章 Android性能优化系列 Java虚拟机系列 前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已.因此,如何避免.发现和解决 ...

  4. [Python] dict字典的浅复制与深复制

    Python中针对dict字典有两种复制: (1)浅复制:利用 copy() 或者 dict() :复制后对原dict的内部子对象(方括号[]内元素)进行操作时,由浅复制得到的dict会受该操作影响 ...

  5. linux另一种安装方式

    linux中其实没有“安装”的概念:安装就是设下路径,拷贝文件,复制文件,运行下脚本这些(windows也应该如此) 法一.把bin运行路径设成环境变量 法二.ln一下,例如: 解压下载的文件: ta ...

  6. Android 实现两屏幕互相滑动

    Android 实现两屏幕互相滑动 下文来自: http://blog.csdn.net/song_shi_chao/article/details/7081664 ----------------- ...

  7. 如何向整个 Git 仓库补提交一个文件

    微软在 Reference Source 里开放了 .Net Framework 多个版本的源码.为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中. 但是!!!居然忘 ...

  8. hadoop2.x配合ZooKeeper集群环境搭建

    前期准备就不详细说了,课堂上都介绍了1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系 ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机 ...

  9. 接口测试框架——第二篇-python读取excel文件内容

    今天完善excel_module.py文件,上代码: # coding: utf-8 import xlrd class ReadExcel(): def __init__(self, file_na ...

  10. 使用 openresty 修改请求内容

    1. 目的    动态修改 html 页面内容   2. 使用方式    openresty  在 header_filter 阶段 以及body_filter 阶段进行数据修改   3. 源码  此 ...