一、实验前准备工作 

#define ElemType int
#define MAXSIZE 1000
#define ERROR -1
#define OK 1

上边是对数据结构基本操作实验所需要的一些数据的宏定义,此处的MAXSIZE是顺序表事先分配空间的最大值。

顺序表的存储结构

typedef struct SqList{
    ElemType *elem;//存储数据元素
    int length;//用来记录顺序表的长度
}SqList;

顺序表的基本存储结构顺序存储结构,这里的存储结构可以类比为数组进行类比思考。因为顺序表所指的就是逻辑上相邻的元素在物理位置上也相邻。这里的length就可以理解为数组的长度。但是需要注意的一点就是数组下标是从0开始计数的,顺序表与数组一样,它的下表是从0开始的,也就意味着:位置=下标+1;

二、部分重要代码展示

下边展示几个比较常用的顺序表操作:

1.获取某元素的位置:

//获取某元素的位置
int LocateElem(SqList L,ElemType e)
{
    for(int i=0;i<L.length;i++)
    {
        if(L.Elem[i]==e) return i+1;
    }
    return 0;
}

对顺序表中的元素进行遍历,查找该元素,当查找到该元素时返回i值,但是此处的i并不是所要查找的元素e的位置,i其实就是该元素再顺序表中存储位置的下标,但其真实的位置是下标+1,也就是i+1;

2.顺序表的取值

//获取指定位置的元素
void GetElem(SqList L,ElemType &e,int i)
{
    if(i<1||i>L.length)
    {
        cout<<"不合法"<<endl;
    }
    else
    {
        e= L.Elem[i-1];
        cout<<"元素为:"<<e<<endl;
    }
}

该步骤的主要目的就是根据用户自己可以输入自己想要获取的元素的位置,进而通过位置i然后取得该位置的元素内容。此处仍需注意所获取的元素的下标为用户输入的位置数-1;

3.顺序表的插入

//在线性表指定位置插入元素
int ListInsert(SqList &L,ElemType e,int i)
{
    if(i<0||i>L.length+1) return ERROR;
    if(L.length==MAXSIZE) return 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;
    return OK;
}

此算法中不能忘了当顺序表中插入一个新元素之后,顺序表的表长需要+1。下面对其中不符合要求的判断进行解释:第一条,当插入i小于1时或者插入的元素位置大于表长+1的话,位置i不合法,当i小于0时,不合法因为顺序表中的位置数>=0,不可能是负数,至于大于表长+1,当插入到表长位置时,此时的表长为表长+1,即length+1,但当插入位置大于表长+1时,假设插入的位置为表长+2处,此时表长+1位置处没有元素,为空,而顺序表是占用一段连续的空间进行存储,所以不合法;第二条,因为顺序表进行存储时必须事先分配一段存储空间,定义这段存储空间的最大值为MAXSIZE,若顺序表存储已经到最大值时,也就代表这段存储空间已经被用完,已经被占满,也就无法再往里存储数据了。

4.顺序表的删除


//删除指定位置元素
int ListDelete(SqList &L,int i)
{
    if(i<1||i>L.length) return ERROR;
    for(int j=i; j<=L.length-1; j++)
    {
        L.Elem[j-1]=L.Elem[j];
    }
    --L.length;
    return OK;
}

与插入元素相比,删除元素并不需要考虑存储空间已满的情况,因为此时顺序表已经存在,而删除操作只会让表长-1,所以只需要考虑元素是否合法的情况,也就是上边不合法因素的第一条。

三、完整代码及运算结果的展示

接下来时顺序表操作的完整代码展示,在其中,增加了几个其他操作的算法:

#include <iostream>
//顺序表的操作
using namespace std;
//线性表的存储表示
#define ElemType int
#define MAXSIZE 1000
#define ERROR -1
#define OK 1
typedef struct
{
    ElemType *Elem;
    int length;
} SqList;
//1.线性表的初始化
void chushihua(SqList &L)
{
    L.Elem = new ElemType[MAXSIZE];
    L.length = 0;
}
//2.销毁单链表
void DestoryList(SqList &L)
{
    if(L.Elem) delete []L.Elem;//释放存储空间
    L.Elem = NULL;
    L.length = 0;
}
//3.清空线性表
void clear(SqList &L)
{
    L.length = 0;
}
//4.判断线性表是否为空
void IsEmpty(SqList &L)
{
    if(L.length == 0)
    {
        cout<<"线性表为空"<<endl;
    }
    else
    cout<<"线性表不为空"<<endl;
}
//5.求线性表的长度
int GetLength(SqList &L)
{
    return L.length;
}
//6.获取指定位置的元素
void GetElem(SqList L,ElemType &e,int i)
{
    if(i<1||i>L.length)
    {
        cout<<"不合法"<<endl;
    }
    else
    {
        e= L.Elem[i-1];
        cout<<"元素为:"<<e<<endl;
    }
}
//7.求前驱
int GetPrior(SqList L,ElemType &e,int i)
{
    if(i<=1||i>L.length) return ERROR;
    e = L.Elem[i-2];
    return e;
}
//8.求后继
int GetNext(SqList L,ElemType &e,int i)
{
    if(i<1||i>=L.length) return ERROR;
    e = L.Elem[i];
    return e;
}
//9.在线性表指定位置插入元素
int ListInsert(SqList &L,ElemType e,int i)
{
    if(i<0||i>L.length+1) return ERROR;
    if(L.length==MAXSIZE)return 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;
    return OK;
}
//10.删除指定位置元素
int ListDelete(SqList &L,int i)
{
    if(i<1||i>L.length) return ERROR;
    for(int j=i; j<=L.length-1; j++)
    {
        L.Elem[j-1]=L.Elem[j];
    }
    --L.length;
    return OK;
}
//11.获取某元素的位置
int LocateElem(SqList L,ElemType e)
{
    for(int i=0;i<L.length;i++)
    {
        if(L.Elem[i]==e) return i+1;
    }
    return 0;
}
//12.显示线性表
void ShowList(SqList L)
{
    cout<<"线性表为:";
    for(int i=0; i<L.length; i++)
    {
        cout<<L.Elem[i]<<" ";
    }
    cout<<endl;
}
void showhelp()
{
    cout<<"线性表的基本操作:"<<endl;
    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<<"11.获取某元素的位置"<<endl;
    cout<<"12.显示线性表"<<endl;
    cout<<"退出请选0"<<endl;
}
int main()
{
    SqList L;
    ElemType e;
    showhelp();
    while(true)
    {
        int n;
        cin>>n;
        if(n==1)
        {
            chushihua(L);
            cout<<"初始化已完成"<<endl;
        }
        if(n==2)
        {
            DestoryList(L);
            cout<<"线性表已销毁"<<endl;
        }
        if(n==3)
        {
            clear(L);
            cout<<"线性表已清空"<<endl;
        }
        if(n==4)
        {
            IsEmpty(L);
        }
        if(n==5)
        {
            int m = GetLength(L);
            cout<<"线性表的长度为: "<<m<<endl;
        }
        if(n==6)
        {
            int i;
            cout<<"您想获取哪个位置的元素"<<endl;
            cin>>i;
            GetElem(L,e,i);
        }
        if(n==7)
        {
            int i;
            cout<<"您想获取哪个位置的元素的前驱"<<endl;
            cin>>i;
            GetPrior(L,e,i);
            cout<<"位置"<<i<<"处的元素的前驱元素为:"<<e<<endl;
        }
        if(n==8)
        {
            int i;
            cout<<"您想获取哪个位置的元素的后继元素"<<endl;
            cin>>i;
            GetNext(L,e,i);
            cout<<"它的后继为: "<<e<<endl;
        }
        if(n==9)
        {
            int i;
            cout<<"您想在哪个位置插入元素"<<endl;
            cin>>i;
            cout<<"您想插入的元素是"<<endl;
            cin>>e;
            ListInsert(L,e,i);
            cout<<"元素已插入"<<endl;
        }
        if(n==10)
        {
            int i;
            cout<<"您想删除哪个位置的元素"<<endl;
            cin>>i;
            ListDelete(L,i);
            cout<<"元素已删除"<<endl;
        }
        if(n==11)
        {
            cout<<"您想获取哪个元素的位置"<<endl;
            cin>>e;
            int i = LocateElem(L,e);
            if(i==0){
                cout<<"不合法"<<endl;
            }
            else
                cout<<"该元素的位置为:"<<i<<endl;
        }
        if(n==12)
        {
            ShowList(L);
        }
        if(n==0)
        {
            break;
        }
    }
    return 0;
}

基本操作的结果展示:

上边是所有顺序表操作的结果。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐