动态顺序表的增、删、查、改、逆置、排序

版权声明:本文为博主原创文章,未经许可,不得转载! https://blog.csdn.net/bin_ge_love/article/details/51658084

   顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

   线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

具体实现代码如下:

#include<iostream>

using namespace std;

template <class T ,int DefaultCapacity =10 >
class SeqList
{
public:
	void _CheckCapacity()						//检查内存
	{
		if (_size == _capacity)
		{
			_capacity = _capacity * 2 + 3;
			T* tmp = new T[_capacity];
			for (int i = 0; i < _size; ++i)
			{
				tmp[i] = _data[i];
			}
			delete[] _data;
			_data = tmp;
		}
	}

	SeqList();
	~SeqList();
	void Print();

	void PushBack(const T& x);
	void PushFront(const T& x);
	void PopBack ();
	void PopFront ();
	int Find(const T& x);
	void Delete_val(const T& x);
	void Delete_pos(int pos);
	void Insert_val(const T& i,const  T& x);
	void Insert_pos(int pos,const T& x);

	void length();                    //求表长
	void clear();                          //清除数据
	void destroy();                        //摧毁该顺序表
	void reverse();                         //反转
	void sort(/*int low,int high*/);       //排序


public:
	T* _data;
	int _size;
	int _capacity;
	 
};

template <class T, int DefaultCapacity = 10 >	//构造函数 
SeqList <T, DefaultCapacity>  :: SeqList()
	:_data(new T[DefaultCapacity])
	, _size(0)
	, _capacity(DefaultCapacity)
{}

template <class T, int DefaultCapacity = 10 >	//析构函数
SeqList <T, DefaultCapacity> :: ~SeqList()
{
	if (_data)
	{
		delete[]  _data;
	}
}


template<class T, int DefaultCapacity =10>
void SeqList <T, DefaultCapacity> ::Print()		//打印函数
{
	if (_size == 0)
	{
		cout << "SeqList is empty!!!\n" << endl;
		return;
	}
	cout << "SeqList->: ";
	for (int i = 0; i < _size; i++)
	{
		cout << _data[i] << " ";
	}
	cout << endl;
}


template<class T, int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity > ::PushBack(const T& x)		//尾插
{
	_CheckCapacity();
	_data[_size++] = x;
}


template<class T, int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity> ::PopBack()
{
	if (_size == 0)
	{
		return;
	}
	if (_size > 0)
		--_size;
}

template<class T ,int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity> ::PushFront(const T& x)		//头插
{
	_CheckCapacity();
	if (_size == 0)
	{
		_data[_size++] = x;
	}
	else
	{
		for (int i = _size; i > 0; i--)
		{
			_data[i] = _data[i - 1];
		}
		_data[0] = x;
		_size++;
	}
	
}

template<class T, int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity> ::PopFront()		//头删
{
	if (_size == 0)
	{
		return;
	}
	else
	{
		for (int i = 0; i < _size - 1; i++)
		{
			_data[i] = _data[i + 1];
		}
		_size--;
	}
}


template<class T, int DefaultCapacity = 10>
int SeqList<T, DefaultCapacity>::Find(const T& x)		//  find函数
{
	if (_size == 0)
	{
		cout << "SeqList is empty!  Not find!!!\n" << endl;
		return 0;
	}
	else
	{
		for (int i = 0; i < _size; i++)
		{
			if (_data[i] == x)
			{
				cout << "The data`s  index of your find is " << i+1 << endl;
				return i;
			}
		}
	}
}


template<class T, int DefaultCapacity = 10>
void SeqList<T, DefaultCapacity>::Delete_val(const T& x)			//按值删除
{
	if (_size == 0)
	{
		return;
	}
	else
	{
		int pos = Find(x);
		Delete_pos(pos + 1 );
	}
}


template<class T, int DefaultCapacity = 10>
void SeqList<T, DefaultCapacity>::Delete_pos(int pos)		//按地址删除
{
	if (pos > _size)
	{
		cout << "Input Error!!!  Please input agin!!! " << endl;
		return;
	}
	else
	{
		if (_size == 0)
		{
			return;
		}
		else if (_size == 1)
		{
			PopBack();
		}
		else
		{
			for (int i = pos - 1 ; i < _size - 1; i++)			//只能是尾删
			{
				_data[i] = _data[i+1];
			}
			_size--;
		}
	}
}

template<class T, int DefaultCapacity =10>
void SeqList<T, DefaultCapacity>::Insert_pos(int pos, const T& x)			//按位置插入(在前面插入)
{
	_CheckCapacity();
	if (_size == 0)
	{
		_data[_size++] = x;
	}
	else if (_size == 1)
	{
		PushFront(x);
	}
	else
	{
		int i = 0;
		for ( i = _size; i >= pos; i--)
		{
			_data[i] = _data[i - 1];
		}
		_data[i] = x;
	}
	_size++;
}

template<class T, int DefaultCapacity =10>
void SeqList<T, DefaultCapacity>::Insert_val( const T& i, const T& x)			//按值插入
{

	_CheckCapacity();
	if (_size == 0)
	{
		_data[_size++] = x;
	}
	else if (_size == 1)
	{
		PushFront(x);
	}
	else
	{
		int val = Find(i);
		Insert_pos(val +1 ,x);
	}
}


template<class T, int DefaultCapacity = 10>
void  SeqList<T, DefaultCapacity> :: length()
{
	cout << "The Length of SeqList is " << _size <<endl;
	//return length;
}

template<class T ,int DefaultCapacity = 10>
void SeqList <T, DefaultCapacity> ::reverse()		// 逆置
{
	if (_size == 0 || _size == 1)
	{
		return;
	}
	else 
	{
		T tmp =0;
		int i = 0;
		int j = _size - i - 1;
		for ( i = 0; i < j; i++)
		{
			j = _size - i - 1;
			tmp = _data[i];
			_data[i] = _data[j];
			_data[j] =tmp;
		}
		return;
	}
}


template <class T ,int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity> :: clear()				//清空顺序表
{
	while (_size)
	{
		_data[_size--] = NULL;
	}
}


template <class T, int DefaultCapacity = 10 >
void SeqList<T, DefaultCapacity> ::sort()	//排序
{
	for (int i = 0; i <= _size; i++)
	{
		for (int j = i + 1; j <= _size - 1; j++)
		{
			if (_data[i] > _data[j])
			{
				int tmp = _data[j];
				_data[j] = _data[i];
				_data[i] = tmp;
			}
		}
	}
}
测试代码如下:

#include"SeqList.h"

void Test1()
{
	SeqList<int, 3> s1;

	s1.PushBack(1);
	s1.PushBack(2);
	s1.PushBack(3);
	s1.PushBack(4);
	s1.PushBack(5);
	s1.PushBack(6);

	s1.Print();


	s1.PopBack();
	s1.PopBack();
	s1.PopBack();
	s1.PopBack();
	s1.PopBack();

	s1.Print();
}


void Test2()
{
	SeqList<int, 4> s2;

	s2.PushFront(5);
	s2.PushFront(6);
	s2.PushFront(7);
	s2.PushFront(8);
	s2.PushFront(9);

	s2.Print();


	/*s2.PopFront();
	s2.PopFront();
	s2.PopFront();*/
	//s2.PopFront();

	//s2.Print();


	//s2.Delete_pos(6);


	//s2.Delete_val(6);

	s2.Print();
}

void Test3()
{
	SeqList<int, 3> s3;
	s3.PushBack(1);
	s3.PushBack(2);
	s3.PushBack(3);
	s3.PushBack(4);
	s3.PushBack(5);
	s3.PushBack(6);

	s3.Print();


	//s3.Insert_pos(2,8);


	//s3.Insert_val(4,9);
	s3.reverse();
	s3.Print();


	s3.clear();
	s3.length();
}

void Test4()
{
	SeqList<int, 4> s4;
	s4.PushBack(1);
	s4.PushBack(10);
	s4.PushBack(3);
	s4.PushBack(11);
	s4.PushBack(5);
	s4.PushBack(13);

	s4.Print();

	s4.sort();
	s4.Print();
	s4.length();
}
int main()
{
	//Test1();
	//Test2();
	//Test3();
	//Test4();
	//template <class T, int DefaultCapacity = 10 >
	SeqList<int, 4> mylist;
	int select = 1;
	int Item;
	int pos;
flag:
	cout << endl << endl;;
	cout << "	* * * * * * * welcome to use SeqList* * * * * * * *" << endl;
	void Menu();
	{
		cout << "	*	1. PushBack		2. PushFront      *" << endl;
		cout << "	*	3. Print		4. PopBack        *" << endl;
		cout << "	*	5. PopFront		6. Insert_pos     *" << endl;
		cout << "	*	7. Insert_val	        8. Delete_pos     *" << endl;
		cout << "	*	9. Delete_val	        10.Find           *" << endl;
		cout << "	*	11. length		12.clear	  *" << endl;
		cout << "	*	13. reverse		14.sort		  *" << endl;
		cout << "	*	0.exit					  *" << endl;
		cout << "	*        		    			  *" << endl;
		cout << "	*       Please select:			          *" << endl;
		cout << "	* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
	}
	while (select)
	{
		//sort = "" show_list = "" reserv = "" push_front = "" push_back = "" pop_front = "" pop_back = "" length = "" insert_val = "" insert_pos = "" find = "" destroy = "" delete_val = "" delete_pos = "" clear = "">";
		cin >> select;
		switch (select)
		{
		case 1:
			cout << "请输入要后插的值(-1结束):>";
			while (cin >> Item, Item != -1)
			{
				mylist.PushBack(Item);
			}
			break;
		case 2:
			cout << "请输入要头插的值(-1结束):>";
			while (cin >> Item, Item != -1)
			{
				mylist.PushFront(Item);
			}
			break;
		case 3:
			mylist.Print();
			break;
		case 4:
			mylist.PopBack();
			break;
		case 5:
			mylist.PopFront();
			break;
		case 6:
			cout << "请输入要插入的位置:>";
			cin >> pos;
			cout << "请输入要插入的值:>";
			cin >> Item;
			mylist.Insert_pos(pos, Item);
			break;
		case 7:
			cout << "请输入要在i插入的值:>";
			cin >> pos;
			cout << "请输入要插入的值x:";
			cin >> Item;
			mylist.Insert_val(pos, Item);
			break;
			break;
		case 8:
			cout << "请输入要删除的位置:>";
			cin >> pos;
			mylist.Delete_pos(pos);
			break;
		case 9:
			cout << "请输入要删除的值:>";
			cin >> Item;
			mylist.Delete_val(Item);
			break;
		case 10:
			cout << "请输入要查找的值:>";
			cin >> Item;
			int pos;
			pos = mylist.Find(Item);
			break;
		case 11:
			mylist.length();
			break;
		case 12:
			mylist.clear();
			break;
		case 13:
			mylist.reverse();
			break;
		case 14:
			mylist.sort(/*0,a-1*/);
			break;
		case 0:
			exit(0);
		default:
			break;
		}
		cout << endl;
		goto flag;
	}
	return 0;
}
最后我把这些功能实现成了一个简单地界面,下边是运行结果截图:




猜你喜欢

转载自blog.csdn.net/bin_ge_love/article/details/51658084