【c++版数据结构】之顺序表的实现

SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
using namespace std;

typedef enum{TRUE,FALSE}Status;
template<class Type>
class SeqList
{
private:
	enum{DefaultSize = 10};  //顺序表的默认长度
	Type *base;              //存放元素数组的首地址
	int capacity;            //顺序表的容量
	int size;                //顺序表实际存放元素的个数
private://为内部函数所调用,不希望在类外訪问
	bool IsFull()
	{
		if (size == capacity)
			return true;
		else
			return false;
	}
	bool IsEmpty()
	{
		if (size == 0)
			return true;
		else
			return false;
	}
	Status destory()
	{
		if (base == NULL)
			return FALSE;
		delete[] base;
		base = NULL;
		capacity = size = 0;
		return TRUE;
	}
public:
	SeqList(int sz = DefaultSize)
	{
		capacity = sz > capacity ? sz : capacity;
		base = new Type[capacity];
		size = 0;
	}
	~SeqList()
	{
		destory();
	}
	Status push_back(const Type &x)
	{
		if (IsFull())
		{
			cout << "空间已满" << x << "不能插入" << endl;
			return FALSE;
		}
		base[size++] = x;
		return TRUE;	
	}
	Status push_front(const Type &x)
	{
		if (IsFull())
		{
			cout << "空间已满" << x << "不能插入" << endl;
			return FALSE;
		}
		for (int i = size - 1; i >= 0; --i)  //------------------>从最后一个元素到第一个元素依次往后移动一个位置
			base[i+ 1] = base[i];
		base[0] = x;
		size++;
		return FALSE;
	}
	void show_list()
	{
		for (int i = 0; i < size; ++i)
			cout << base[i] << " ";
		cout << endl;
	}
	Status pop_back(Type &x)//将删除的元素存放在x中,以备不时之需
	{
		if (IsEmpty())
		{
		
			cout << "空间已空,不能删除" << endl;
			return FALSE;
		}
		x = base[--size];
		return TRUE;
	}
	Status pop_front(Type &x)
	{
		if (IsEmpty())
		{
			cout << "空间已空。不能删除" << endl;
			return FALSE;
		}
		x = base[0];//将删除的元素保存在x中,以备不时之需
		for (int i = 1; i <= size - 1; ++i)    //--------------->从第二个元素到最后一个元素,依次覆盖前一个元素
			base[i - 1] = base[i];
		size--;
		return TRUE;
	}
	Status insert_pos(int pos,const Type &x)
	{
		if (pos < 0 || pos >= size)
		{
			cout << "插入位置无效" << endl;
			return FALSE;
		}
		if (IsFull())
		{
			cout << "空间已满" << x << "不能插入" << endl;
			return FALSE;
		}
		for (int i = size - 1; i >= pos; --i)//--------------->从最后一个元素到所插入的位置的元素依次往后移动一个位置,为所要插入的元素留出位置
			base[i + 1] = base[i];
		base[pos] = x;
		size++;
		return TRUE;
	}
	Status delete_pos(int pos,Type &x)
	{
		if (pos < 0 || pos >= size)
		{
			cout << "删除位置无效" << endl;
			return FALSE;
		}
		if (IsEmpty())
		{
			cout << "空间已空,不能删除" << endl;
			return FALSE;
		}
		x = base[pos];
		for (int i = pos + 1; i < size; ++i)//从删除位置后面的第一个元素開始依次覆盖前一个元素
			base[i - 1] = base[i];
		size--;
		return TRUE;
	}
	int find(const Type &x)
	{
		for (int i = 0; i < size; ++i)
		{
			if (base[i] == x)
				return i;
		}
		return -1;
	}
	void sort()//冒泡排序
	{
		for (int i = 0; i < size - 1; ++i)//排序size-1次
		{
			for (int j = 0; j < size - 1 - i; ++j)
			{
				if (base[j] > base[j + 1])
				{
					Type tmp = base[j];
					base[j] = base[j + 1];
					base[j + 1] = tmp;
				}
			}
		}
		
	}
	void reserve()//左右对称位置交换
	{
		int left = 0;
		int right = size - 1;
		while (left < right)
		{
			Type tmp = base[left];
			base[left] = base[right];
			base[right] = tmp;
			left++;
			right--;
		}
	}
	Status insert_val(const Type &x)
	{
		if (IsFull())
		{
			cout << "空间已满" << x << "不能按值插入" << endl;
			return FALSE;
		}
		sort();
		for (int i = 0; i < size; ++i)
		{
			if (base[i] > x)//存在比所要插入元素大的元素,在该位置插入它
			{
				insert_pos(i, x);
				return TRUE;
			}
		}
		base[size++] = x;//不存在比所要插入元素大的元素,在最后位置插入它
		return TRUE;
	}
	/*
	Status insert_val(const Type &x)//用while取代for
	{
		if (IsFull())
		{
			cout << "空间已满" << x << "不能按值插入" << endl;
			return FALSE;
		}
		sort();
		int i = 0;
		while(i<size && x > base[i])
		{
			i++;
		}
		insert_pos(i,x);
		return TRUE;
	}
	*/
	Status delete_val(const Type &x)
	{
		int n = find(x);
		if (n == -1)
		{
			cout <<x<< "不存在,无法删除" << endl;
			return FALSE;
		}
		Type item;
		delete_pos(n, item);
		return TRUE;
	}
	void clear()
	{
		size = 0;
	}
};
#endif
main.cpp

#include"SeqList.h"

int main()
{
	SeqList<int> mylist;
	int item;
	int n;
	int select = 1;
	while (select)
	{
		cout << "*************************************** *" << endl;
		cout << "*[1] push_back           [2] push_front *" << endl;
		cout << "*[3] show_list           [4] pop_back   *" << endl;
		cout << "*[5] pop_front           [6] insert_val *" << endl;
		cout << "*[7] insert_pos          [8] find       *" << endl;
		cout << "*[9] delete_pos          [10] delete_val*" << endl;
		cout << "*[11] sort               [12] reserve   *" << endl;
		cout << "*[13] destory            [14] clear     *" << endl;
		cout << "*[0] quit_system         [0] quit_system*" << endl;
		cout << "请选择:>";
		cin >> select;
		switch (select)
		{
		case 1:
			cout << "请输入要插入的元素(-1结束):>";
			while (cin >> item, item != -1)
			{
				mylist.push_back(item);
			}
			break;
		case 2:
			cout << "请输入要插入的元素(-1结束):>";
			while (cin >> item, item != -1)
			{
				mylist.push_front(item);
			}
			break;
		case 3:
			mylist.show_list();
			break;
		case 4:
			mylist.pop_back(item);
			break;
		case 5:
			mylist.pop_front(item);
			break;
		case 6:
			cout << "请输入要插入的元素:";
			cin >> item;
			mylist.insert_val(item);
			break;
		case 7:
			cout << "请输入要插入的位置:";
			cin >> n;
			cout << "请输入要插入的元素:";
			cin >> item;
			mylist.insert_pos(n,item);
			break;
		case 8:
			cout << "请输入要查找的元素:";
			cin >> item;
			cout << mylist.find(item) << endl;
			break;
		case 9:
			cout << "请输入要删除的位置:";
			cin >> n;
			mylist.delete_pos(n,item);
			break;
		case 10:
			cout << "请输入要删除的元素:";
			cin >> item;
			mylist.delete_val(item);
			break;
		case 11:
			mylist.sort();
			break;
		case 12:
			mylist.reserve();
			break;
		case 14:
			mylist.clear();
			break;
		default:
			break;
		}
	}
	system("pause"); 
	return 0;
}




原文地址:https://www.cnblogs.com/yutingliuyl/p/7086807.html