顺序表也就是我们常说的数组,今天就是把对于数组 的各种操作封装成类,下面就来看具体的实现:
给出一些执行结果:
我们先来看test.h的内容:
#ifndef _TEST_H_
#define _TEST_H
#include <iostream>
#include <strings.h>
#include <stdlib.h>
using namespace std;
template<typename Type>
class SeqList{
public:
SeqList(int sz = DEFAULT_SIZE);
~SeqList();
public:
bool IsFull()const
{
return size>=capacity;
}
bool IsEmpty()const
{
return size == 0;
}
void push_back(const Type &x);
void push_front(const Type &x);
void pop_back();
void pop_front();
void insert_pos(const Type &x,const Type &t);
void insert_value(const Type &x);
void delete_pos(const Type &x);
void delete_value(const Type &x);
int find_pos(const Type &x);
bool find_value(const Type &x);
void quick_sort(int left,int right);
int get_length();
void resver_seqlist();
void clear_seqlist();
void quit_system();
void remove_all(const Type &t);
void destory();
void show_seqlist()const;
private:
enum{DEFAULT_SIZE = 8};
Type *base;
int capacity;
int size;
};
template<typename Type>
SeqList<Type>::SeqList(int sz)
{
capacity = sz > DEFAULT_SIZE ? sz : DEFAULT_SIZE;
base = new Type[capacity];
size = 0;
}
template<typename Type>
SeqList<Type>::~SeqList()
{
delete []base;
base = NULL;
capacity = size = 0;
}
template<typename Type>
void SeqList<Type>::push_back(const Type &x)
{
if(!IsFull()){
base[size++] = x;
}
}
template<typename Type>
void SeqList<Type>::show_seqlist()const
{
for(int i = 0;i < size;i++){
cout<<base[i]<<" ";
}
cout<<endl;
}
template<typename Type>
void SeqList<Type>::push_front(const Type &x)
{
if(!IsFull()){
for(int i = size - 1;i >= 0;i--){
base[i + 1] = base[i];
}
base[0] = x;
size++;
}
}
template<typename Type>
void SeqList<Type>::pop_front()
{
if(!IsEmpty()){
for(int i = 0;i < size;i++){
base[i] = base[i + 1];
}
size--;
}
}
template<typename Type>
void SeqList<Type>::pop_back()
{
if(!IsEmpty()){
size--;
}
}
template<typename Type>
void SeqList<Type>::insert_pos(const Type &x,const Type &t)
{
if(x < 0 || x >= size){
return ;
}
if(!IsFull()){
for(int i = size - 1;i>=x;i--){
base[i+1] = base[i];
}
base[x] = t;
size++;
}
}
template<typename Type>
void SeqList<Type>::insert_value(const Type &x)
{
int i ;
if(!IsFull()){
for(i = size - 1;i >=0 && x < base[i];i--)
{
base[i +1] = base[i];
}
if(i < 0){
base[0] = x;
}else{
base[i+1] = x;
}
size++;
}
}
template<typename Type>
void SeqList<Type>::delete_pos(const Type &x)
{
if(x < 0 || x >= size){
return;
}
if(!IsEmpty()){
for(int i = x;i < size;i++){
base[i] = base[i + 1];
}
size--;
}
}
template<typename Type>
bool SeqList<Type>::find_value(const Type &x)
{
int i;
for(i = 0; i < size && base[i] != x;i++);
if(i == size){
return false;
}else{
return true;
}
}
template<typename Type>
int SeqList<Type>::find_pos(const Type &x)
{
int i;
for(i = 0;i < size && base[i] != x;i++);
if(i == size){
return -1;
}else{
return i;
}
}
template<typename Type>
void SeqList<Type>::delete_value(const Type &x)
{
int index;
if(!find_value(x)){
return;
}
index = find_pos(x);
if(index == -1){
return ;
}
for(int i = index;i < size;i++){
base[i] = base[i + 1];
}
size--;
}
template<typename Type>
void SeqList<Type>::quick_sort(int left,int right)
{
int i = left;
int j = right;
Type value = base[left];
if(left < right)
{
while(i < j){
for(;j > i && base[j] > value;j--);
if(j > i){
base[i++] = base[j];
}
for(;i < j && base[i] < value;i++);
if(i < j){
base[j--] = base[i];
}
}
base[i] = value;
quick_sort(i + 1,right);
quick_sort(left,i - 1);
}
}
template<typename Type>
void SeqList<Type>::resver_seqlist()
{
for(int i = 0,j = size - 1;i < size && i < j;i++,j--)
{
Type tmp;
tmp = base[i];
base[i] = base[j];
base[j] = tmp;
}
}
template<typename Type>
int SeqList<Type>::get_length()
{
return size;
}
template<typename Type>
void SeqList<Type>::clear_seqlist()
{
bzero(base,sizeof(Type) * size);
size = 0;
}
template<typename Type>
void SeqList<Type>::quit_system()
{
exit(0);
}
template<typename Type>
void SeqList<Type>::remove_all(const Type &t)
{
int index = find_pos(t);
if(index == -1){
return;
}
for(int i = index;i < size;){
if(base[i] == t){
for(int j = i;j < size;j++){
base[j] = base[j+1];
}
size--;
}else{
i++;
}
}
}
template<typename Type>
void SeqList<Type>::destory()
{
delete []base;
}
#endif
下来来看main函数的实现:
#include"test.h"
int main()
{
SeqList<int> mylist;
int select = 1;
int Item;
int index;
while(select)
{
cout<<"*****************************************************"<<endl;
cout<<"* [1] push_back(-1结束) [2] push_fornt(-1结束) *"<<endl;
cout<<"* [3] show_seqlist [0] quit system *"<<endl;
cout<<"* [4] pop_back [5] pop_fornt *"<<endl;
cout<<"* [6] insert_pos [7] insert_value *"<<endl;
cout<<"* [8] delete_pos [9] delete_value *"<<endl;
cout<<"* [10] find_pos [11] find_value *"<<endl;
cout<<"* [12] sort [13] resver *"<<endl;
cout<<"* [14] clear [15] length *"<<endl;
cout<<"* [16] remove_all &[17] destroy *"<<endl;
cout<<"*****************************************************"<<endl;
cout<<"请选择:>";
cin>>select;
switch(select)
{
case 0:
mylist.quit_system();
break;
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_seqlist();
break;
case 4:
cout<<"头删:";
mylist.pop_front();
break;
case 5:
cout<<"尾删:";
mylist.pop_back();
break;
case 6:
cout<<"请输入要插入的位置和值:";
cin>>index;
cin>>Item;
mylist.insert_pos(index,Item);
break;
case 7:
cout<<"请输入要插入的值:";
cin>>Item;
mylist.insert_value(Item);
break;
case 8:
cout<<"删除指定位置的值:";
cin>>index;
mylist.delete_pos(index);
break;
case 9:
cout<<"删除值:";
cin>>Item;
mylist.delete_value(Item);
break;
case 10:
cout<<"查找指定位置的值:";
cin>>Item;
cout<<mylist.find_pos(Item)<<endl;
break;
case 11:
cout<<"查找指定的值:";
cin>>Item;
if(mylist.find_value(Item)){
cout<<"find!!"<<endl;
}else{
cout<<"not find !!"<<endl;
}
break;
case 12:
cout<<"排序:\n";
mylist.quick_sort(0,mylist.get_length() - 1);
break;
case 13:
cout<<"逆置:\n";
mylist.resver_seqlist();
break;
case 14:
cout<<"清空:\n";
mylist.clear_seqlist();
break;
case 15:
cout<<"得到长度:";
cout<<mylist.get_length()<<endl;
break;
case 16:
cout<<"输入要删除的值:\n";
cin>>Item;
mylist.remove_all(Item);
break;
case 17:
cout<<"销毁顺序表:\n";
mylist.destory();
break;
default: exit(1);
}
}
return 0;
}
给出一些执行结果:
对于这个顺序表个人认为还存在一个问题就是,当数组已经满了时,再插入数据时,就要考虑对数组的扩展,但在这个类里面没有考虑,但在我之前博客里写过一篇动态数组的封装,在那里面对扩展进行了考虑,大家可以参考参考。。。对了,在这个类的实现用到了模板类,该类对数据的类型不受影响,大大提高了代码的复用。