c++实现顺序表

顺序表是用一组地址连续的储存单元依次储存数据元素的线性结构。顺序表适合存储用来频繁的查找的数据结构。

头文件:

#ifndef _SEQLIST_H__
#define _SEQLIST_H__

#include<iostream>
using namespace std;


typedef int DataType;

class List
{
public:
    List();
    List(int size, DataType data);
    List(const List&l);
    List& operator=(const List&l);
    ~List();
public:
    //判断内存是否达到上限
    void CheckCapacity();
    //尾插
    void PushBack(const DataType& data);
    //weishan
    void PopBack();
    //找第一个值为data的位置
    int Find(const DataType& data);
    //任意位置插入
    void Insert(int pos,const DataType data);
    //任意位置删除
    void Erase(int pos);
    //求顺序表中实际元素的个数
    int Size()const;
    //判断链表是否为空
    bool Empty()const;
    //清空链表
    void Clear();
    //把链表中有效元素的个数改变到size个
    void Resize(int  size, const DataType& data);
    //[]操作符重载
    DataType& operator[](int  index);
    const DataType& operator[](int  index)const;
    //找顺序表的头
    DataType& Front();
    const DataType& Front()const;
    //找顺序表的尾
    DataType& Back();
    const DataType& Back()const;

public:
    void display();
private:
    DataType* _data;
    int _capacity;
    int _size;
};


#endif//_SEQLIST_H__

实现函数

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"


//构造函数
List::List()
:_data(NULL)
, _capacity(0)
, _size(0)
{
    _data = new DataType[2];
    _capacity = 2;
    _size=0;
}

List::List(int size, DataType data)
{
    _data = new DataType[size + 2];
    _capacity = size + 2;
    _size = size;
    for (int i = 0; i < size; i++)
    {
        _data[i] = data;
    }
}

//拷贝构造函数
List::List(const List&l)
{
    DataType* tmp = new DataType[l._capacity];
    for (int i = 0; i < l._size; i++)
    {
        tmp[i] = l._data[i];
    }
    _data = tmp;
    _capacity = l._capacity;
    _size = l._size;
    tmp = NULL;
}

//赋值运算符重载
List& List::operator=(const List& l)
{
    if (this != &l)
    {
        DataType* tmp = new DataType[l._capacity];
        for (int i = 0; i < l._size; i++)
        {
            tmp[i] = l._data[i];
        }
        _data = tmp;
        tmp = NULL;
        _capacity = l._capacity;
        _size = l._size;
    }
    return *this;
}

//析构函数
List::~List()
{
    if (_data)
    {
        delete[] _data;
    }
}

//判断是否需要增容
 void List:: CheckCapacity()
{
     if (_capacity == _size)
     {
         DataType* tmp = new DataType[_capacity * 2];
         for (int i = 0; i < _size; i++)
         {
             tmp[i] = _data[i];
         }
         delete[]_data;
         _data = tmp;
         _capacity *= 2;
     }
}

//尾插一个元素
void List:: PushBack(const DataType& data)
{
    if (NULL == _data)
    {
        return;
    }
    CheckCapacity();
    _data[_size] = data;
    _size++;
}

void List::PopBack()
{
    if (NULL == _data)
    {
        return;
    }
    if (0 == _size)
    {
        return;
    }
    _size--;
}

//查找顺序表中值为data第一个出现的位置
int List:: Find(const DataType& data )
{
    for (int i = 0; i < _size; i++)
    {
        if (_data[i] == data)
        {
            return i;
        }
    }
    return -1;
}

//任意位置插入一个元素
void List::Insert(int pos, const DataType data)
{
    if ((_size < pos) || (pos < 0))
    {
        return;
    }
    CheckCapacity();
    for (int i = _size; i>pos; i--)
    {
        _data[_size] = _data[_size - 1];
    }
    _data[pos] = data;
    _size++;
}

//任意位置删除一个元素
void List::Erase(int pos)
{
    if ((_size < pos) || (pos < 0))
    {
        return;
    }
    for (int i = pos; i < _size - 1; i++)
    {
        _data[pos] = _data[pos + 1];
    }
    _size--;
}

//返回顺序表中有多少个有效成员
int List::Size()const
{
    return _size;
}

//判断顺序表是否为空
bool List::Empty()const
{
    return (bool)(_size);
}

//清空顺序表
void List::Clear()
{
    _size = 0;
}

//把顺序表中有效元素个数该表到size个
void List::Resize(int  size, const DataType& data)
{
    if (_size > size)
    {
        _size = size;
    }
    else
    {
        CheckCapacity();
        for (int i = _size; i < size; i++)
        {
            _data[i] = data;
        }
    }
}


//[]操作符重载
DataType& List::operator[](int index)
{
    return _data[index];
}

const DataType& List::operator[](int index)const
{
    return _data[index];
}

//找到顺序表的头
DataType&List:: Front()
{

    return _data[0];
}

const DataType& List:: Front()const
{

    return _data[0];
}

//找到顺序表的的尾部
DataType& List::Back()
{
    return _data[_size-1];
}

const DataType& List::Back()const
{
    return _data[_size - 1];
}


void List::display()
{
    for (int i = 0; i < _size; i++)
    {
        cout << _data[i]<<"->";
    }
    cout<<"NULL"<<endl;
    cout << "capacity" << "=" << _capacity << endl;
    cout<<"size" << "="<<_size << endl;
}

测试函数

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"


void test1()
{
    List l1(3, 4);
    List l2(l1);
    l1.PushBack(1);
    l1.PushBack(2);
    l1.PushBack(3);
    l1.PushBack(4);
    l1.PushBack(5);
    l1.PopBack();
    l1.PopBack();
    l1.display();
    l1.List::Insert(3, 0);
    l1.display();
}

int main()
{

    test1();
    system("pause");
    return 0;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值