顺序表 讲义实现

在这里插入图片描述

在这里插入图片描述

template <class T>
class SqList
{
public:
	SqList();
	~SqList();
	void InputList();
	void OutputList();
	Status ListInsert_Sq(int i, T e);
	Status ListDelete_Sq(int i, T &e);

private:
	T *elem;
	int length;		//实际存放元素的个数
	int listSize;	//可以容纳的最大元素的个数
};
  1. 初始化及销毁
template <class T>
SqList<T>::SqList()
{
	elem = new T[MAXSIZE];
	length = 0;
	listSize = MAXSIZE;
}

template <class T>
SqList<T>::~SqList()
{
	delete[] elem;
}
  1. 插入元素
//在第i个元素之前插入元素
template <class T>
Status SqList<T>::ListInsert(int i, T e)
{
	T *p;
	if(i<1 || i>length+1)
	{
		return ERROR;
	}
	if(length >= listSize)	//容量已满,申请扩容
	{
		T *newbase = new T[MAXSIZE*2];
		if(!newbase)
		{
			return ERROR;
		}
		//复制操作
		p = elem;
		elem = newbase;
		for(int i=0; i<length; i++)
		{
			elem[i] = p[i];
		}
		listSize = MAXSIZE*2;
	}
	T *q = &(elem[i-1]);	//新插入节点位置,第i个元素对应下标为i-1;
	for(p=(&elem[length-1]); p>=q; p--)
	{
		*(p+1) = *p;
	}
	*q = e;
	++length;
	return OK;
}
  1. 删除元素
//删除数组中第i个元素,并用e返回
template <class T>
Status SqList<T>::ListDelete(int i, T &e)
{
	T *p, *q;
	if(i<1 || i>length)
	{
		return ERROR;
	}
	p = &(elem[i-1]);
	e = *p;
	q = elem + length +1;
	for(++p; p<=q; p++)
	{
		*(p-1) = *p;
	}
	--length;
	return OK;
}

#include <iostream>
using namespace std;

const int OK = 1;
const int ERROR = 0;
const int MAXSIZE = 20;

typedef int Status;

template <class T>
class SqList
{
public:
	SqList();
	~SqList();
	void InputList();
	Status ListInsert(int i, T e);
	Status ListDelete(int i, T &e);
	void Display();

private:
	T *elem;
	int length;		//实际存放元素的个数
	int listSize;	//可以容纳的最大元素的个数
};

template <class T>
SqList<T>::SqList()
{
	elem = new T[MAXSIZE];
	length = 0;
	listSize = MAXSIZE;
}

template <class T>
SqList<T>::~SqList()
{
	delete[] elem;
}

//在第i个元素之前插入元素
template <class T>
Status SqList<T>::ListInsert(int i, T e)
{
	T *p;
	if(i<1 || i>length+1)
	{
		return ERROR;
	}
	if(length >= listSize)	//容量已满,申请扩容
	{
		T *newbase = new T[MAXSIZE*2];
		if(!newbase)
		{
			return ERROR;
		}
		//复制操作
		p = elem;
		elem = newbase;
		for(int i=0; i<length; i++)
		{
			elem[i] = p[i];
		}
		listSize = MAXSIZE*2;
	}
	T *q = &(elem[i-1]);	//新插入节点位置,第i个元素对应下标为i-1;
	for(p=(&elem[length-1]); p>=q; p--)
	{
		*(p+1) = *p;
	}
	*q = e;
	++length;
	return OK;
}

//删除数组中第i个元素,并用e返回
template <class T>
Status SqList<T>::ListDelete(int i, T &e)
{
	T *p, *q;
	if(i<1 || i>length)
	{
		return ERROR;
	}
	p = &(elem[i-1]);
	e = *p;
	q = elem + length +1;
	for(++p; p<=q; p++)
	{
		*(p-1) = *p;
	}
	--length;
	return OK;
}


template <class T>
void SqList<T>::Display()
{
	for(int i=0; i<length; i++)
	{
		cout << elem[i] << " ";
	}
	cout << endl;
}

int main()
{
	SqList<int> list1;
	for(int i=0; i<10; i++)
	{
		list1.ListInsert(1, i);
	}
	list1.Display();

	list1.ListInsert(10, 10);
	list1.Display();

	for(int i=0; i<5; i++)
	{
		int temp = 0;
		list1.ListDelete(1, temp);
		cout << "temp = " << temp <<endl;
	}
	list1.Display();
	int a = 0;
	list1.ListDelete(3, a);
	cout << "a = " << a <<endl;
	list1.Display();
	return 0;
}

测试结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HdUIprince/article/details/83039527