C++数据结构实验报告:顺序表实现

一,顺序表的作用

线性结构的基本特征为:   
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就会报错




猜你喜欢

转载自blog.csdn.net/MChuajian/article/details/78039666