一,顺序表的作用
线性结构的基本特征为:
1.集合中必存在唯一的一个“第一元素”
2.集合中必存在唯一的一个 “最后元素”
3.除最后一个元素之外,均有 唯一的后继(后件)
4.除第一个元素之外,均有 唯一的前驱(前件) 由n(n≥0)个数据元素(结点)a1,a2,…,an组成的有限序列。数据元素的个数n定义为表的长度。当n=0时称为空表。常常将非空的线性表(n>0)记作:(a1,a2,…an) 数据元素ai(1≤i≤n)只是一个抽象的符号,其具体含义在不同的情况下可以不同。
线性表的基本操作
1)Setnull(L) 置空表
2)Length(L) 求表长度;求表中元素个数
3)Get(L,i) 取表中第i个元素(1≤i≤n)
4)Prior(L,i) 取i的前趋元素
5)Next(L,i) 取i的后继元素
6)Locate(L,x) 返回指定元素在表中的位置
7)Insert(L,i,x)插入元素
8)Delete(L,x) 删除元素
9)Empty(L) 判别表是否为空
-----------------------------------------------------
二,顺序表代码
//
// main.cpp
// 线性表的顺序存储结构
//
// Created by 梁华建 on 2017/9/14.
// Copyright © 2017年 梁华建. All rights reserved.
//
#include <iostream>
//定义常量MaxSize 不一定要100,代表的是数组的存储数量
const int MaxSize=100;
template <class DataType>
class SeqList {
public:
SeqList(){length=0;}//无参构造函数 空的顺序表
SeqList(DataType a[],int n);//有参构造函数,建立一个长度为n的顺序表
~SeqList(){}//析构函数为空
int Length(){return length;}//求线性表的长度
DataType Get(int i);//按位查找,在线性表中查找第i个元素
int Locate(DataType x);//按值查找,在线性表中查找值位x的元素序号
void Insert(int i,DataType x);//插入操作,在线性表中第i个位置插入值为x的元素
DataType Delete(int i);//删除操作,删除线性表的第i个元素
void PrintList();//遍历操作,按序号依次输出各元素
private:
DataType data[MaxSize];//存放数据元素的数组
int length;
};
//有参构造函数实现
template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
if (n>MaxSize)throw "参数非法";
for (int i=0; i<n; i++)
data[i]=a[i];
length=n;
}
//getter函数的实现 获得i的位置
template <class DataType>
DataType SeqList<DataType>::Get(int i)
{
if (i<1&&i>length)
throw "查找位置非法";
return data[i-1];
}
//查找函数 找到数据的下标位置
template<class DataType>
int SeqList<DataType>::Locate(DataType x)
{
for (int i=0; i<length; i++)
if (data[i]==x)return i+1;//找到之后返回下标
return 0;//退出循环说明查找失败
}
//插入函数 插入一个数据元素到列表中
template <class DataType>
void SeqList<DataType>::Insert(int i, DataType x)
{
if (length>=MaxSize) throw "上溢出";
if (i<1||i>length+1) throw "插入位置错误";
for (int j=length; j>=i; j--)//插入后后面的对象后移一个单位
data[j]=data[j-1];
data[i-1]=x;
length++;//列表加一
}
//删除函数 删除一个数据元素从列表中
template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
if (length<=0) throw "下溢出";
if (i<1||i>length+1) throw "删除位置错误";
DataType x=data[i-1];//需要删除的元素
for (int j=i; j<=i; j--)
data[j-1]=data[j];
length--;
return x;
}
//遍历函数 按下标依次输入各元素
template <class DataType>
void SeqList<DataType>::PrintList()
{
for (int i=0; i<length; i++) {
std::cout<<"第个数"<<i<<"值为"<<data[i]<<" ";
}
}
-----------------------------------------------------
三,出现的问题和代码缺点
问题:完成该代码的时候要有较清晰的for使用思路,不然很容易混淆,删除和插入函数的思路差不多,还有每次要想好数据输入可能出现的问题,当输入数据上溢或者下溢的时候应该throw出错误而不是代码崩掉.保证算法的鲁棒性。
缺点:
1,每次插入或者删除都要移动大量数据
2,表的容量难以确定
3,造成存储空间的碎片,数组要去连续的存储空间 如果不连续则不能使用
-------------------------------------------------------
四,编写main函数测试
main函数中调用student测试函数
当数组的数大于定义的maxsize就会报错