Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 动态顺序表(C++实现)

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址。因此,线性表中的任何一个元素,本文利用C++语言,在Windows平台 Visual Studio 2013开发环境下实现1:动态增容 2:打印单链表 3:尾插 4:尾删 5:头插 6:头删 7:查找数据 8:在某位置后插入数据 9:删除某位置的数据 10:找到并删除x****************************************************************************************************//*功能:应用C++语言实现顺序表的各项操作基本的成员函数:构造函数、拷贝构造函数、赋值运算符的重载、析构函数               **                  1:动态增容          **                  2:打印单链表             **                  3:尾插          **                  4:尾删          **                  5:头插                **                  6:头删             **                  7:查找数据            **                  8:在某位置后插入数据            **                  9:删除某位置的数据          **               10:删除x             **          **                              By :Lynn-Zhang          **                                                                                                                                                                                                   *//*****************************************************************************************************/#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>using namespace std;#include <assert.h> typedef int DataType; class SeqList{public:    SeqList(); //构造函数    SeqList(const SeqList & sList); //拷贝构造    SeqList& operator=(const SeqList& sList);  //赋值运算符重载    ~SeqList(); //析构函数     void CheckCapacity();    // 测容/扩容    void Print();                    // 打印顺序表    void PushBack(const DataType & x);  // 尾插    void PopBack();                                 // 尾删    void PushFront(const DataType & x); // 头插    void PopFront();                                    // 头删           int Find(const DataType & x);                //查找数据    void Insert(size_t pos, const DataType & x); //固定位置插入数据    void Erase(size_t pos);                                    //删除某位置的数据    int Remove(const DataType & x);                 //删除数据x private:    DataType* _array;      //数据块指针    size_t _size;           //定义当前有效数据的个数    size_t _capicity;       //容量 };
基本的成员函数SeqList::SeqList()    :_array(NULL)    , _size(0)    , _capicity(0){} SeqList::SeqList(const SeqList & sList)    :_array(new DataType[sList._size])    , _size(sList._size)    , _capicity(sList._capicity){    memcpy(_array, sList._array, sizeof(DataType)*_size);} SeqList& 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;} SeqList::~SeqList(){    if (_array != NULL)    {        delete[] _array;        _size = 0;        _capicity = 0;    }}测容,如果容量不够要进行扩容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(){<br>         //要进行边界条件检查         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;}
删除xint  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://www.linuxidc.com/Linux/2016-04/130280.htm