- 浏览: 771483 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
双向链表(double linked list)目的是为了解决在链表中访问直接前驱和直接后继的问题。一个直接前驱一个直接后继,向前后搜索的开销都是O(1)
#ifndef DOUBLELINKEDLIST_H #define DOUBLELINKEDLIST_H #include"linearList.h" #include<stdlib.h> template<class T> class DblNode{ public: T data; DblNode<T> *lLink,*rLink; DblNode(DblNode<T> *left = NULL,DblNode<T> *right=NULL) :lLink(left),rLink(right){} DblNode(T value,DblNode<T> *left = NULL,DblNode<T>* right=NULL) :data(value),lLink(left),rLink(right){} }; template<typename T> class DblList{ public: DblList(T uniqueVal); ~DblList(); int Size()const; int Length()const; int Search(T& x)const; bool getData(int i,T& x)const; void setData(int i,T& x); bool IsEmpty(){return first->rLink==first;} bool IsFull()const; void Sort(); void input(); void output(); DblNode<T> *getHead()const{return first;} void setHead(DblNode<T> *ptr); DblNode<T> *Search(const T& x); DblNode<T> *Locate(int i,int d=1); bool Insert(int i, T &x,int d=1); bool Remove(int i, T &x,int d=1); void push_back(T& x); private: DblNode<T> *first; }; #endif // DOUBLELINKEDLIST_H
#include"DoubleLinkedList.h" #include<iostream> using namespace std; template<typename T> DblList<T>::DblList(T uniqueVal){ first = new DblNode<T>(uniqueVal); if(first==NULL){ cerr << "Memory allocation error" << endl; exit(1); } first->rLink=first->lLink=first; } template<typename T> DblList<T>::~DblList<T>() { } template<class T> int DblList<T>::Size() const { return Length(); } template<class T> int DblList<T>::Length() const { DblNode<T> *current = first->rLink; int count = 0; while(current != first){ current = current->rLink; count++; return count; } } template<class T> DblNode<T> *DblList<T>::Search(const T &x) { DblNode<T> *current = first->rLink; while(current!=first&¤t->data!=x) current = current->rLink; if(current!=first) return current; else return NULL; } /* d是方向,0反向,1正向 */ template<class T> DblNode<T> *DblList<T>::Locate(int i, int d) { if(first->rLink == first || i==0) return first; DblNode<T> *current; if(d==0) current = first->lLink; else current = first->rLink; for(int j=1;j<i;j++) if(current == first) break; else if(d==0) current = current->lLink; else current = current->rLink; if(current!=first) return current; else return NULL; } template<class T> bool DblList<T>::Insert(int i, T &x, int d) { DblNode<T> *node = Locate(i,d); if(node==NULL) return false; DblNode<T> *newNode = new DblNode<T>(x); if(NULL==newNode){ cerr << "Memory allocation error" << endl; exit(0); } if(d==1){ newNode->rLink = node->rLink; node->rLink = newNode; newNode->rLink->lLink = newNode; newNode->lLink = node; }else{ newNode->lLink = node->lLink; node->lLink = newNode; newNode->lLink->rLink = node; newNode->rLink = node; } return true; } template<typename T> bool DblList<T>::Remove(int i, T &x, int d) { DblNode<T> *node = Locate(i,d); if(node==NULL) return false; node->lLink->rLink = node->rLink; node->rLink->lLink = node->lLink; delete node; return true; } template<typename T> void DblList<T>::push_back(T& x) { DblNode<T> *node = Locate(0); while(node->rLink!=first){ node = node->rLink; } DblNode<T> *newNode = new DblNode<T>(x); node->rLink = newNode; newNode->lLink = node; newNode->rLink = first; } template<typename T> void DblList<T>::output() { DblNode<int>* node = Locate(0); while(node->rLink!=first){ cout << node->data << " "; node = node->rLink; } cout << node->data << " "; } int main() { DblList<int> lst(1); const int size = 8; for(int i=2;i<=size;++i){ lst.push_back(i); } lst.output(); cout << endl; int m = 3,num=0; DblNode<int>* node = lst.getHead(); DblNode<int>* pre = NULL; for(int i=0;i<size-1;++i){ for(int j=1;j<m;++j){ pre = node; node = node->rLink; } pre->rLink = node->rLink; delete node; node = pre->rLink; } cout << node->data; } 1 2 3 4 5 6 7 8 7
发表评论
-
时间复杂度推导
2012-06-05 22:57 9881.用常数1取代运行时间中的所有加法常数 2.在修改后的运行次 ... -
数据结构概论2
2012-06-04 22:19 811数据元素:组成数据的,有一定意义的基本单位,在计算机中通常作为 ... -
排序概念
2011-06-24 14:51 791数据表:待排序数据元素的有很集合 排序码:通常数据元素有多个 ... -
图的基本概念
2011-06-20 16:18 751完全图:n个顶点,n*(n-1)/2个边的无向图,就是无向完全 ... -
红黑树
2011-06-16 14:29 518红黑树: 1.根结点和所有的叶结点都是黑色 2.从根结点到叶结 ... -
链表反转
2011-06-12 18:03 1105template<typename T> v ... -
散列表(哈希表)
2011-06-09 09:55 1082散列表(hash table):是表示集合和字典的另一种有效方 ... -
跳 表
2011-06-08 11:12 809#ifndef SKIPLIST_H #define S ... -
字 典
2011-06-08 10:06 930字典:以集合为基础,并支持支持Member,Insert和Re ... -
LinkedSet
2011-06-07 13:08 926改了很久的bug #ifndef LINKEDSET_H ... -
bitset
2011-06-06 12:27 889bitSet.h #ifndef BITSET_H #d ... -
Huffman树
2011-06-02 11:06 920Huffman树,又称最优二叉树,是一类加权路径长度最短的二叉 ... -
堆
2011-06-02 09:19 954在优先级队列的各种实现中,堆是最高效的一种数据结构 关键码: ... -
森 林
2011-06-01 11:09 603森林与二叉树互转,主要是子结点转左子树,兄弟结点转右子树 深 ... -
二叉树的链式实现
2011-05-31 11:24 1267binaryTree.h #ifndef LINKEDBI ... -
二叉树基本概念
2011-05-30 10:05 844一棵二叉树的结点的一个有限集合:该集合或者为空,或者是由一个根 ... -
树基本概念
2011-05-30 09:28 896结点(node):包含数据项及指向其他结点的分支。 结点的度( ... -
广义表
2011-05-27 10:57 938广义表的定义是递归的,因为在表的描述中又用到了表,允许表中有表 ... -
矩阵相关
2011-05-26 10:22 935矩阵:是一个具有m行n列的二维数组。 上三角矩阵:只存储对角 ... -
优先级队列
2011-05-21 11:24 604PQueue.h #ifndef PQUEUE_H #d ...
相关推荐
在C++编程中,双向链表是一种非常重要的数据结构,它允许在列表的任一位置进行插入和删除操作,而不必像数组那样依赖于索引。在这个“支持类模版的C++双向链表”中,我们将探讨如何利用C++的模板特性来实现一个灵活...
### Linux内核双向链表简单分析 #### 链表数据结构简介 链表作为一种基本且重要的数据结构,在操作系统及各种软件系统中扮演着至关重要的角色。尤其在Linux内核中,链表更是广泛应用于内存管理、进程调度、文件...
双向链表是一种高级数据结构,它在计算机科学中被广泛应用于各种算法和程序设计中。与单链表相比,双向链表的主要特点是每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得双向...
在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...
双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
双向链表是一种特殊类型的数据结构,与常见的单向链表相比,它具有更丰富的操作能力,可以支持前后两个方向的遍历。本篇文章将深入探讨如何创建双向链表以及其在增加和删除操作中的应用。 双向链表的每个节点不仅...
操作系统课程设计中实现线程安全的双向链表是一项重要的实践任务,这涉及到多线程编程、数据结构以及并发控制等核心知识点。在这个项目中,我们主要关注如何在多线程环境下构建一个能够正确操作(如插入、删除)而不...
双向链表(Double Linked List)是链表的一种变体,它允许我们在列表中的每个节点处进行前向和后向的遍历。本文将详细探讨如何实现双向链表的增、删、改、查操作,并通过C++编程语言的DLink.cpp文件进行实际应用。 ...
双向链表是一种特殊的数据结构,它在编程中具有重要的应用。本文将深入探讨双向链表的概念,实现,以及如何进行基本操作。 双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点...
在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...
在编程领域,双向链表是一种数据结构,它允许在列表中的元素之间进行前向和后向的导航。这种数据结构在处理需要频繁插入、删除或遍历操作的问题时特别有用。而“n的阶乘”是数学概念,表示1到n的所有整数的乘积,记...
### 数据结构源代码之双向链表 #### 概述 本文档主要介绍如何通过C语言实现双向链表的基本操作。继单链表之后,双向链表作为一种更灵活的数据结构,支持从前向后以及从后向前的遍历。双向链表在每个节点中除了包含...
双向链表是一种特殊的数据结构,它在计算机程序设计中扮演着重要角色,特别是在C++这样的编程语言中。本节将深入探讨双向链表的概念、其结构、操作以及C++中的实现。 双向链表与单链表不同,它允许每个节点不仅有一...
本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好的性能。 首先,我们需要了解双向链表的基本概念。双向链表是一种线性数据结构,其中每个节点...
定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...
### C++经典算法:双向链表 在计算机科学领域中,数据结构是极其重要的基础知识之一。其中链表作为一种常见的线性表实现方式,在各种应用场景中都有广泛的应用。本篇文章将根据给定的代码片段深入探讨双向链表的...
本文将深入探讨双向链表及其在C++中的模板类实现,以"双向链表模板类简单实现"为主题,我们来详细了解一下这个话题。 双向链表,与单向链表不同,它的每个节点不仅包含数据,还包含两个指针,一个指向下一个节点...
双向链表是链表的一种变体,它在每个节点中不仅存储了数据,还包含了指向前后节点的指针,这使得在链表中的导航变得更加灵活。 双向链表的结构: 在C语言中,一个双向链表的节点通常包含三个部分:数据域,以及两个...
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材