C++实现动态顺序表
2016-03-17 22:54
531 查看
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<assert.h> typedef int DataType; class SeqList { public: SeqList() :_array(NULL ) , _size(0) , _capicity(0) {} SeqList(const SeqList & sList) :_array(new DataType [sList ._size]) , _size( sList._size) , _capicity( sList._capicity) { //memcpy(_array, sList._array, sizeof(sList._array)); memcpy(_array, sList._array, sizeof( DataType)*_size); } SeqList& operator=(const SeqList& sList) { if (&sList != this) { DataType *tmp = new DataType [sList ._size]; delete[] _array; _array = tmp; _size=sList ._size; _capicity = sList._capicity; memcpy(_array, sList._array, sizeof( DataType)*_size); } return *this ; } void CheckCapacity(); //测容 void PushBack(const DataType & x); //尾插 void PopBack(); //尾删 void PushFront(const DataType & x); //头插 void PopFront(); //头删 int Find(const DataType & x); //查找数据 void Print(); //打印顺序表 void Insert(size_t pos, const DataType& x); //插入数据 void Erase(size_t pos); //删除某位置的数据 int Remove(const DataType & x); //删除x ~SeqList() { if (_array != NULL ) { delete[] _array; _size = 0; _capicity = 0; } } private: DataType* _array; //数据块指针 size_t _size; //定义当前有效数据的个数 size_t _capicity; //容量 }; //测容,如果容量不够要进行扩容 void SeqList::CheckCapacity() { if (_size >= _capicity) { _capicity = 2 * _capicity + 5; _array = (DataType *)realloc(_array, _capicity*sizeof (DataType )); } } //打印顺序表 void SeqList::Print() { for (int i = 0; i < _size; ++i) { cout << _array[i] << " " ; } cout << endl; } //在尾部添加数据 void SeqList::PushBack(const DataType & x) { CheckCapacity(); //添加数据前要进行测容 _array[_size++] = x ; //这里注意:添加完数据意思要给size加1 } //尾删 void SeqList::PopBack() { if (_size == 0) { cout << "This SeqList is Empty !" << endl; return; } else { _array[--_size]=NULL ; } } void SeqList::PushFront(const DataType & x) //头插 { if (_size == 0) { PushBack(x ); return; } else { CheckCapacity(); int key = _size; while (key) { _array[key--] = _array[key - 1]; } _array[0] = x; _size++; } } void SeqList::PopFront() //头删 { if (_size == 0||_size==1) { PopBack(); } else { for (int i = 0; i < _size-1;i++) { _array[i] = _array[i + 1]; } --_size; } } void SeqList::Insert(size_t pos , const DataType& x) //固定位置插入数据 { assert( pos<_size); //需检验pos的合法性 CheckCapacity(); if (pos == _size - 1) //在最后一个位置插入数据等于尾插 { PushBack(x ); return; } else { for (int i = _size; i > pos; --i) { _array[i] = _array[i - 1]; } _array[pos ] = x ; _size++; } } int SeqList::Find(const DataType & x) //查找数据 { assert(_array != NULL); for (int i = 0; i < _size; i++) { if (_array[i] == x ) return i; } return -1; } void SeqList::Erase(size_t pos ) //固定位置删除数据 { assert(_array!= NULL); assert( pos < _size); if (pos == _size - 1) { PopBack(); return; } if (pos == 0) { PopFront(); return; } for (int i = pos; i < _size-1; i++) { _array[i] = _array[i + 1]; } --_size; } int SeqList::Remove(const DataType & x) //删除x { assert(_array); int pos=Find(x ); if (pos != -1) { Erase(pos); return 1; } else { return -1; } } //测试用例 //void Test1() //{ // SeqList list1; // list1.PushBack(1); // list1.PushBack(2); // list1.PushBack(3); // list1.PushBack(4); // list1.PushBack(5); // // list1.Print(); // // SeqList list2; // list2.PushBack(0); // list2.PushBack(9); // list2.PushBack(8); // list2.PushBack(7); // list2.PushBack(6); // list2.Print(); // // list1 = list2; // list1.Print(); // // SeqList list3(list1); // list3.Print(); //} void Test2() { SeqList list1; //list1.PushFront(0); //list1.Print(); list1.PushBack(1); list1.PushBack(2); list1.PushBack(3); list1.PushBack(4); list1.PushBack(5); list1.Print(); //list1.PopFront(); //list1.Print(); /*list1.Insert(2, 0); list1.Print();*/ //cout <<"该数字出现在:_array["<< list1.Find(5) <<"]"<< endl; //list1.Erase(2); int ret=list1.Remove(7); if (ret == -1) { cout << "not exit !" << endl; } else { list1.Print(); } } int main() { //Test1(); Test2(); system("pause" ); return 0; }
本文出自 “言安阳” 博客,请务必保留此出处http://iynu17.blog.51cto.com/10734157/1752354
相关文章推荐
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
- c语言经典大题
- 设计模式C++学习笔记之十三(Decorator装饰模式)
- C++第二次实验-1
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式C++学习笔记之十一(Bridge桥梁模式)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 设计模式C++学习笔记之八(Adapter适配器模式)
- 理解C++ dynamic_cast
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式C++学习笔记之四(Multition多例模式)
- C语言小编程之判断一个数是否是2的n次方的巧妙方法
- 合并排序
- 设计模式C++学习笔记之二(Proxy代理模式)
- c++异常详解
- 设计模式C++学习笔记之一(Strategy策略模式)
- C++ explicit关键字
- 关于c++运算符重载
- 友元函数、友元类总结