顺序表的12个基本操作及其检验

顺序表是指线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。只要确定了顺序表的起始位置,顺序表的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。在这点上与高级程序设计语言中的数组十分相似,因此通常用数组来描述数据结构中的顺序存储结构。接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。
声明:本程序是在VS2015中实现的,在其他编译器中如果有些许差错还请自行手动更改。

一. 头文件和宏定义

//--保存为constant.h--
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
using namespace std;
#define TRUE   1
#define FALSE  0    
#define OK     1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef  int   Status;
typedef  int ElemType;

二.接下来是12个基本操作
//—顺序表的动态分配存储结构—
//保存成header.h

#include"constant.h"
#define LIST_INIT_SIZE 100
#define LISTINCREMENT   10
typedef struct
{
    ElemType  *elem;
    int      length;
    int    listsize;
}SqList;
//1.构造顺序表
Status InitList(SqList &L)
{
    L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)
        return ERROR;
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}
//2.销毁顺序表
Status DestroyList(SqList &L)
{
    if (L.elem)
        free(L.elem);
    if (L.elem == NULL)
        return OK;
    else
        return ERROR;
}
//3.清空顺序表
void ClearList(SqList &L)
{
    L.length = 0;
}
//4.判断顺序表是否空表
Status ListEmpty(SqList L)
{
    if (L.length == 0)
        return ERROR;
    else
        return OK;
}
//5.顺序表求表长
Status ListLength(SqList L)
{
    return L.length;
}
//6.顺序表的取元素
Status GetElem(SqList L)
{
    int i, e;    //取出顺序表中第i个元素e
    cout << "请输入要取的元素的位序:" << endl;
    cin >> i;
    if (i<1 || i>L.length)
        return ERROR;
    else
        e = L.elem[i - 1];
    cout << "要取出的第" << i << "个元素是" << e << endl;
    return OK;
}
//辅助函数
Status compare(int e1, int e2)
{
    if (e1 == e2)
        return OK;
    else
        return ERROR;
}

//7.顺序表的定位
Status LocateElem(SqList L)
{
    int e, i = 1;
    cout << "请输入要定位的元素e" << endl;
    cin >> e;
    while (i <= L.length&&L.elem[i - 1] != e)
    {
        i++;
    }
    if (i > L.length)
        return ERROR;
    else
        cout << "要定位的元素的位序为" << i << endl;
        return i;
}
//8.返回前驱
Status PriorElem(SqList L)
{
    int cur_e, pre_e, i = 1;
    int *p;
    p = L.elem + 1;//将第二个元素的地址赋值给p
    cout << "请输入顺序表中第二到表尾的任何一个数:" << endl;
    cin >> cur_e;
    while(i < L.length && compare(cur_e, L.elem[i - 1]))
    {
        p++;
        i++;
    }
    if (i > L.length)
        return ERROR;
    else
    {
        pre_e = L.elem[i];  //注意i
        cout << "它的前驱元素是" << pre_e << endl;
        return pre_e;//将此元素返回给要调用的函数
    }        
}
//9.返回后继
Status NextElem(SqList L)
{
    int cur_e, next_e, i = 0;//i的初值是第一个元素的位序
    cout << "请输入第一到倒数第二个任意一个元素:" << endl;
    cin >> cur_e;
    int *p = L.elem;//第一个元素的地址赋值给p
    while (i < L.length && !compare(cur_e, L.elem[i]))
    {
        p++;
        i++;
    }
    if (i == L.length)
    {
        return ERROR;
    }
    else
    {
        next_e = *(++p);
        cout << "它的后继元素是" << next_e << endl;
        return next_e;//将此元素返回给主函数
    }
}
//10.插入元素
Status ListInsert(SqList &L)
{
    ElemType *p, *q, *newbase;
    int i, e;//在位置i插入元素e
    cout << "请输入要插入的元素的位置i:" << endl;
    cin >> i;
    cout << "请输入要插入的元素的数值e:" << endl;
    cin >> e;
    if (i<1 || i>L.length)
        return ERROR;
    if(L.length>=L.listsize)
    {
        if (!(newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
            exit(0);//分配存储空间失败
        L.elem = newbase;//新基址
        L.listsize += LISTINCREMENT;//增加存储容量
    }
    q = L.elem + i - 1;//q为插入位置
    for (p = L.elem + L.length - 1; p >= q; --p)
    {
        *(p + 1) = *p;//给插入位置之后的元素赋值达到之后元素后移一位的效果
    }
    *q = e;//插入e
    ++L.length;
    return OK;
}
//11.删除元素
Status ListDelete(SqList &L)
{
    int i,e;
    cout << "请输入要删除的元素的位置i:" << endl;
    cin >> i;
    if (i<1 || i>L.length)//i值不合法
        return ERROR;
    ElemType *p, *q;
    p = L.elem + i - 1;//p为被删除元素的位置
    e = *p;            //被删除元素的值赋给e
    cout << "被删除的元素是" << e << endl;
    q = L.elem + L.length - 1;//q是表尾元素的位置
    p = p + 1;
    for ( ; p <= q; p++)
        *(p - 1) = *p;
    L.length--;  //表长减一
    return OK;
}
//12.遍历
Status ListTraverse(SqList L)
{
    ElemType *p = L.elem;
    int i;
    for (i = 1; i <= L.length; i++)
        cout<<*p++<<"  ";
    cout << endl;
    return OK;
}

三.主函数中检验

#include "stdafx.h"
#include "header.h"
int main()
{
    int m,n;
    SqList L;
    InitList(L);
    cout << "……顺序表初始化……" << endl;
    cout << "请输入顺序表的长度n:"<<endl;
    cin >> n;
    for (m = 1; m <= n; m++)
    {
        cout << "请输入第"<<m<<"个元素的值:"<<endl;
        cin >> L.elem[m - 1];
        L.length++;
    }
    cout << "顺序表的长度为" << L.length << endl;
    cout << "顺序表中的元素为:"<<endl;
    ListTraverse(L);
    cout << "…………判断顺序表是否空表…………" << endl;
    if (ListEmpty(L) == 1)
        cout << "顺序表非空" << endl;
    else
        cout << "顺序表为空" << endl;
    cout << "…………顺序表中取元素操作…………" << endl;
    GetElem(L);
    cout << "…………顺序表中元素的定位…………" << endl;
    LocateElem(L);
    cout << "…………顺序表中元素的前驱…………" << endl;
    PriorElem(L);
    cout << "…………顺序表中元素的后继…………" << endl;
    NextElem(L);
    cout << "…………顺序表元素插入测试…………" << endl;
    ListInsert(L);
    cout << "此时顺序表中的元素为:"<<endl;
    ListTraverse(L);
    cout << "…………顺序表元素删除测试…………" << endl;
    ListDelete(L);
    cout << "此时顺序表中的元素为:" << endl;
    ListTraverse(L);
    cout << "恭喜您成功完成顺序表的所有功能!!!!" << endl;
    return 0;
}

运行结果

补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值