动态顺序表 与 双向链表的模板类

////////////////////////////////////////////////////////////////////////
/////////////////////泛型编程之动态顺序表的模板/////////////////////////
////////////////////////////////////////////////////////////////////////

#include<iostream>
#include<string>
using namespace std;

template<typename Type>     
//建立动态顺序表类模板
class Vector           
{
public:
	Vector() :_head(NULL), _size(0),_capacity(0)
	{}

	Vector(const Vector<Type>& vector)
		:_head(NULL), _size(0), _capacity(0)
	{
		_head = new Type[vector._size];
		//memcpy(_head, vector._head, sizeof(Type)*vector._size);    (错误的写法) 
		//当Type 是自定义类型时,可能会造成的浅拷贝,从而造成程序崩溃
		for (int i = 0; i < vector._size; i++)
		{
			_head[i] = vector._head[i];   
		}
		_size = vector._size;
		_capacity = vector._capacity;
	}

	Vector<Type>& operator = (const Vector<Type>& vector)
	{
		if (this != &vector)
		{
			if (_head != NULL)
			{
				delete[] _head;
				_size = 0;
				_capacity = 0;
			}

			_head = new Type[vector._size];
			for (int i = 0; i < vector._size; i++)
			{
				_head[i] = vector._head[i];
			}
			_size = vector._size;
			_capacity = vector._capacity;
		}
		return *this;
	}

	~Vector()
	{
		if (_head != NULL)
		{
			delete[] _head;
		}
		_size = 0;
		_capacity = 0;
	}
public:
	void PushBack(Type x)
	{
		_CheckCapacity();
		_head[_size++] = x;
	}
	void Print()
	{
		cout << "顺序表:" << endl;
		for (int i = 0; i < _size; i++)
		{
			cout << _head[i] << "  ";
		}
		cout << endl << endl;
	}
protected:
	void _CheckCapacity()
	{
		if (_size >= _capacity)
		{
			Type *tmp = _head;
			_head = new Type[2 * _capacity + 3];
			//memcpy(_head, vector._head, sizeof(Type)*vector._size);  (错误的写法) 
			//当Type 是自定义类型时,可能会造成的浅拷贝,从而造成野指针问题,析构时就会出现问题 
			for (int i = 0; i < _size; i++)
			{
				_head[i] = tmp[i];
			}
			delete[] tmp;
			_capacity = 2 * _capacity + 3;
		}
	}
protected:
	Type *_head;
	size_t _size;
	size_t _capacity;
};

void Test_string()
{
	Vector<string> vector;           
	vector.PushBack("aaaaa");
	vector.PushBack("bbbbb");
	vector.PushBack("ccccc");
	vector.PushBack("ddddd");
	vector.PushBack("eeeee");
	Vector<string> vector_2(vector);
	Vector<string> vector_3;
	vector_3 = vector_2;
	vector_3.Print();
}

void Test_double()
{
	Vector<double> vector;
	vector.PushBack(1.1);
	vector.PushBack(2.2);
	vector.PushBack(3.3);
	vector.PushBack(4.4);
	vector.PushBack(5.5);
	Vector<double> vector_2(vector);
	Vector<double> vector_3;
	vector_3 = vector_2;
	vector_3.Print();
}

void Test_char()
{
	Vector<char> vector;
	vector.PushBack(‘a‘);
	vector.PushBack(‘b‘);
	vector.PushBack(‘c‘);
	vector.PushBack(‘d‘);
	vector.PushBack(‘e‘);
	Vector<char> vector_2(vector);
	Vector<char> vector_3;
	vector_3 = vector_2;
	vector_3.Print();
}
void main()
{
	Test_string();
	Test_double();
	Test_char();
}

//////////////////////////////////////////////////////////////////////////
///////////////////////泛型编程之动态双向链表的模板///////////////////////
//////////////////////////////////////////////////////////////////////////
#include<iostream>
#include<string>
using namespace std;
template<typename Type>
struct ListNode
{
	ListNode(Type x = 0) :_date(x), _next(NULL), _prev(NULL)
	{

	}
	Type _date;
	ListNode<Type> *_next;
	ListNode<Type> *_prev;
};

template<typename Type>
class List
{
public:
	List() :_head(NULL), _tail(NULL)
	{}

	List(const List<Type>& list)
		:_head(NULL), _tail(NULL)
	{
		ListNode<Type> *tmp = list._head;
		while (tmp)
		{
			PushBack(tmp->_date);
			tmp = tmp->_next;
		}
	}

	List<Type> & operator = (List<Type> list)
	{
		if (this != &list)
		{
			swap(_head, list._head);
			swap(_tail, list._tail);
		}
		return *this;
	}

	~List()
	{
		if (_head != NULL)
		{
			while (_head)
			{
				ListNode<Type> *tmp = _head;
				_head = _head->_next;
				delete tmp;
			}
		}
		_head = NULL;
		_tail = NULL;
	}
public:
	void PushBack(Type x)
	{
		ListNode<Type> *tmp = new ListNode<Type>(x);
		if (_head == NULL)
		{
			 _head = _tail = tmp;
		}
		else
		{
			_tail->_next = tmp;
			tmp->_prev = _tail;
			_tail = _tail->_next;
		}
	}

	void Print()
	{
		cout << "单链表为:" << endl;
		ListNode<Type> *tmp = _head;
		while (tmp)
		{
			cout << tmp->_date << "->";
			tmp = tmp->_next;
		}
		cout << "NULL\n" <<endl;
	}
protected:
	ListNode<Type> *_head;
	ListNode<Type> *_tail;
};

void Test_int()
{
	List<int> list;
	list.PushBack(1);
	list.PushBack(2);
	list.PushBack(3);
	list.PushBack(4);
	list.PushBack(5);
	list.PushBack(6);
	list.Print();
}

void Test_char()
{
	List<char> list;
	list.PushBack(‘a‘);
	list.PushBack(‘b‘);
	list.PushBack(‘c‘);
	list.PushBack(‘d‘);
	list.PushBack(‘e‘);
	list.PushBack(‘f‘);
	list.Print();
}

void Test_string()
{
	List<string> list;
	list.PushBack("aaaaa");
	list.PushBack("bbbbb");
	list.PushBack("ccccc");
	list.PushBack("dddddd");
	list.PushBack("eeeeee);
	list.PushBack("ffffff");
	list.Print();
}

void Test_1()
{
	List<string> list;
	list.PushBack("aaaaa");
	list.PushBack("bbbbbb");
	list.PushBack("cccccc");
	List<string> list_2(list);
	List<string> list_3;
	list_3 = list_2;
	list.Print();
	list_2.Print();
	list_3.Print();
}
void main()
{
	Test_int();
	Test_char();
	Test_string();
	Test_1();
}
时间: 2024-12-25 07:19:47

动态顺序表 与 双向链表的模板类的相关文章

静态顺序表和动态顺序表

实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数, typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; 首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0 void InitSeqList(SeqList *pSeq) { assert(pSeq); memset(p

数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现 C++ 顺序存储模板类的实现[面试重要] C++ 链式存储模板类的实现[面试重要] C++ 链式存储模板类,载入指针 c++ 栈的链式存储实现(模板类嵌套模板类),编译问题教训[重要] C++ 顺序存储模板类的实现[面试重要] 项目文件: [email protected]://990487026.blog.51cto.com~/c++$ tree .

c实现的动态顺序表

第一篇文章中用c实现了静态顺序表,但是使用静态顺序表还有不足的地方.当我们需要存储的数据很少时,如果静态顺序表的数组容量较大就会造成空间的浪费:当我们需要存储的数据很多时,如果静态顺序表的数组容量较小可能就会造成数据丢失.所以一般情况我们应该尽量把顺序表实现成动态的.需要多大容量就开辟多大容量. 静态顺序表和动态顺序表只有以下函数不同: 1.定义结构体时,多定义一个capacity,并对capacity进行初始化和增加大小的设置: #define INIT_CAPACITY 3 #define 

C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<malloc.h> typedef int DateType; typedef struct SeqList {     DateType *arr;     size_t capacility;     size_t size; }SeqList; //创建空间 void Che

【C语言】静态顺序表和动态顺序表的实现

静态顺序表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 有两种定义顺序表的方法:一是静态地定义一张顺序表:二是动态地生成一张顺序表. 静态地定义一张顺序表的方法与定义一个数组的方法类似.可以描述如下: #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE

动态顺序表(可分配内存空间)

<strong style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前几天写了一个静态顺序表,但是觉得一开始开辟很大一部分空间却不一定可以完全用得上,会造成很大的内存浪费,于是写了一个可以自动开辟内存空间的动态顺序表作为改进.</strong> "DynamicSeqllist.h" #pragma once #def

C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. 1 #pragma once 2 #include<iostream> 3 #include<string> 4 #include<stdlib.h> 5 using namespace std; 6 7 template <class T> 8 class Vector 9 { 10 publ

函数模板在c++动态顺序表中的大作用

函数模板提供了一种机制通过它我们可以保留函数定义和函数调用的语义在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次. 函数模板提供一个种用来自动生成各种类型函数实例的算法程序员对于函数接口参数和返回类型中的全部或者部分类型进行参数化(parameterize)而函数体保持不变. 函数模板使用注意事项: 1.每个函数模板前边都需要添加模板声明例如:template<typename T> 2.在模板类的使用时,注意其类型改变,例如: template<typename T&g

模板实现动态顺序表

定义类模板时,成员函数可以定义在类内部,也可以在类模板外定义.     此时成员函数中若有类型参数存在,则需注意: (1)要在成员函数定义之前进行模板声明.    (2)在成员函数名前加上" 类名<类型参数> " #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<assert.h> // 定义模板类  (类型参数为T) template