双链表类模板

双链表链表节点

ListNode.h

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4
 5 template <typename Type>class DoublyList;
 6 template <typename Type>
 7 //  节点信息
 8 class ListNode{
 9 private:
10     friend  class DoublyList<Type>;
11     ListNode():m_pprior(NULL),m_pnext(NULL){}
12     ListNode(const Type item , ListNode<Type>*prior=NULL ,13         ListNode<Type>*next=NULL ):m_data(item),m_pprior(prior),m_pnext(next){
14     }
15     ~ListNode(){
16         m_pnext = NULL;
17         m_pprior = NULL;
18     }
19 public:
20     Type getData(){return m_data;}
21 private:
22     Type m_data;  // 节点数据
23     ListNode *m_pprior;  // 前驱
24     ListNode *m_pnext;   // 后继
25 };

双链表链表类

DoublyList.h

  1 #include "stdafx.h"
  2 #include "ListNode.h"
  3 template <typename Type>
  4
  5 // 双链表类
  6 class DoublyList{
  7 public:
  8     DoublyList():head(new ListNode<Type>()){
  9         head->m_pnext = head;
 10         head->m_pprior = head;
 11     }
 12     ~DoublyList(){
 13         makeEmpty();
 14         delete head;
 15     }
 16 public:
 17     void makeEmpty();  //  清空
 18     int length();   // 长度
 19     ListNode<Type>*find(int n =0);  // 查找第n个元素
 20     ListNode<Type>*findData(Type item);   // 查找元素item
 21     bool insert(Type item,int n=0);  // 插入一个元素 ,默认是第一个元素
 22     Type remove(int n =0);  // 移除第n个元素
 23     Type get(int n =0);  // 获取第n个元素
 24     void print();   // 打印双链表
 25 private:
 26     ListNode<Type> *head;
 27 };
 28 template <typename Type>
 29 void DoublyList<Type>::makeEmpty(){
 30     ListNode<Type>*pmove = head->m_pnext,*pdel;
 31     while(pmove!=head){
 32         pdel = pmove;
 33         pmove = pmove->m_pnext;
 34         delete pdel;
 35     }
 36     head->m_pnext = head;
 37     head->m_pprior = head;
 38 }
 39 template <typename Type>
 40 int DoublyList<Type>::length(){
 41     ListNode<Type> *pmove = head->m_pnext;
 42     int count = 0;
 43     while(pmove!=head){
 44         count ++;
 45         pmove = pmove->m_pnext;
 46     }
 47
 48     /*ListNode<Type>*pprior = head->m_pprior;
 49     ListNode<Type>*pnext = head->m_pnext;
 50     while(1){
 51         if(pprior->m_pnext==pnext)break;
 52         if(pprior==pnext&&pnext!=head){
 53             count++;
 54             break;
 55         }
 56         count+=2;
 57         pnext=pnext->m_pnext;
 58         pprior=pprior->m_pprior;
 59     }*/
 60     return count;
 61 }
 62 template <typename Type>
 63 ListNode<Type>* DoublyList<Type>::find(int n){
 64     if(n<0){
 65         cout << "out of the boundary"<<endl;
 66         return NULL;
 67     }
 68     ListNode<Type>*pmove=head->m_pnext;
 69     for(int i = 0 ; i<n ;i++){
 70         pmove=pmove->m_pnext;
 71         if(pmove==head){
 72             cout << "out of the boundary"<<endl;
 73             return NULL;
 74         }
 75     }
 76     return pmove;
 77 }
 78 template <typename Type>
 79 ListNode<Type> *DoublyList<Type>::findData(Type item){
 80     ListNode<Type>*prior = head->m_pprior;
 81     ListNode<Type>*next = head->m_pnext;
 82     while(next->m_pnext!=prior&&prior!=next){
 83         if(prior->m_data==item)return prior;
 84         if(next->m_data==item)return next;
 85         prior = prior->m_pprior;
 86         next = next->m_pnext;
 87     }
 88     cout<<"can‘t find the element"<<endl;
 89     return NULL;
 90 }
 91 template <typename Type>
 92 bool DoublyList<Type> ::insert(Type item ,int n){
 93     if(n<0){
 94         cout << "the n is illegal"<<endl;
 95         return false;
 96     }
 97     ListNode<Type>*newNode = new ListNode<Type>(item);
 98     ListNode<Type>*pmove = head;
 99     for(int i = 0 ; i<n ;i++){
100         pmove = pmove->m_pnext;
101         if(pmove==head){
102                 cout << "the n is illegal"<<endl;
103                 return false;
104         }
105     }
106     newNode->m_pnext = pmove->m_pnext;
107     newNode->m_pprior = pmove;
108     pmove->m_pnext = newNode;
109     newNode->m_pnext->m_pprior = newNode;
110     return true;
111 }
112 template <typename Type>
113 Type DoublyList<Type>::remove(int n =0){
114     if(n<0){
115         cout<< "out of the boundary"<<endl;
116         exit(0);
117     }
118     ListNode<Type>*pdel = find(n);
119     if(pdel!=NULL){
120         pdel->m_pprior->m_pnext = pdel->m_pnext;
121         pdel->m_pnext->m_pprior = pdel->m_pprior;
122         Type item = pdel->m_data;
123         delete pdel;
124         return item;
125     }
126 }
127 template <typename Type>
128 Type DoublyList<Type>::get(int n =0){
129     if(n<0){
130         cout << "out of the boundary"<<endl;
131         exit(0);
132     }
133     ListNode<Type>*pmove = head;
134     for(int i = 0 ; i <n ; i++){
135         pmove = pmove->m_pnext;
136         if(pmove==head){
137             cout << "out of the boundary"<<endl;
138             exit(0);
139         }
140     }
141     return pmove->m_data;
142 }
143 template<typename Type>
144 void DoublyList<Type>::print(){
145     ListNode<Type>*pmove = head->m_pnext;
146     cout << "head";
147     while(pmove!=head){
148         cout << "->" << pmove->m_data;
149         pmove= pmove->m_pnext;
150     }
151     cout << endl <<endl;
152 }

测试:

 1 #include "stdafx.h"
 2 #include "DoublyList.h"
 3
 4 int _tmain(int argc, _TCHAR* argv[])
 5 {
 6     DoublyList<int>list;
 7     for(int i = 0 ; i<10 ;i++){
 8         list.insert(i*i,i);
 9     }
10     list.print();
11     cout << list.length() << endl;
12     list.remove(0);
13     list.print();
14     list.remove(list.length()-1);
15     list.print();
16     return 0;
17 }

时间: 2024-12-13 17:34:49

双链表类模板的相关文章

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

单链表类模板

单链表类模板节点头 ListNode.h 1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std ; 4 template<typename Type> class SingleList; 5 template <typename Type> 6 class ListNode{ 7 private: 8 friend class SingleList<Type>;

线性表-顺序表、链表类模板的实现(数据结构基础 第2周)

学习完课程后,自己用C++实现了简单的顺序表和链表,并用约瑟夫问题做了测试,不保证完全正确. 其中有一点需要注意一下:C++中类模板声明头文件和实现头文件不可以分离到.h和.cpp中,否则无法正常编译,详见:https://www.zhihu.com/question/20630104 源码 1.顺序表 //seqlist.h #pragma once #include <iostream> using namespace std; template <class T> class

数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插入一个节点,需要修改它前面的节点(前驱),使其指向新加入的节点,而新加入的节点则指向原来前驱指向的节点(见下图). 由上图可知,B.C之间插入D,三者之间的关系为 current为插入节点的前驱节点 current->next = new              // B节点指向新节点D new->n

深度解析(三)数组、单链表和双链表

数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现.内容包括:数组单向链表双向链表1. C实现双链表2. C++实现双链表3. Java实现双链表 数组 数组有上界和下界,数组的元素在上下界内是连续的. 存储10,20,30,40,50的数组的示意图如下: 数组的特点是:数据是连续的

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *

C++类模板笔记

今天在写一个链表类模板,然后我和平时写类一样,将头文件.h和.cpp分开写,然后编译器一直提示 类函数全是无法解析的外部命令,后面经查找资料,原来是因为: 模板定义很特殊. 由template<-> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知.在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义.所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义.

Python与数据结构[0] -&gt; 链表[1] -&gt; 双链表与循环双链表的 Python 实现

双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指向前一个结点的信息. Doubly linked list: node_1 <---> node_2 <---> node_3 完整代码 1 from linked_list import LinkedList, test 2 3 4 class NodeDual: 5 def __i

有序的双链表的实现

描述 定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数: 双链表的构造函数(非空的链表,输入数据为0,表示输入结束) 插入操作(将一个数据元素插入到有序的双链表中,插入之后链表仍然有序,输入数据为0表示插入操作结束) 按值删除节点(考虑有重复值的情况) 双链表的遍历操作 双链表的析构 输入输入链表中的元素,根据输入元素,创建有序双链表(非空的链表,输入数据为0,表示输入结束)输入要插入的值(可以插入多个值,0表示输入结束,)输入要删除的值(可以删除多个值,0