您的位置:首页 > 编程语言 > C语言/C++

C++实现动态顺序表(类和对象)

2016-08-21 15:21 176 查看
        在我之前写的博客里,写过用C语言实现顺序表的博客(你们可以去看看哟),最近重新复习了C++,决定用C++重新实现一遍顺序表咦巩固我的基础。这里我用的是类来实现顺序表,下面是我代码的实现,简单易懂:

"test.cpp"

<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include "SeqList.h"

void Test1()
{
SeqList seq;
for (int i = 0;i < 5;i++)
{
seq.PushBack(i);
}
cout<<seq<<endl;
cout<<seq.Capacity()<<endl;

seq.PushFront(5);
seq.PushFront(6);
cout<<seq<<endl;
cout<<seq.Capacity()<<endl;

seq.PopBack();
seq.PopBack();
seq.PopBack();
cout<<seq<<endl;

seq.PopFront();
seq.PopFront();
cout<<seq<<endl;
}
void Test2()
{
SeqList seq;
for (int i = 0;i < 5;i++)
{
seq.PushBack(i);
}
cout<<seq<<endl;
cout<<seq.Find(5)<<endl;
seq.Insert(seq.Find(2),10);
cout<<seq<<endl;

seq.Remove(seq.Find(3));
cout<<seq<<endl;
cout<<seq.Size()<<endl;
seq.Remove(seq.Find(10));
cout<<seq<<endl;
cout<<seq.Size()<<endl;
}
void Test3()
{
SeqList seq;
for (int i = 0;i < 5;i++)
{
seq.PushBack(i);
}
cout<<seq<<endl;

seq.Insert(seq.Find(2),10);
seq.Insert(seq.Find(0),10);
seq.Insert(seq.Find(4),10);
cout<<seq<<endl;
seq.RemoveAll(seq.FindData(10));
cout<<seq<<endl;

SeqList seq2;
for (int i = 6;i >0;i--)
{
seq2.PushBack(i);
}
seq2.Sort(seq2);
cout<<seq2<<endl;
}
int main()
{
//Test1();
//Test2();
Test3();
system("pause");
return 0;
}</span></strong>


"SeqList.h"

<strong><span style="font-size:18px;">#pragma once
#include <assert.h>
typedef int DataType;
class SeqList
{
friend ostream& operator<<(ostream& os,SeqList seq);
public:
SeqList()
:_size(0)
,_capacity(0)
,_data(NULL)
{}
~SeqList()
{
if (_data)
{
delete[] _data;
_data = NULL;
}
_size = 0;
_capacity = 0;
}
//拷贝构造
SeqList(const SeqList& seq)
{
_data = new DataType[seq._capacity];
//内存拷贝
memcpy(_data,seq._data,sizeof(DataType)*seq._size);
_size = seq._size;
_capacity = seq._capacity;
}
public:
bool Empty()
{
return _size==0;
}
size_t Size()
{
return _size;
}
size_t Capacity()
{
return _capacity;
}
void PushBack(const DataType& data)
{
CheckCapacity();
_data[_size++] = data;
}
void PushFront(const DataType& data)
{
CheckCapacity();
for (int i = _size;i > 0;i--)
{
_data[i] = _data[i-1];
}
_data[0] = data;
_size++;
}
void PopBack()
{
if (Empty())
{
return;
}
else
{
_size--;
}
}
void PopFront()
{
for (int i = 1;i < _size;i++)
{
_data[i-1] = _data[i];
}
_size--;
}
int Find(const DataType& data)
{
for (int i = 0;i < _size;i++)
{
if (_data[i] == data)
{
//如果找到了,返回当前位置的下标
return i;
}
}
return -1;
}
DataType FindData(const DataType& data)
{
for (int i = 0;i < _size;i++)
{
if (_data[i] == data)
{
//如果找到了,返回当前位置的下标
return _data[i];
}
}
return NULL;
}
//找到某一个位置,在这个位置后面插入数据
void Insert(int pos,const DataType& data)
{
assert(pos != -1);
CheckCapacity();
for (int i = _size;i > pos;i--)
{
_data[i] = _data[i-1];
}
_data[pos+1] = data;
_size++;
}
//找到要删除的位置,删除该位置上的数据
void Remove(int pos)
{
if (_size != 0)
{
assert(pos != -1);
for (int i = pos;i < _size-1;i++)
{
_data[i] = _data[i+1];
}
_size--;
}
}
void RemoveAll(const DataType& data)
{
if (_size != 0)
{
int i = 0;
while (i < _size)
{
if (_data[i] == data)
{
for (int j = i;j < _size-1;j++)
{
_data[j] = _data[j+1];
}
_size--;
}
else
{
i++;
}
}
}
}
void Sort(SeqList seq)
{
int i = 0;
int j = 0;
for (i = 0;i < _size-1;i++)
{
for (j = i;j < _size-1-i;j++)
{
if (seq._data[j] > seq._data[j+1])
{
swap(seq._data[j],seq._data[j+1]);
}
}
}
}
private:
void CheckCapacity()
{
if (_size >= _capacity)
{
int newcapacity = 2*_capacity+5;
DataType* tmp = new DataType[newcapacity];
memcpy(tmp,_data,sizeof(DataType)*_size);
delete[] _data;
_data = tmp;
_capacity = newcapacity;
}
}
private:
int _size;
int _capacity;
DataType* _data;
};

//重载输出运算符
ostream& operator<<(ostream& os,SeqList seq)
{
for (int i = 0;i < seq._size;i++)
{
os<<seq._data[i]<<" ";
}
return os;
}</span></strong>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息