顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址。因此,线性表中的任何一个元素,

本文利用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()
{
//要进行边界条件检查
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;
}

删除x

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;
}
  

  

 

动态顺序表(C++实现)的更多相关文章

  1. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  2. 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...

  3. C++实现动态顺序表

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存 ...

  4. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  5. C简单实现动态顺序表

    <span style="font-size:18px;">一下为简单实现:</span> #define SIZE 3; typedef int Data ...

  6. 数据结构之动态顺序表(C实现)

    线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...

  7. C语言实现的顺序表

    顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...

  8. python中的顺序表

    Python中的list和tuple两种类型采用了顺序表的实现技术,tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现 ...

  9. python基础下的数据结构与算法之顺序表

    一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...

随机推荐

  1. spring利用ApplicationListener自启动

    近期在用mina获取server的数据,但没有和spring进行集成,就利用ApplicationListener实现了自启动 package com.gamesvr.minaenpo; import ...

  2. js 正则匹配 域名【host】

    如果直接在js中是可以直接取到hostname的,以下方式是通过正则匹配: var url = "http://www.cnblogs.com/cench" var reg = / ...

  3. poj 2762 Going from u to v or from v to u?(强连通、缩点、拓扑)

    题意:(理解错了)在一个洞穴中有多个room,要求任意选两个room:u.v,都能保证u.v之间有通路,注意洞穴中的路是有向边.. 分析:强连通子图中的点必然两两之间可以互通,两个强连通子图之间有通路 ...

  4. c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)

    測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...

  5. “-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数

    [JAVA学习]“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数 转载 2016年06月13日 19:33:38 2792 年轻代 年老代概念 htt ...

  6. jquery get ($.get) 事件用法与分析

    jquery get ($.get) 事件用法与分析 get() 方法通过远程 HTTP GET 请求载入信息.这是一个简单的 GET 请求功能以取代复杂 $.ajax .请求成功时可调用回调函数.如 ...

  7. Http协议 详解(转载)

    http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...

  8. DB2恢复一例 SQL0928N

    环境是AIX 6.1.DB2版本号9.7.0.7 首先查看db2主进程是否存在 ps -ef|grep db2sys 若不存在使用db2start打开数据库 备份介质为冷备数据源, cd 到介质所在文 ...

  9. Lumen开发:phpunit单元测试

    先来直接运行,cmd先进入根目录,然后进入tests或是test文件夹 运行命令行:..\vendor\bin\phpunit ExampleTest.php laravel/lumen中集成了PHP ...

  10. github-readme.md-格式

    大标题 大标题一般显示project名,类似html的<h1> 你仅仅要在标题以下跟上=====就可以 中标题 中标题一般显示重点项,类似html的<h2> 你仅仅要在标题以下 ...