单链表类模板

单链表类模板节点头

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>;
 9     ListNode():m_next(NULL){}
10     ListNode(const Type item , ListNode<Type>*next=NULL):m_data(item),m_next(next){}
11     ~ListNode(){m_next=NULL;}
12 public:
13     Type getData(){return m_data ; }
14     friend ostream& operator<<(ostream&,ListNode<Type>&);
15 private:
16     Type m_data;
17     ListNode *m_next;
18 };
19 template<typename Type>
20 ostream& operator<<(ostream& os , ListNode<Type>& out){
21     os << out.m_data;
22     return os;
23 }

单链表头

SingleList.h

  1 #include "ListNode.h"
  2 template<typename Type>
  3 class SingleList{
  4 public:
  5     SingleList(){head = new ListNode<Type>;}
  6     ~SingleList(){
  7     makeEmpty();
  8     delete head;
  9     }
 10 public:
 11     void makeEmpty();
 12     int length();
 13     ListNode<Type>* find(Type item , int n)const;
 14     ListNode<Type>* find(int n)const;
 15     bool insert(Type item, int n =0);
 16     Type remove(int n);
 17     bool removeAll(Type item);
 18     Type get(int n);
 19     void ReverseSinglyLinkedList();
 20     void print();
 21 private:
 22     ListNode<Type> *head;
 23 };
 24 template <typename Type>
 25 void SingleList<Type>::makeEmpty(){
 26     ListNode<Type> * pdel = NULL;
 27     while(head->m_next!=NULL){
 28         pdel = head->m_next;
 29         head->m_next = pdel->m_next;
 30         delete pdel;
 31     }
 32 }
 33 template <typename Type>
 34 int SingleList<Type>::length(){
 35     int count = 0 ;
 36     ListNode <Type> *p = head->m_next;
 37     while (p!=NULL){
 38         p = p->m_next;
 39         count++;
 40     }
 41     return count;
 42 }
 43 template<typename Type>
 44 ListNode<Type>*SingleList<Type>::find(int n)const{
 45     if(n<0){cout << "out of the boundary"<< endl ;return NULL;}
 46     ListNode<Type>* p = head;
 47     for(int i =0 ; i<=n&&p ;i++){
 48         p = p->m_next;
 49     }
 50     if(p==NULL){
 51         cout << "can‘t find the element"<<endl;
 52         return NULL;
 53     }
 54     return p;
 55 }
 56 template<typename Type>
 57 ListNode<Type>*  SingleList<Type>::find(Type item , int n)const{
 58     if(n<1){
 59         cout << "the n is illegal" << endl;
 60         return NULL;
 61     }
 62     ListNode<Type> *p = head;
 63     int count = 0;
 64     while(count!=n && p){
 65         p=p->m_next;
 66         if(p->m_data==item)
 67         count++;
 68     }
 69     if(p==NULL){
 70         cout << "can‘t find the element"<<endl;
 71         return NULL;
 72     }
 73     return p;
 74 }
 75 template<typename Type>
 76 bool SingleList<Type>::insert(Type item, int n=0){
 77     ListNode<Type> *p = head;
 78     if(n<0){
 79         cout << "the n is illegal"<<endl;
 80         return false;
 81     }
 82     ListNode<Type>* pnode = new ListNode<Type>(item);
 83     ListNode<Type>* pmove = head;
 84     if(pnode==NULL){
 85         cout << "Application is error "<< endl;
 86         return false;
 87     }
 88     for(int i = 0 ; i<n&&pmove; i++){
 89         pmove = pmove->m_next;
 90     }
 91     if(pmove==NULL){
 92         cout << "the n is illegal " << endl;
 93         return false;
 94     }
 95     pnode->m_next = pmove->m_next;
 96     pmove->m_next = pnode;
 97     return true;
 98 }
 99 template<typename Type>
100 Type SingleList<Type>::remove(int n){
101     if(n<0){
102         cout << "can‘t find th element"<<endl;
103         exit(0);
104     }
105     ListNode<Type>* pmove=head ,*pdel;
106     for(int i = 0 ; i<n&&pmove ; i++){
107         pmove = pmove->m_next;
108     }
109     if(pmove->m_next==NULL){
110         cout << "can‘t find the element" <<endl;
111         exit(0);
112     }
113     pdel = pmove->m_next;
114     pmove->m_next = pdel->m_next;
115     Type item = pdel->m_data;
116     delete pdel;
117     return item;
118 }
119 template <typename Type>
120 bool SingleList<Type>::removeAll(Type item){
121     ListNode<Type> *pmove = head,*pdel = pmove->m_next;
122     while(pdel!=NULL){
123         if(pdel->m_data==item){
124             pmove->m_next = pdel->m_next;
125             delete pdel;
126             pdel = pmove->m_next;
127             continue;
128         }
129         pmove=pmove->m_next;
130         pdel = pdel->m_next;
131         pmove = pmove->m_next;
132     }
133     return true;
134 }
135 template<typename Type>
136 Type SingleList<Type>::get(int n){
137     if(n<0){
138         cout << "can‘t find the element "<<endl;
139         exit(0);
140     }
141     ListNode<Type> *pmove =head->m_next;
142     for(int i =0 ; i<n ; i++){
143         pmove = pmove->m_next;
144         if(NULL == pmove){
145             cout << "can‘t find the element "<<endl;
146             exit(0);
147         }
148     }
149     return  pmove->m_data;
150 }
151 template <typename Type>
152 void SingleList<Type>::print(){
153     ListNode<Type> *pmove = head->m_next;
154     cout << "head";
155     while (pmove!=NULL){
156         cout << "->" << pmove->m_data;
157         pmove = pmove->m_next;
158     }
159     cout << endl;
160 }
161 template<typename Type>
162 void SingleList<Type>::ReverseSinglyLinkedList(){
163     if(head->m_next==NULL)return;
164     ListNode<Type> *pmove = head->m_next;
165     ListNode<Type> *temp ;
166     while(pmove->m_next!=NULL){
167         temp = pmove->m_next;
168         pmove->m_next = temp->m_next;
169         temp->m_next = head->m_next;
170         head->m_next = temp;
171     }
172 }
时间: 2024-09-27 01:27:13

单链表类模板的相关文章

第62课 单例类模板

1. 单例需求的提出 (1)在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance) (2)问题:如何定义一个类,使得这个类最多只能创建一个对象 2. 单例模式 (1)要控制类的对象数目,必须对外隐藏构造函数 (2)思路 ①将构造函数的访问属性设置为private ②定义instance,并初始化为NULL ③提供静态函数getInstance来返回单例实例,并判断当instance的值为空时,并创建对象,并保存在instance指针中,非空值时直接返回in

数据结构与算法系列(1)-单链表类的实现(C++)

通过定义一个C++类封装单链表这种数据结构, 封装的方法有: 1.通过输入创建单链表: 2.获取单链表的数据元素个数: 3.打印输出单链表中各个元素: 4.搜索某个元素在单链表中的位置: 5.在某个位置之后插入一个结点: 6.在某个位置删除一个节点: 7.单链表逆置: 8.单链表是否存在回环的判定: 9.单链表的升序排序: 10.两个单链表的升序合并: 11.两个单链表的降序合并. 注:单链表的排序采用的是快速排序的方法. 下面是C++写的程序代码,附运行截图. #include <iostre

爪哇国新游记之十六----泛型单链表类

/** * 单链表节点类 * @param <T> */ class Node<T extends Object>{ protected T value; protected Node next; } /** * 单链表类 * @param <T> */ public class ChainList<T extends Object>{ private Node<T> first; public void addTail(T t){ Node&l

单链表类的定义与实现

///////////////////////////////////////////////////////////////// //日期:2014-11-03 //作者:Davis //功能:单链表的定义与操作实现 ///////////////////////////////////////////////////////////////// #pragma once template<class T> struct Node { T data; //数据域,存放表元素 Node *ne

C++之单例类模板

单例类模板:一个类只能有一个对象,比如超市收银系统中清点物品的仪器只有一个 设计思路: 1.构造函数,拷贝构造函数必须设计为private,防止自己生成新的对象 2.且类的指针要设计为static类型,并初始化为NULL 3.当需要使用对象时(即访问类指针) 空值:则重新分配对象 非空值:返回当前所指向的对象 代码如下 1 #include<iostream> 2 3 using namespace std; 4 5 //扫描物品的工具类 6 class SObject 7 { 8 priva

C++单例模式与单例类模板

1.单例模式 (1)需求的提出:在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(Single,Instance) (2)问题:如何定义一个类,使得这个类最多只能创建一个对象? 要控制类的对象数目,必须对外隐藏构造函数 思路: @1:将构造函数的访问属性设置为private,将拷贝构造函数,赋值操作符都声明成private的,防止对象的赋值操作,因为这个类的对象只能有一个. @2:定义instance并初始化为NULL.在类中用static type* instance的方式声明一

单例类模板(五十一)

在有些时候,我们在进行架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance).比如在超市的收银系统,一个扫描机就对应一个,每个屏幕也会对应一个,基于这种情况,我们就提出了单例模式.那么问题就来了:如何定义一个类,并且使得这个类最多只能创建一个对象呢?那么就必须得控制类的对象数目,必须对外隐藏构造函数.思路是:将构造函数的访问属性设置为 private,定义 instance 并初始化为 NULL:当需要使用对象时,访问 instance 的值,如果是空值,那

28.C++- 单例类模板(详解)

描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同: 懒汉式 : 指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程) 饿汉式 : 指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程) 用法 将构造函数的访问属性设置为private, 提供一个GetInstance()静态成员函数,只能供用户访问

数据结构-单链表-类定义2-C++

上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据结构中将c++的语言特点表现出来.一开始也是不愿意读c++的数据结构,只是一种挑战心里,不想读着读着感觉自己太low了,c++的内容更加丰富,所以还得多多练习...... 头文件 1 #ifndef LIST_H 2 #define LIST_H 3 #include <iostream> 4 5