第一、包含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#项目中怎样创建和使用类和类库

    创建一个类库项目在“文件”菜单上,选择“新建项目”. 在“新建项目”对话框的“模板”窗格中,单击“类库”. 在“名称”框中键入 Persons,再单击“确定”. 把“添加新解决方案”勾选掉,选择“添入 ...

  2. Java基础拾遗(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  3. 在VC2015里包含了lib库,但没有设置对路径的出错

    它的提示出错如下: 这时需要在路径: 在附加的目录里添加上lib的路径. 1. RPG游戏从入门到精通 http://edu.csdn.net/course/detail/5246 2. WiX安装工 ...

  4. Android 你可能忽略的提高敲代码效率的方式

    Android 你可能忽略的提高敲代码效率的方式

  5. java入门学习(6)—封装,继承,多态,this,super,初始代码块

    1.[封装]:将对象的状态信息隐藏,不允许直接访问,而是通过该类提供的的方法阿里实现内部信息的访问和操作. 使用到的修饰符:private,不用修饰符(default),protected,publi ...

  6. IOS开发 多线程编程 - NSOperationQueue

    一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...

  7. crm--01

    需求: 将课程名称与班级综合起来 class ClassListConfig(ModelSatrk): # 自定义显示方式 def display_class(self,obj=None,is_hea ...

  8. EP-N8530S USB WIFI 驱动移植

    /*********************************************************************** * EP-N8530S USB WIFI 驱动移植 * ...

  9. js获得分辨率

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. jquery插件的2种扩展开发(jQuery.extend和jQuery.fn.extend的区别)

    1.类级别 jQuery.extend(object) 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQu ...