实验一 顺序表的操作

实验性质:设计性实验

要求

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

实验目的

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

实验内容

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

参考界面

在这里插入图片描述

验收/测试用例

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

  • 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3)

  • 显示顺序表中的数据,屏幕输出1, 2, 3;

  • 判空,屏幕输出顺便表非空;

  • 顺便表长度,屏幕输出3;

  • 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;

  • 定位,输入:4, 输出:不存在,输入2,输出位置为2;

  • 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;

  • 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;

  • 删除,要测位置在【1,3】范围之外的情况和之内的情况;

  • 清空操作后再测长度;

代码

#include <iostream>
#include <stdio.h>
using namespace std;

#define MAXSIZE 10
typedef int status;

typedef struct  //定义结构体
{
    int *elem;
    int length;
}SqList;
SqList L; //声明变量
void InitList(SqList &L); //顺序表的初始化
void ListLength(SqList &L);  //顺序表的长度
void EmptyList(SqList &L); //判断顺序表是否为空
void ClearList(SqList &L); //清空顺序表
void PointList(SqList &L,int i);   //获取指定位置的元素
void BeforList(SqList &L,int i);   //求前驱
void AfterList(SqList &L,int i);   //求后继
void InsertList(SqList &L,int i,int x);//顺序表的插入
void DeleteList(SqList &L,int i); //删除指定位置的元素
void Display(SqList &L);  //显示顺序表的结构
void Postion(SqList &L,int i);   //定位
void Menu();  //文字菜单提示信息

int main()
{
    Menu();
    InitList(L);
    int h,k;    //获取输入的指定位置和插入数据的元素
    int i;  //输入的数字
    cout<<"请输入操作代码:";
    cin>>i;
    while(true)
    {
        switch(i)
        {
        case 1:
            ClearList(L);
            break;
        case 2:
            EmptyList(L);
            break;
        case 3:
            ListLength(L);
            break;
        case 4:
            cout<<"输入要操作的位置:";
            cin>>h;
            PointList(L,h);
            break;
        case 5:
            cout<<"输入要操作的位置:";
            cin>>h;
            BeforList(L,h);
            break;
        case 6:
            cout<<"输入要操作的位置:";
            cin>>h;
            AfterList(L,h);
            break;
        case 7:
            cout<<"输入要操作的位置:";
            cin>>h;
            cout<<"输入要插入的值:";
            cin>>k;
            InsertList(L,h,k);
            break;
        case 8:
            cout<<"输入要操作的位置:";
            cin>>h;
            DeleteList(L,h);
            break;
        case 9:
            Display(L);
            break;
        case 10:
            cout<<"输入要操作的值:";
            cin>>k;
            Postion(L,k);
            break;
        default:
            if(i<0)
                return 0;
            else
            {
                cout<<"输入的位置非法,请重新输入";
                break;
            }
        }
        cout<<"请输入操作代码:";
        cin>>i;
    }
    return 0;
}
void InitList(SqList &L)//初始化
{
    L.elem = new int(MAXSIZE);
    if(!L.elem)
        cout<<"初始化有误"<<endl;
    L.length=0;
}
void ListLength(SqList &L)//顺序表的长度
{
    cout<<"顺序表的长度为"<<L.length<<endl;
}
void EmptyList(SqList &L)//判断顺序表是否为空
{
    if(L.length==0)
        cout<<"顺序表为空"<<endl;
    else
    {
        cout<<"顺序表非空,长度为"<<L.length<<endl;
    }
}
void ClearList(SqList &L)//清空顺序表
{
    L.length=0;
    cout<<"顺序表已清空"<<endl;
}
void PointList(SqList &L,int i)
{
    if(i<=0||i>L.length)
    {
        cout<<"输入的数字非法"<<endl;
    }
    else
    {
        cout<<"第"<<i<<"个元素为"<<L.elem[i-1]<<endl;
    }
}
void BeforList(SqList &L,int i)//求前驱
{
    if(i<=0||i>L.length)
    {
        cout<<"输入数字非法"<<endl;
    }
    else if(i==1)
    {
        cout<<"第一个元素不存在前驱"<<endl;
    }
    else
    {
        cout<<"第"<<i<<"个元素的前驱为"<<L.elem[i-2]<<endl;
    }
}
void AfterList(SqList &L,int i)//求后继
{
    if(i<=0||i>L.length)
    {
        cout<<"输入数字非法"<<endl;
    }
    else if(i==L.length)
    {
        cout<<"最后一个元素不存在后继"<<endl;
    }
    else
    {
        cout<<"第"<<i<<"个元素的后继为"<<L.elem[i]<<endl;
    }
}
void InsertList(SqList &L,int i,int x)//插入顺序表
{
    if(i<=0||i>L.length+1)
    {
        cout<<"输入的位置非法"<<endl;
    }
    else
    {
        for(int j=L.length-1;j>=i-1;j--)
            L.elem[j+1]=L.elem[j];  //从第i+1个元素开始都往后移一位
        L.elem[i-1]=x;  //第i个元素设为x
        ++L.length;
        cout<<"插入元素成功"<<endl;
    }
}
void DeleteList(SqList &L,int i)//删除指定元素
{
    if(i<=0||i>L.length)
    {
        cout<<"输入的位置非法"<<endl;
    }
    else
    {
        for(int j=i;j<=L.length;j++)
        {
            L.elem[j-1]=L.elem[j];  //从第i+1个元素起依次往前移一个位置
        }
        --L.length;
        cout<<"成功删除元素"<<endl;
    }
}
void Display(SqList &L)//显示顺序表
{
    if(L.length==0)
    {
        cout<<"当前顺序表为空表"<<endl;
    }
    else
    {
        cout<<"顺序表为:";
        for(int j=0;j<L.length-1;j++)
        {
            cout<<L.elem[j]<<",";
        }
        cout<<L.elem[L.length-1];
        cout<<endl;
    }
}
void Postion(SqList &L,int i)
{
    bool a = false;//判断是否能找到
    for(int j=0;j<L.length;j++)
    {
        if(i==L.elem[j])
        {
             a=true;
             cout<<"元素所在位置为:"<<j+1<<endl;
             break;
        }

    }
    if(!a)
        cout<<"不存在"<<endl;
}
void Menu()
{
    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 << "10----定位" << endl;
    cout << "   退出,输入一个负数!" << endl;
}

写在最后

本文章仅供个人复习使用,如有错误,请联系我更正。

参考:实验一 顺序表的操作(数据结构实验)

发布了21 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zss192/article/details/104971790