顺序表和链表的模板

c++引入模板是为了更好的代码复用,模板这边分为两个大块.

       1.模板函数

       2.模板类

    我们今天来介绍模板类的应用—顺序表和链表(单链表为例)

    

    //模板的顺序表
    
    template<class T>
    class SeqList
    {
    public:
    	SeqList()
    		:_array(NULL)
    		, _size(0)
    		, _capacity(0)
    	{}
    
    	~SeqList()
    	{
    		if (_array)
    		{
    			delete[] _array;
    			//free(_array);
    		}
    	}
    
    	SeqList(const SeqList<T>& s)
    	{
              _array = new T[_capacity];
    			//_array = (T*)malloc(sizeof(T)*s._capacity);
    			/*memcpy(_array, s._array, s._capacity);*/   //只是将数组的首元素 赋值过去,并没有将所有值赋值过去。
    			for (int i = 0; i < s._size; i++)
    			{
    				_array[i] = s._array[i];
    			}
    			_size = s._size;
    			_capacity = s._capacity;
    	}
    
    	SeqList<T>& operator=(const SeqList<T>& s)
    	{
    		if (this != &s)
    		{
    			_array = new T[_capacity];
    			/*memcpy(_array, s._array, s._capacity);*/   //只是将数组的首元素 赋值过去,并没有将所有值赋值过去。
    			for (int i = 0; i < s._size; i++)
    			{
    				_array[i] = s._array[i];
    			}
    			_size = s._size;
    			_capacity = s._capacity;
    		}
    		return *this;
    	}
    
    	void PushBack(const T& x)
    	{
    		_CheckCapacity();
    		_array[_size++] = x;
    	}
    
    	void PopBack()
    	{
    		if (_size > 0)
    		{
    			_size--;
    		}
    		else
    		{
    			cout << "NO DATA!" << endl;
    		}
    	}
    
    	void Print()
    	{
    		for (int i = 0; i < _size; i++)
    		{
    			cout << _array[i] << "->";
    		}
    		cout << endl;
    	}
    
    
    protected:
    	void _CheckCapacity()
    	{
    		if (_size >= _capacity)
    		{
    			/*_capacity = _capacity * 2 + 1;
    			_array = (T*)realloc(_array, sizeof(T)*_capacity);*/
    
    			_capacity = _capacity * 2 + 1;
    			T* tmp = new T[_capacity];                //考虑到string类型,用malloc\realloc不会调用构造函数
    			if (_array)
    			{
    				memcpy(tmp, _array, _size);             
    			}
    			delete[] _array;
    
    			_array = tmp;
    		}
    	}
    private:
    	T* _array;
    	int _size;
    	int _capacity;
    };
    
    
    void Test1()
    {
    	SeqList<int> s1;
    	s1.PushBack(1);
    	s1.PushBack(2);
    	s1.PushBack(3);
    	s1.PushBack(4);
    
    	SeqList<int> s2(s1);
    
    	s2.PushBack(5);
    	s2.PushBack(6);
    	s2.PushBack(7);
    	s2.PushBack(8);
    	s2.PushBack(9);
    
    	s1.Print();
    	s2.Print();
    }
    
    void Test2()
    {
    	SeqList<int> s1;
    	s1.PushBack(1);
    	s1.PushBack(2);
    	s1.PushBack(3);
    	s1.PushBack(4);
    
    	s1.Print();
    
    	s1.PopBack();
    	s1.PopBack();
    	s1.PopBack();
    	s1.PopBack();
    	s1.PopBack();
    
    }
    
    void Test3()
    {
    	SeqList<int> s1;
    	s1.PushBack(1);
    	s1.PushBack(2);
    	s1.PushBack(3);
    	s1.PushBack(4);
    
    	SeqList<int> s2;
    	s2 = s1;
    
    	s1.Print();
    	s2.Print();
    }
    
    template<class T>     //模板定义友元的时候是需要在声明的
    class LinkList;
    
    template<class T>
    class LinkListNode
    {
    	friend class LinkList<T>;
    public:
    	LinkListNode(const T& x)
    		:_data(x)
    		, _next(NULL)
    	{}
    private:
    	T _data;
    	LinkListNode<T>* _next;
    };
    
    
    
    template<class T>
    class LinkList
    {
    public:
    	LinkList()
    		:_head(NULL)
    	{}
    
    	~LinkList()
    	{
    		if (_head)
    		{
    			delete _head;
    		}
    	}
    
    	LinkList(const LinkList<T>& l)        //一个一个结点赋值
    	{
    		LinkListNode<T>* cur = l._head;
    		while (cur)
    		{
    			if (_head == NULL)
    			{
    				_head = new LinkListNode<T>(cur->_data);
    			}
    			else
    			{
    				LinkListNode<T>* tmp = new LinkListNode<T>(cur->_data);
    				LinkListNode<T>* cur = _head;
    				while (cur->_next)
    				{
    					cur = cur->_next;
    				}
    				cur->_next = tmp;
    				tmp->_next = NULL;
    			}
    			cur = cur->_next;
    		}
    	}
    
    	void PushBack(const T& x)
    	{
    		if (_head == NULL)
    		{
    			_head = new LinkListNode<T>(x);
    		}
    		else
    		{
    			LinkListNode<T>* tmp = new LinkListNode<T>(x);
    			LinkListNode<T>* cur = _head;
    			while (cur->_next)
    			{
    				cur = cur->_next;
    			}
    			cur->_next = tmp;
    			tmp = NULL;
    		}
    	}
    
    	void print()
    	{
    		LinkListNode<T>* cur = _head;
    		while (cur)
    		{
    			cout << cur->_data << "->";
    			cur = cur->_next;
    		}
    	}
    
    private:
    	LinkListNode<T>* _head;
    };
    
    
    void Test3()
    {
    	LinkList<int> l1;
    
    	l1.PushBack(1);
    	l1.PushBack(2);
    	l1.PushBack(3);
    	l1.PushBack(4);
    
    	l1.print();
    
    }
    
    void Test4()
    {
    	LinkList<int> l1;
    
    	l1.PushBack(1);
    	l1.PushBack(2);
    	l1.PushBack(3);
    	l1.PushBack(4);
    
    	LinkList<int> l2(l1);
    	l1.print();
    
    	cout << endl;
    	l2.print();
    }

以上是本人在学习时候的代码,供你参考。

时间: 2024-11-02 13:26:18

顺序表和链表的模板的相关文章

线性表-顺序表、链表类模板的实现(数据结构基础 第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

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

比较顺序表和链表的优缺点

1.比较顺序表和链表的优缺点,他们分别在什么场景下使用它. 顺序表支持随机访问,单链表不支持随机访问. 顺序表插入/删除数据效率很低,时间复杂度为O(N)(除尾插尾删),单链表插入/删除效率更高,时间复杂度为O(1). 顺序表的CPU高速缓存效率更高,单链表CPU高速缓存效率低.

【数据结构】顺序表和链表的比较

顺序表和链表各有短长.在实际应用中究竟选用哪一种存储结构呢?这要根据具体问题的要求和性质来决定.通常有以下几方面的考虑: ┌───┬───────────────┬───────────────┐ │      │       顺序表        │        链表          │ ├─┬─┼───────────────┼───────────────┤ │基│分│静态分配.程序执行之前必须明确│动态分配只要内存空间尚有空闲,│ │于│配│规定存储规模.若线性表长度n变 │就不会产

顺序表和链表的区别

首先了解顺序表和链表的概念 1.顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 特点: (1)在顺序表中,各个表项的逻辑顺序与其存储的物理顺序一致,即第 i 个表项存储于第 i 个物理位置(1 < i < n) (2)对顺序表中的所有表项,即可以进行顺序的访问,也可以随机的访问,也就是说,既可以从表的第一个表项开始逐

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

8.基本数据结构-顺序表和链表

一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计算机中存储的是基于二进制的电影数据,然后我们可以通过相关的视频播放软件结合相关的硬件对电影的二进制数据进行相关的运算操作,所产生的结果就是我们可以看到电影的画面和听到音频的声音. - 问题:阐述计算机如何计算1+2的结果? - 阐述:简单理解为,首先可以将1和2输入到计算机中,然后计算机会将1和2转