我们先来看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; }
对于这个顺序表个人认为还存在一个问题就是,当数组已经满了时,再插入数据时,就要考虑对数组的扩展,但在这个类里面没有考虑,但在我之前博客里写过一篇动态数组的封装,在那里面对扩展进行了考虑,大家可以参考参考。。。对了,在这个类的实现用到了模板类,该类对数据的类型不受影响,大大提高了代码的复用。