c++ 双向链表操作总结
第一、包含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++ 双向链表操作总结的更多相关文章
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- C语言双向链表
原文:C语言双向链表 今天写了点双向链表的各种操作,写插入的时候费了点时间,不过,现在看来还是值得耗费那点时间去写的,这种小东西应该能信手拈来才行啊. /*双向链表*/ #include <st ...
- 双向链表的实现——java
实现类: /** * Java 实现的双向链表. * 注:java自带的集合包中有实现双向链表,路径是:java.util.LinkedList * * @author skywang * @date ...
- 2019 SCUT SE 新生训练第四波 L - Boxes in a Line——双向链表
先上一波题目 https://vjudge.net/contest/338760#problem/L 这道题我们维护一个双向链表 操作1 2 3 都是双向链表的基本操作 4操作考虑到手动将链表反转时间 ...
- Linux内核【链表】整理笔记(1)
我们都知道Linux内核里的双向链表和学校里教给我们的那种数据结构还是些不一样.Linux采用了一种更通用的设计,将链表以及其相关操作函数从数据本身进行剥离,这样我们在使用链表的时候就不用自己去实现诸 ...
- php内存管理
1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的 ...
- 130行C语言实现个用户态线程库——ezthread
准确的说是除掉头文件,测试代码和非关键的纯算法代码(只有双向环形链表的ADT),核心代码只有130行左右,已经是蝇量级的用户态线程库了.把这个库取名为ezthread,意思是,这太easy了,人人都可 ...
- JAVA提高十一:LinkedList深入分析
上一节,我们学习了ArrayList 类,本节我们来学习一下LinkedList,LinkedList相对ArrayList而言其使用频率并不是很高,因为其访问元素的性能相对于ArrayList而言比 ...
- Java基础系列--HashMap(JDK1.8)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...
随机推荐
- Visual studio 生成后事件说明
在“配置属性->生成事件->生成后事件”属性页中的“命令行”编辑框中输入如下命令: copy "$(ProjectDir)$(IntDir)\$(ProjectName).t ...
- Java堆空间溢出解决方法 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
一般通过java -jar filename.jar运行jar包,但是当运行的java程序需要较大的内存时,可能会造成堆空间溢出. 例如,加载了几个G大小的json文件,运行报错: Exception ...
- IOS开发 arc与非Arc代码的区别
是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(Man ...
- Android中的sp和wp指针
经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下 ...
- freeradius连接mysql数据库慢
[环境说明] 服务器版本 redHat5.3 mysql版本 MySQL5.6.22 freeradius版本 2.1.12 [问题描述] 配置好freeradiu ...
- HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)
When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...
- 神器如 dnSpy,无需源码也能修改 .NET 程序
dnSpy 是 0xd4d 开发的 .NET 程序调试神器. 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程 ...
- 轻量级KVO[译]
在这篇文章中,我会实现一个自己用的简单KVO类,我认为KVO非常棒,然而对于我大部分的使用场景来说,有这两个问题: 1. 我不喜欢在observeValueForKeyPath:ofObjec ...
- 重温CLR(十) 字符、字符串和文本处理
本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...
- 《selenium2 python 自动化测试实战》(8)——定位iframe
我们来看一段最早的代码: # coding: utf-8 from selenium import webdriverfrom time import sleep driver = webdriver ...