单链表sLinkList类,模板类

sLinkList模板类,单链表代码
  1 /*
  2     该文件按习惯可以分成.h文件和实现的.cpp文件
  3  */
  4 template <class elemType>
  5 class sLinkList
  6 {
  7 private:
  8     struct node{ //定义单链表中的结点结构
  9         elemType data;
 10         node *next;
 11
 12         node(const elemType &x, node *n = NULL)
 13         {
 14             data = x; next = n;;
 15         }
 16         node() :next(NULL) {}
 17         ~node() {}
 18     };
 19
 20     node  *head;//头指针
 21     int currentLength;//表长
 22
 23     //node *move(int i)const;//返回第i个结点的地址
 24     node *move(int i)const
 25     {
 26         node *p = head;
 27         while( i-- >= 0 )
 28         {
 29             p = p->next;
 30         }
 31         return p;
 32     }
 33
 34 public:
 35     sLinkList();
 36     ~sLinkList() {
 37         clear(); delete head;
 38     }
 39
 40     void clear();
 41     int length()const {
 42         return currentLength;
 43     }
 44     void insert(int i, const elemType&x);
 45     void remove(int i);
 46     int search(const elemType&x)const;
 47     elemType visit(int i)const;
 48     void traverse()const;
 49 };
 50
 51 // sLinkList
 52 template <class elemType>
 53 sLinkList<elemType> ::sLinkList()
 54 {
 55     head = new node;
 56     currentLength = 0;
 57 }
 58
 59 // clear
 60 template <class elemType>
 61 void sLinkList<elemType> ::clear()
 62 {
 63     node *p = head->next, *q;
 64     head->next = NULL;
 65     while(p!=NULL)
 66     {
 67         q = p->next;
 68         delete p;
 69         p = q;
 70     }
 71     currentLength = 0;
 72 }
 73
 74 // insert
 75 template <class elemType>
 76 void sLinkList<elemType> ::insert(int i, const elemType&x)
 77 {
 78     node *pos;
 79     pos = move(i-1);
 80     pos->next = new node(x, pos->next);
 81     ++currentLength;
 82 }
 83
 84 /* // 类外实现,编译器编译不过,只好类内实现
 85 // move
 86 template <class elemType>
 87 sLinkList<elemType>::node *sLinkList<elemType> :: move(int i)const
 88 {
 89     node *p = head;
 90     while( i-- >= 0 )
 91     {
 92         p = p->next;
 93     }
 94     return p;
 95 }  */
 96
 97 // search
 98 template <class elemType>
 99 int sLinkList<elemType> :: search(const elemType&x)const
100 {
101     node *p = head->next;
102     int i=0;
103     while( p != NULL && p->data != x )
104     {
105         p = p->next;
106         ++i;
107     }
108
109     if(p == NULL)
110         return -1;
111     else
112         return i;
113 }
114
115 // visit
116 template <class elemType>
117 elemType sLinkList<elemType> :: visit(int i)const
118 {
119     return move(i)->data;
120 }
121
122 // traverse
123 template <class elemType>
124 void sLinkList<elemType> :: traverse()const
125 {
126     node *p = head->next;
127     cout<<endl;
128
129     while( p != NULL )
130     {
131         cout<<p->data<<" ";
132         p = p->next;
133     }
134
135     cout<<endl;
136 }
137
138 // remove
139 template <class elemType>
140 void sLinkList<elemType> :: remove(int i)
141 {
142     node *pos, *delp;
143     pos = move(i-1);
144     delp = pos->next;
145
146     pos->next = delp->next;
147     delete delp;
148
149     --currentLength;
150 }    

原文地址:https://www.cnblogs.com/GoldenEllipsis/p/10592918.html

时间: 2024-08-28 10:44:06

单链表sLinkList类,模板类的相关文章

C++中的链表节点用模板类和用普通类来实现的区别

C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typename Type>//定义一个模板类必须有的声明 class LinkNode //表示链表节点的类 { public: LinkNode() :m_pnext(nullptr){}//构造函数,在函数体内实现的相当于默认在前面加了inline关键字修饰 LinkNode(Type item, Link

Unity3D单例类模板类

C#代码   using UnityEngine; /// <summary> /// Be aware this will not prevent a non singleton constructor ///   such as `T myT = new T();` /// To prevent that, add `protected T () {}` to your singleton class. /// /// As a note, this is made as MonoBeha

单链表综合实例 --QVector类的实现

C++学习笔记36:类模板

类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typename T> class A; 类模板的成员 像普通类的成员一样定义 定义在类中或类外均可,后者需要在类名后列些模板参数,以区别非模板类的成员函数 template<typename T> T A<T>::f(u) 类成员函数的模板 成员函数可以使用其他模板 template<

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

C++程序设计方法4:类模板

类模板 在定义类时也可以将一些类型抽象出来,用模板参数来替换,从而使类更具有通用性.这种类被称为模板类,例如: template <typename T> class A { T data; public: //类模板成员函数的定义方式一:在类模板中定义 void print() {cout << data << endl;} } //类模板成员函数的定义方式二:在类模板外定义 template<typename T> void A::print(){cou

C++_模板类与类型萃取技术

在声明变量,函数,和大多数其他类型实体的时候,C++要求我们使用指定的类型.然而,有许多代码,除了类型不同之外,其余部分看起来都是相同的,比如,下面这个例子: bool IsEqual (int left, int right) {     return left == right; } bool IsEqual (const string& left , const string& right) {     return left == right; } void test() {   

如何用boost::serialization去序列化派生模板类(续)

在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. 先看看变异错误的代码(...看不出有错,但是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_da