码迷,mamicode.com
首页 > 编程语言 > 详细

【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

时间:2015-05-18 23:11:29      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:数据结构   顺序表      c++   操作   

//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
//头文件
#pragma once
#include <iostream>
using namespace std;

template<class Type>
class SeqList
{
public:
	SeqList(size_t sz = INIT_SIZE);
	~SeqList();
public:
	bool isfull() const
	{return size >= capacity; }
	bool isempty() const
	{return (size == 0); }
public:
	void show_list();
	void push_front(const Type &x);
	void push_back(const Type &x);
	void insert_pos(int pos,const Type &x);
	int find(const Type &key);
	void pop_front();
	void pop_back();
	void sort();
	void insert_val(const Type &x);
	void delete_pos(int pos);
	void delete_val(const Type &x);
	int length();
	void clear();
	void destory();
	void reverse();
	void quit_system(int &a);
private:
	enum{ INIT_SIZE = 8 };
	Type *base;
	size_t capacity;
	size_t size;
};

 
template<class Type>                        //构造函数
SeqList<Type>::SeqList(size_t sz)
{
	capacity = sz > INIT_SIZE ? sz : INIT_SIZE;
	base = new Type[capacity];
	size = 0;
}

template<class Type>                        //析构函数
SeqList<Type>::~SeqList()
{
	delete base;
}

template<class Type>                        //显示
void SeqList<Type>::show_list()
{
	if (size == 0)
	{
		cout << "数据表为空。" << endl;
		return;
	}
	for (int i = 0; i<size; ++i)
	{
		cout << base[i] << " ";
	}
	cout << endl;
}
 
template<class Type>                         //头插
void SeqList<Type>::push_front(const Type &x)
{
	if (isfull())
	{
		cout << "顺序表已满,不能插入." << endl;
		return;
	}
	for (int i = size; i > 0; --i)
	{
		base[i] = base[i - 1];
	}
	base[0] = x;
	size++;
}

template<class Type>                        //尾插
void SeqList<Type>::push_back(const Type &x)
{
	if (isfull())
	{
		cout << "顺序表已满,不能插入." << endl;
		return;
	}
	base[size] = x;
	size++;
}

template<class Type>						//按位置插
void SeqList<Type>::insert_pos(int pos, const Type &x)
{
	if (pos<0 || pos>size)
	{
		cout << "插入的位置不正确。" << endl;
		return;
	}
	if ( isfull() )
	{
		cout << "顺序表已满,不能插入." << endl;
		return;
	}
	for (int i = size; i > pos; --i)
	{
		base[i] = base[i - 1];
	}
	base[pos] = x;
	size++;
}

template<class Type>						//查找
int SeqList<Type>::find(const Type &key)
{
	for (int i = 0; i<size; ++i)
	{
		if (base[i] == key)
			return i;
	}
	return -1;
}


template<class Type>						//头删
void SeqList<Type>::pop_front()
{
	if (isempty())
	{
		cout << "顺序表为空,不能删除。" << endl;
		return;
	}
	for (int i = 0; i < size; ++i)
	{
		base[i] = base[i + 1];
	}
	size--;
}

template<class Type>
void SeqList<Type>::pop_back()				//尾删
{
	if (isempty())
	{
		cout << "顺序表为空,不能删除。" << endl;
		return;
	}
	size--;
}

template<class Type>						//排序
void SeqList<Type>::sort()
{
	if (isempty())
	{
		return;
	}
	for (int i = 1; i < size; i++)
	{
		for (int j = 0; j < size - i; j++)
		{
			int temp;
			if (base[j]>base[j + 1])
			{
				temp = base[j];
				base[j] = base[j + 1];
				base[j + 1] = temp;
			}
		}
	}
}

template<class Type>						//按值插入
void SeqList<Type>::insert_val(const Type &x)
{
	push_back(x);  //尾插
	sort();   //排序
}

template<class Type>						//按位置删除
void SeqList<Type>::delete_pos(int pos)
{
	if (isempty())
	{
		cout << "顺序表为空,不能删除。" << endl;
		return;
	}
	if (pos < 0 || pos >= size)
	{
		cout << "删除的位置不正确。" << endl;
		return;
	}
	for (int i = pos; i < size; ++i)
	{
		base[i] = base[i + 1];
	}
	size--;
}

template<class Type>						//按值删除
void SeqList<Type>::delete_val(const Type &x)
{
	if (isempty())
	{
		cout << "顺序表为空,不能删除。" << endl;
		return;
	}
	int pos=find(x);  
	if (pos == -1)
	{
		cout << "未找到该数。" << endl;
		return;
	}
	delete_pos(pos);
}

template<class Type>						//求长度
int SeqList<Type>::length()
{
	return size;
}

template<class Type>						//清除表
void SeqList<Type>::clear()
{
	size = 0;
}

template<class Type>						//摧毁表
void SeqList<Type>::destory()
{
	base = NULL;
}


template<class Type>						//逆序
void SeqList<Type>::reverse()
{
	for (int i = 0,j = size - 1; i < size / 2; i++, j--)
	{
		int temp = base[i];
		base[i] = base[j];
		base[j] = temp;
	}
}

template<class Type>						//退出
void SeqList<Type>::quit_system(int &a)
{
	a = 0;
}



//主函数
#include"SeqList.h"

void main()
{
	SeqList<int> mylist;
	int select = 1;
	int Item;
	int pos;
	while (select)
	{
		cout << "************************************************************************" << endl;
		cout << "*      [1] show_list                         [2] quit_system           *" << endl;
		cout << "*      [3] push_front                        [4] push_back             *" << endl;
		cout << "*      [5] pop_front                         [6] pop_back              *" << endl;
		cout << "*      [7] insert_pos                        [8] insert_val            *" << endl;
		cout << "*      [9] delete_pos                        [10] delete_val           *" << endl;
		cout << "*      [11] find                             [12] length               *" << endl;
		cout << "*      [13] clear                            [14] destory              *" << endl;
		cout << "*      [15] reverse(逆序)                    [16] sort(顺序)           *" << endl;
		cout << "************************************************************************" << endl;
		cout << "请选择功能:";
		cin >> select;
		switch (select)
		{
		case 1:
			mylist.show_list();
			break;
		case 2:
			mylist.quit_system(select);
			break;
		case 3:
			cout << "请输入您要插入的数(以-1结束):";
			while (cin >> Item, Item != -1)
			{
				mylist.push_front(Item);
			}
			break;
		case 4:
			cout << "请输入您要插入的数(以-1结束):";
			while (cin >> Item, Item !=-1)
			{
				mylist.push_back(Item);
			}
			break;
		case 5:
			mylist.pop_front();
			break;
		case 6:
			mylist.pop_back();
			break;
		case 7:
			cout << "请输入您要插入的位置:";
			cin >> pos;
			cout << "请输入您要插入的值:";
			cin >> Item;
			mylist.insert_pos(pos, Item);
			break;
		case 8:
			cout << "请输入要插入的数:";
			cin >> Item;
			mylist.insert_val(Item);
			break;
		case 9:
			cout << "请输入要删的位置:";
		    cin >> pos;
			mylist.delete_pos(pos);
			break;
		case 10:
			cout << "请输入要删的值:";
			cin >> Item;
			mylist.delete_val(Item);
			break;
		case 11:
			cout << "请输入要查找的数:";
			cin >> Item;
			pos = mylist.find(Item);
			if (pos != -1)
			{
				cout << "该数为第" << pos << "个数" << endl;
			}
			cout << "未找到该数。"<<endl;
			break;
		case 12:
			cout <<"该顺序表长度为:"<< mylist.length() << endl;
			break;
		case 13:
			mylist.clear();
			break;
		case 14:
			mylist.destory();
			break;
		case 15:
			mylist.reverse();
			break;
		case 16:
			mylist.sort();
			break;
		default:
			break;
		}

	}
}
<img src="http://img.blog.csdn.net/20150518182849875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG91ZG91d2ExMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

标签:数据结构   顺序表      c++   操作   

原文地址:http://blog.csdn.net/doudouwa1234/article/details/45825549

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!