第一、包含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. 【排序】选择排序,C++实现

    # 基本思想 每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止. 排序实例 初始关键字 [49 38 65 97 76 13 27 49] 第一趟排序后 13 [ ...

  2. mysql的master和slave同步方案

    同步原理 master将改变记录到二进制日志(binary log)中 slave将master的binary log events拷贝到它的中继日志(relay log) slave重做中继日志中的 ...

  3. CSS 文本垂直居中对齐

    文本垂直居中对齐是一个很常见的问题,这里总结一下. 一.容器高度固定,单行文本垂直居中对齐 height:20px; line-height:20px; overflow:hidden; 二.容器高度 ...

  4. Django项目部署(阿里云)(2)--扩展

    新博客地址:http://muker.net/django-server-two.html 前面的只是最简单的部署,真实情况总是更复杂一点实际流程大概是这么操作的(我这种菜鸟的想法):本地写代码-&g ...

  5. 基于模k可逆计数的数字锁相环fpga实现

    参考http://wenku.baidu.com/view/59420cb069dc5022aaea00bd.html 实现结构是参考的上边的实例,我用的全同步实现,实现过程中发现一些现象,做下记录. ...

  6. Linux环境下Maven的.m2文件夹

    aven中的.m2文件夹 安装完maven是没有.m2文件夹的.在linux中以.开头的文件夹都是隐藏的.当使用maven命令的时候,maven自动会创建.m2文件夹. 运行命令mvn help:sy ...

  7. SysTick_Config

    SystemCoreClockUpdate();SysTick_Config(SystemCoreClock/2000);   //500us

  8. filter添加水印

    1filter写法 先定义自己的responseWrapper chain.doFilter(request,responseWrapper); responseWrapper来输出 package ...

  9. C/C++中一些不太注意到的小知识点--[锦集]

    C/C++中一些不太注意到的小知识点--[锦集] C/C++小知识点--[锦集] "="和"<=" 的优先级 1.( (file_got_len = re ...

  10. bzoj1089严格n元树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 这是一种套路:记录“深度为 i ”的话,转移需要讨论许多情况:所以可以记录成“深度&l ...