实验一 顺序表的操作

1.实验性质:设计性实验

2.要求

  1. 编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
  2. 采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。

3.实验目的

       通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。

4.实验内容

       编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。

5.参考界面

6.验收/测试用例

通过菜单调用各个操作,测试点:

  1. 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
  2. 显示顺序表中的数据,屏幕输出1, 2, 3;
  3. 判空,屏幕输出顺便表非空;
  4. 顺便表长度,屏幕输出3;
  5. 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
  6. 定位,输入:4, 输出:不存在,输入2,输出位置为2;
  7. 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
  8. 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
  9. 删除,要测位置在【1,3】范围之外的情况和之内的情况;
  10. 清空操作后再测长度;

实验步骤:

//重点阐述设计思想

首先将要输入的提示信息写入一个函数中,在main函数中调用提示信息;

根据提示信息的顺序在main函数之前写出相对应的函数名和函数体,再通过main函数调用显示;

在编写相对应操作的函数时考虑全面,考虑到非法操作时的操作结果;

在编写函数体之前需要先定义顺序表,再初始化顺序表,再按照提示信息的内容一步步编写相对应的函数体;

实验记录:

先定义一个顺序表并进行初始化

#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define MAXSIZE 100
#define LISTINCREMENT 10

typedef int ElemType;     //定义数据类型,相当于给int取别名为ElemType

typedef struct           //定义顺序表
{
    ElemType *elem;     //定义指针
    int length;         //顺序表长度
    int listsize;       //顺序表大小
}SqList;

typedef int Status;      //定义Status为int类型,否则后续会报错

Status InitList_Sq(SqList &L)     //初始化
{
    L.elem=new ElemType[MAXSIZE];
    L.length=0;
    if(!L.elem)
        exit(OVERFLOW);
    L.listsize=MAXSIZE;
    return OK;
}

根据实验所需进行相关的操作代码的编写

1. 清空线性表

  顺序表的长度为零即可

void ClearList(SqList &L)       //清空
{
    L.length=0;
}

2. 判断线性表是否为空

  如果顺序表的长度为0返回true,否则返回false。

bool IsEmpty(SqList L)         //判断是否为空
{
    if(L.length==0)
        return true;
    else
        return false;
}

3. 求线性表长度

  返回顺序表的长度

int GetLength(SqList L)        //求长度
{
    return L.length;
}

4. 获取线性表指定位置元素

  首先先判断输入的位置是否在顺序表长度的范围内

  然后取出所要取的位置的值

Status GetElem(SqList &L,int i,ElemType &e)   //取值
{
    if(i<1 || i>L.length)
    {
        cout << "输入位置不在有效范围内,请重新输入" << endl;
        return ERROR;
    }
    e=L.elem[i-1];   //指针共顺序表的[0]位置开始,输入的i从1开始,所以取的位置是L.elem[i-1]
    cout << i << "位置上的元素是:" << e << endl;
    return OK;
}

5. 求前驱

  同样先判断所输位置是否合法

  前驱即为所取值的前一个数,故算法跟取值的相类似

Status PriorElem(SqList &L,int i,ElemType &e)     //前驱
{
    if(i<=1 || i>L.length)
    {
        cout << "输入有误,请重新输入" << endl;
        return ERROR;
    }
    e=L.elem[i-2];
    cout << i << "的前驱是:" << e << endl;
    return OK;
}

6. 求后继

  求后继是同样的道理

Status NextElem(SqList &L,int i,ElemType &e)        //后继
{
    if(i<1 || i>=L.length)
    {
        cout << "输入有误,请重新输入" << endl;
        return ERROR;
    }
    e=L.elem[i];
    cout << i << "的后继是:" << e << endl;
    return OK;

}

7. 在线性表指定位置插入元素

Status ListInsert_Sq(SqList &L,int i,ElemType e)   //插入
{
    if(i<1 || (i>L.length+1))
    {
        cout << "输入有误,请重新输入" << endl;
        return ERROR;
    }
    if(L.length==MAXSIZE) return ERROR;    //顺序表的长度超过了最大值,范围ERROR
    for(int j=L.length-1;j>=i-1;j--)       //顺序表的值循环后移,从最后一个值到需要插入的位置
        L.elem[j+1]=L.elem[j];
    L.elem[i-1]=e;       //跟取值的思想相类似,只不过把取值变成插入值
    ++L.length;          //插入值后长度增加
   //cout << "插入成功” <<endl;
    return OK;
}

8. 删除线性表指定位置元素

Status ListDelete(SqList &L,int i)         //删除
{
    if(i<1 || i>L.length)
    {
        cout << "输入有误,请重新输入" << endl;
        return ERROR;
    }
    for(int j=i;j<=L.length-1;j++)   //从需要删除的值开始到最后一个循环前移一个位置
        L.elem[j-1]=L.elem[j];
    --L.length;                      //长度减1
    cout << "删除成功" << endl;
    return OK;
}

9. 显示线性表

void Display_List(SqList L)                 //显示
{
    for(int i=1;i<=L.length;++i)        //循环显示,此处从0开始到L.length-1同样可以
        cout << L.elem[i-1] << " ";
    cout << endl;
}

销毁函数

void DestoryList(SqList &L)     //销毁
{
    if(L.elem) delete[] L.elem;
    L.length=0;
    L.elem=NULL;
}

根据题目要求显示的信息

void Show_help()
{
    cout << "1----清空线性表" << endl;
    cout << "2----判断线性表是否为空" << endl;
    cout << "3----求线性表长度" << endl;
    cout << "4----获取线性表指定位置元素" << endl;
    cout << "5----求前驱" << endl;
    cout << "6----求后继" << endl;
    cout << "7----在线性表指定位置插入元素" << endl;
    cout << "8----删除线性表指定位置元素" << endl;
    cout << "9----显示线性表" << endl;
    cout << "    退出,输入一个负数" << endl;
}

根据题目信息和所写的函数进行编写main函数

int main()
{
    Show_help();    //显示提示信息
    int n;
    SqList L;
    InitList_Sq(L);   //初始化顺序表
    int i;
    ElemType e;

    while(1)     //循环输入
    {
        cout << "请输入操作代码:" ;
        cin >> n;
        if(n==1)   //清空
        {
            ClearList(L); 
        }
        else if(n==2)   //判断是否为空
        {
            if(IsEmpty(L))
                cout << "The list is empty" << endl;
            else cout << "The list is no empty" << endl;
        }
        else if(n==3)   //求长度
        {
            cout << "The length of list is:" << GetLength(L) << endl;
        }
        else if(n==4)   //获取指定位置元素
        {
            cout << "输入要获取元素的位置:" ;
            cin >> i;
            GetElem(L,i,e);


        }
        else if(n==5)    //求前驱
        {
            cout << "输入要获取前驱的元素的位置:";
            cin >> i;
            PriorElem(L,i,e);


        }
        else if(n==6)    //求后继
        {
            cout << "输入要获取后继的元素的位置:";
            cin >> i;
            NextElem(L,i,e);


        }
        else if(n==7)     //指定位置插入元素
        {
            cout << "请输入要插入的位置和元素:";
            cin >> i >> e;
            ListInsert_Sq(L,i,e);
        }
        else if(n==8)     //删除指定位置元素
        {
            cout << "输入你要删除的元素位置:";
            cin >> i;
            ListDelete(L,i);

        }

        else if(n==9)     //显示线性表
        {
            cout << "The List is:";
            Display_List(L);
        } 
        else if(n<0)      //输入其他数退出循环
        {
            break;
        }
        else
            cout << "输入有误,请重新输入" << endl;
    }
    DestoryList(L);    //结束之后需要销毁顺序表
    return 0;

}

实验中遇到的问题及解决方案

在顺序表初始化时,由于没有定义Status的含义,导致后面的函数调用全部发生错误。经观看视频和调试后改正。

在调用查找、前驱和后驱函数的时候,将函数调用操作放在了输出的后面,导致输出结果一直错误,经不断尝试和查看代码后发现并改正。

每个操作实现后没有相应的提示信息,也不知道是正确还是错误,在代码调试阶段加入了反馈信息。

总结与心得

心得:在一开始写代码的时候还是缺少了相应的规划,在写的时候漏洞百出,经常不是这里出错就是那里出错,都是在调试中修改完成的代码,这大大降低了完成代码的进度。每次在写代码前应该要好好的规划需要用到哪些东西,需要考虑周全。


实验二 单链表的操作_Saulstone的博客-CSDN博客

实验三 栈和队列的操作_栈的操作实验_Saulstone的博客-CSDN博客 

  • 10
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saulstone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值