C++数据结构 顺序表的实现(模板类的实现)

利用模板类实现顺序表的操作

实现的功能: 

1.尾插,2.头插,3.显示,4.尾删,5.头删,6.按位置,7.插按值插,8.按位置删,9.按值删,10.按值查,11.求表长,12.清除数据,13.摧毁该顺序表,14.反转,15.排序(冒泡排序,快速排序)。

头文件源代码:

#pragma once        // 防止重复编译

#include<iostream>
using namespace std;

template<class Type>
class SeqList
{
public:
	SeqList(size_t sz=INIT_SIZE);
public:
	bool isfull()const
	{return size>=capacity;}
	bool isempty()const
	{return size==0;}
public:
	void push_back(const Type &x);   //尾插
	void push_front(const Type &x);  //头插
	void show_list();                //显示
	void pop_back();                 //尾删
	void pop_front();                //头删
	void insert_pos(int pos,const Type &x);//按位置插
	void insert_val(const Type &x);        //按值插
	void delete_pos(int pos);              //按位置删
	void delete_val(const Type &x);        //按值删
	int  find(const Type &key);            //按值查
	int  length()const;                    //求表长
	void clear();                          //清除数据
	void destroy();                        //摧毁该顺序表
	void reserv();                         //反转
	void sort(/*int low,int high*/);       //排序
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>
void SeqList<Type>::push_back(const Type &x)
{
	if(isfull())
	{
		cout<<"顺序表已满,不能插入!"<<endl;
		return;
	}
	base[size++] = x;
}

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>::show_list()
{
	for(int i=0; i<size; ++i)
	{
		cout<<base[i]<<" ";
	}
	cout<<endl;
}

template<class Type>
void SeqList<Type>::pop_back()
{
    if(isempty())
    {
        cout<<"顺序表已满"<<endl;
        return;
    }
    size = size-1;
}

template<class Type>
void SeqList<Type>::pop_front()
{
    int i;
    for(i = 0;i<size-1;i++)
    {
        base[i]=base[i+1];
    }
    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>
void SeqList<Type>::insert_val(const Type &x)
{
    int pos;
    pos = find(x);
    insert_pos(pos,x);
}

template<class Type>
void SeqList<Type>::delete_pos(int pos)
{
    int i;
    for(i = pos;i<size-1;++i)
    {
        base[i] = base[i+1];
    }
    size--;
}

template<class Type>
void SeqList<Type>::delete_val(const Type &x)
{
	int pos = find(x);
	if(pos == -1)
	{
		return;
	}

	for(int i=pos; i<size; ++i)
	{
		base[i] = base[i+1];
	}
	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>
int SeqList<Type>::length()const
{
    cout<<"表长是:"<<size<<endl;
    return size;
}

template<class Type>
void SeqList<Type>::clear()
{
    while(size)
    {
        base[size--] = NULL;
    }
}

template<class Type>
void SeqList<Type>::destroy()
{
    int i;
    delete base;
    base = NULL;
    capacity = 0;
    size = 0;
}

template<class Type>
void SeqList<Type>::reserv()
{
    int i = 0;
    int m = size - 1;
    for(;i<=((size-1)/2);++i)
        {
            int tmp = base[i];
            base[i] = base[m];
            base[m] = tmp;
            m--;
        }
}

template<class Type>
void SeqList<Type>::sort()//排序
{


	for (int i=0;i<=size;i++)
		for (int j=i+1;j<=size-1;j++)
		{
			if(base[i]>base[j])
			{
				int tmp = base[j];
				base[j]=base[i];
				base[i]=tmp;
			}
		}
}
/*
template<class Type>     ///快速排序
void SeqList<Type>::sort(int low,int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = base[first];             //用字表的第一个记录作为枢轴
    while(first < last)
    {
        while(first < last && base[last] >= key)
        {
            last--;
        }
        base[first] = base[last];//将比第一个小的移到低端
        while(first < last && base[first] <= key)
        {
            first++;
        }
            base[last] = base[first];//将比第一个大的移到高端
    }
            base[first] = key;//枢轴记录到位
            sort(low, first-1);
            sort(first+1, high);
}
*/


主函数:

#include"SeqList.h"

int main()
{
	SeqList<int> mylist;
	int select = 1;
	int Item;
	int pos;
	while(select)
	{
		cout<<"**************************************"<<endl;
		cout<<"* [1] push_back       [2] push_front *"<<endl;
		cout<<"* [3] show_list       [0] quit_system*"<<endl;
		cout<<"* [4] pop_back        [5] pop_front  *"<<endl;
		cout<<"* [6] insert_pos      [7] insert_val *"<<endl;
		cout<<"* [8] delete_pos      [9] delete_val *"<<endl;
		cout<<"* [10] find           [11]length     *"<<endl;
		cout<<"* [12] clear          [13]destroy    *"<<endl;
		cout<<"* [14] reserv         [15]sort       *"<<endl;
		cout<<"**************************************"<<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();
            break;
        case 5:
            mylist.pop_front();
            break;
		case 6:
			cout<<"请输入要插入的位置:>";
			cin>>pos;
			cout<<"请输入要插入的值:>";
			cin>>Item;
			mylist.insert_pos(pos,Item);
			break;
        case 7:
            cout<<"请输入要插入的值:>";
            cin>>Item;
            mylist.insert_val(Item);
        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.destroy();
            break;
        case 14:
            mylist.reserv();
            break;
        case 15:
            //int a;
           //a = mylist.length();
            mylist.sort(/*0,a-1*/);
            break;
		default:
			break;
		}
	}
}



  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值