實驗一 順序表的操作

實驗性質:設計性實驗

要求

編程實現順序表的以下基本操作:建立順序表,修改順序表,插入順序表,刪除順序表。
採用順序表結構編程實現:兩個集合的運算:交集/並集/差集。

實驗目的

通過該實驗,深入理解順序表的邏輯結構、物理結構等概念,掌握順序表基本操作的編程實現,注意順序表插入、刪除等操作過程中數據元素的移動現象,學生編寫程序時,要考慮程序的健壯性,熟練掌握通過函數參數返回函數結果的辦法。

實驗內容

編程實現順序表下教材第二章定義的線性表的基本操作,最好用菜單形式對應各個操作,使其變成一個完整的小軟件。

參考界面

在這裏插入圖片描述

驗收/測試用例

通過菜單調用各個操作,測試點:

  • 插入數據(位置, 數據),要測插入位置不合法的情況(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;
}

寫在最後

本文章僅供個人複習使用,如有錯誤,請聯繫我更正。

參考:實驗一 順序表的操作(數據結構實驗)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章