基本数据结构:顺序表

顺序表,数组就是典型的顺序表,顺序表便于查询元素,单移动、删除时间开销比较大,好了废话少说,直接上代码,对照源码看吧

#ifndef SEQLIST_H
#define SEQLIST_H

#include <iostream>
#include <stdlib.h>
using std::cin;
using std::cout;
using std::cerr;
using std::endl;
using std::ostream;
using std::istream;

const int defaultSize = 100;
const int initLen = 20;

template <class T>
class SeqList
{

public:
	SeqList(const int maxSize = defaultSize);//带默认参数的构造函数
	SeqList(const SeqList<T> &seqList);
	~SeqList()
	{
		delete []data;//销毁数组
	}

	int length() const//返回顺序表内已有数据的长度
	{
		return last + 1;
	}

	int maxSize() const//返回顺序表的最大容量
	{
		return this->size;
	}

	bool isEmpty()//返回顺序表是否为空
	{
		return (last == -1);
	}

	bool isFull()//返回顺序表是否已满
	{
		return (last == size-1);
	}

	int search(T &x) const;//查找x是否在顺序表中存在,存在返回其位置,不存在返回0

	T& getData(int i) const//返回第i个编号位置的元素
	{
		if(i>0 && i<=last+1)
		{
			return data[i-1];
		}
		
	}

	void setData(int i, T &x)//对第i个编号位置的元素赋值
	{
		if (i>0 && i<=last+1){
			data[i-1] = x;
		}
		
	}

	bool insert(int i, T &x);//在第i个编号位置插入元素
	bool remove(int i, T &x);//把第i个编号位置的元素移走
	void reSize(int newSize);//调整顺序表的大小,关键是要把原来的数据复制过来
	SeqList<T>& operator= (const SeqList<T> &rhs);
	void init();//这个方法无实际意义,纯粹是为了测试用单独引入的1个方法

	friend ostream& operator << (ostream& os,const SeqList<T>& seqList)
	{
		for(int i = 0; i <= seqList.last; i++)
		{
			os << "#" << i+1 << ":" << seqList.data[i] << endl;
		}

		return os;
	}

private:
	T *data;//存放的数组
	int size;//最大可存放的项
	int last;//当前尾巴元素的小标
};


template <class T>
SeqList<T>::SeqList(int maxSize)
{
	if(maxSize > 0)
	{
		this->size = maxSize;//创建数组
		this->last = -1;
		data = new T[maxSize];
		if(data == NULL)
		{
			cerr << "malloc memory failed!" << endl;
			return;
		}
	}
}

template <class T>
SeqList<T>::SeqList(const SeqList<T>& seqList)
{
	size = seqList.maxSize();
	last = seqList.length() - 1;
	data = new T[size];

	if (data == NULL){
		cerr << "Memory allocating error!" << endl;
		return;
	}

	for (int i = 1; i <= last+1; i++){
		data[i-1] = seqList.getData(i);
	}
}

template <class T>
int SeqList<T>::search(T &x) const
{
	for(int i = 0; i <= last; i++)
	{
		if(this->data[i] == x)//找到后返回下标
		{
			return i+1;
		}
	}

	return 0;
}

template <class T>
bool SeqList<T>::insert(int i, T &x)
{
	if(isFull())
	{
		return false;
	}

	if( i < 0 || i > last + 1)//注意我们讲的是顺序表
	{
		return false;
	}

	for(int j = last; j >= i-1; j--)
	{
		this->data[j+1] = this->data[j];
	}
	this->data[i-1] = x;//插入
	last++;//现有尾巴下标后移

	return true;
}

template <class T>
bool SeqList<T>::remove(int i, T &x)
{
	if(isEmpty())
	{
		return false;
	}
	if(i < 1 || i >= last+1)
	{
		return false;
	}
	
	x = this->data[i-1];
	for(int j = i; j <= last; j++)//后面的元素向前移
	{
		this->data[j-1] = this->data[j];
	}

	last--;
	return true;
}

template <class T>
void SeqList<T>::reSize(int newSize)
{
	if(newSize <= 0)
	{
		cerr << "invalid newSize!" << endl;
		return;
	}


	if(newSize != size)
	{
		int end = -1;//要拷贝数据的终止下标
		if(size < newSize)//新的容量比原来要大
		{
			end = last;
		}
		else //新的容量比原来小
		{
			end = newSize - 1;
		}

		T* newArray = new T[newSize];
		if( newArray == NULL)
		{
			cerr << "malloc memory failed!" << endl;
			return;
		}

		T* srcPtr = data;
		T* descPtr = newArray;
		for(int i = 0; i <= end; i++)
		{
			*descPtr++ = *srcPtr++;
		}

		delete []data;//删除原来的数组
		data = newArray;//data指向新的数组
		last = end;//重新记录尾巴元素的下标
		size = newSize;//重新新的容量
	}
}

template <class T>
SeqList<T>& SeqList<T>::operator= (const SeqList<T> &rhs)
{
	size = seqList.maxSize();
	last = seqList.length() - 1;
	if(data != NULL)
	{
		delete []data;
	}
	data = new T[size];

	if (data == NULL){
		cerr << "Memory allocating error!" << endl;
		return;
	}

	for (int i = 1; i <= last+1; i++)
	{
		data[i-1] = seqList.getData(i);
	}

	return *this;
}

template <class T>
void SeqList<T>::init()
{
	for(int i = 0; i < initLen; i++)
	{
		last++;
		this->data[last] = (T)rand() / 100;
	}
}
#endif




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值