- //顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- //头文件
- #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;
- }
- }
- }