实验一 顺序表的操作(数据结构实验c++编写)

1. 实验要求

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

2. 实验目的

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

3. 实验内容

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

4. 实验步骤

  1. 编写程序框架,利用while循环输入操作代码,利用switch选择语句对输入的代码进行判断,并进行相应操作。
  2. 编写各个操作的具体函数:
    1>清空线性表:L.length = 0;
    2>判断线性表是否为空:L.length是否等于0;
    3>求线性表长度:L.length;
    4>获取线性表指定位置元素:位置是否合法,L.elem[i-1];
    5>求前驱:位置是否合法,L.elem[i-2];
    6>求后继:位置是否合法,L.elem[i];
    7>在线性表指定位置插入元素:位置是否合法,循环执行L.elem[i]= L.elem[i-1]语句 ,L.elem[i-1]=e;
    8>删除线性表指定位置元素:位置是否合法,循环执行L.elem[i-1]= L.elem[i]语句;
    9>显示线性表:for循环输出元素;
    10>定位:for循环遍历元素,if判断是否存在要查找元素。

5. 实验数据测试

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

6. 实验代码

#include <iostream>

using namespace std;

typedef int ElemType;
#define MAXSIZE 100

typedef struct
{
    ElemType *elem;//存储空间的基地址
    int length;    //当前长度,数据元素的个数
}SqList;           //顺序表的结构类型为SqList

//初始化
void InitList(SqList &L);
//清空顺序表
void ClearList(SqList &L);
//判断线性表是否为空
void EmptyList(SqList &L);
//求线性表长度
void LenList(SqList &L);
//获取线性表指定位置元素
void ChooseList(SqList &L,int i);
//求前驱
void BeforeList(SqList &L,int i);
//求后继
void AfterList(SqList &L,int i);
//在线性表指定位置插入元素
void InsertList(SqList &L,int i,int j);
//删除线性表指定位置元素
void DeleteList(SqList &L,int i);
//显示线性表
void DisplayList(SqList &L);
//定位
void LocateList(SqList &L,int i);

int main()
{
    SqList L;
    InitList(L);
    int i,j;

    int index = 1;
    while(index > 0)
    {
        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;
        cout << "请输入操作代码:" << endl;
        cin >> index;

        switch(index)
        {
            case 1:
                ClearList(L);
                break;
            case 2:
                EmptyList(L);
                break;
            case 3:
                LenList(L);
                break;
            case 4:
                cout << "请输入你要获取的位置:";
                cin >> i;
                ChooseList(L,i);
                break;
            case 5:
                cout << "请输入指定位置:";
                cin >> i;
                BeforeList(L,i);
                break;
            case 6:
                cout << "请输入指定位置:";
                cin >> i;
                AfterList(L,i);
                break;
            case 7:
                cout << "请输入要插入元素的位置:";
                cin >> i;
                cout << "请输入要插入的元素:";
                cin >> j;
                InsertList(L,i,j);
                break;
            case 8:
                cout << "请输入要删除元素的位置:";
                cin >> i;
                DeleteList(L,i);
                break;
            case 9:
                DisplayList(L);
                break;
            case 10:
                cout << "请输入要定位元素的值:";
                cin >> i;
                LocateList(L,i);
                break;
            default:
                cout << "输入数字不合法!" << endl;
        }
        cout << endl;
    }

    return 0;
}

void InitList(SqList &L)
{
    L.elem = new ElemType[MAXSIZE];
    if(!L.elem)
        cout << "初始化失败!" << endl;
    L.length = 0;
}
void ClearList(SqList &L)
{
    if(L.length == 0)
        cout << "线性表是空的!" << endl;
    else
    {
        L.length = 0;
        cout << "顺序表已经清空!" << endl;
    }
}
void EmptyList(SqList &L)
{
    if(L.length == 0)
        cout << "线性表为空!" << endl;
    else
        cout << "线性表不为空!" << endl;
}
void LenList(SqList &L)
{
    cout << "线性表的长度为:" << L.length << endl;
}
void ChooseList(SqList &L,int i)
{
    if(i>0 && i<= L.length)
        cout << L.elem[i-1] << endl;
    else
        cout << "你输入的位置不合法!" << endl;
}
void BeforeList(SqList &L,int i)
{
    if(i>1 && i<=L.length)
        cout << "指定位置前驱是:" << L.elem[i-2] << endl;
    else if(i == 1)
        cout << "该位置无前驱!" << endl;
    else
        cout << "输入位置不合法!" << endl;
}
void AfterList(SqList &L,int i)
{
    if(i>0 && i<L.length)
        cout << "该位置的后继是:" << L.elem[i] << endl;
    else if(i == L.length)
        cout << "该位置无后继!" << endl;
    else
        cout << "输入位置不合法!" << endl;
}
void InsertList(SqList &L,int i,int j)
{
    if(i>0 && i<=L.length+1 && L.length < MAXSIZE)
    {
        for(int q=L.length;q>=i;q--)
            L.elem[q] = L.elem[q-1];
        L.elem[i-1] = j;
        ++L.length;
    }
    else
        cout << "输入不合法!" << endl;
}
void DeleteList(SqList &L,int i)
{
    if(i>0 && i<=L.length)
    {
        for(int k=i;k<L.length;k++)
            L.elem[k-1] = L.elem[k];
        --L.length;
    }
    else
        cout << "输入位置不合法!" << endl;
}
void DisplayList(SqList &L)
{
    if(L.length > 0)
        for(int k=0;k<L.length;k++)
            cout << L.elem[k] << " ";
}
void LocateList(SqList &L,int i)
{
    bool isExit = false;
    for(int k=0;k<L.length;k++)
    {
        if(L.elem[k] == i)
        {
            cout << "指定元素所在位置是:" << k+1 << endl;
            isExit = true;
        }

    }
    if(!isExit)
        cout << "线性表中无此元素!" << endl;
}

7. 实验总结

  • 判断表是否为空,清空表操作可直接利用表的length属性。
  • 表的第一个元素无直接前驱,最后一个元素无直接后继。
  • 对表进行插入操作时应注意插入位置的取值范围。进行插入操作时应由表尾开始操作。
发布了31 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43790779/article/details/105411914