码迷,mamicode.com
首页 > 其他好文 > 详细

线性表的顺序表示的简单实现(顺序表的实现)

时间:2020-07-17 13:44:21      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:出现   实现   pre   error   测试   描述   sql   大小   一段   

目录

1、顺序表的概念

2、顺序表的的存储表示和实现

3、基本操作的实现

  3.1初始化

  3.2取值

  3.3查找

  3.4插入

  3.5删除

4、测试线性表的功能

 

1、顺序表的概念:使用一段连续的存储空间存储线性表的元素

2、顺序表的存储表示和实现

/**
 * 线性表的顺序表示和实现(数组)
 */
//操作成功
#define OK 1
//操作错误
#define ERROR 0
//操作异常
#define OVERFLOW -2
//定义元素类型,int可使用基本数据类型和用户自定义数据类型替换,根据使用场景选择
typedef int ElemType ;
typedef int Status ;
/**
 * 顺序表的存储结构
 */
//predefine(预定义) constant(常量) maxn(n的最大值)
#define MAXN 100
typedef struct {
    ElemType *elems;            //存储空间的基地址
    int length;                 //线性表当前长度
}SqList;//sequence(序列) List(列表)

 

3、顺序表的基本操作的实现

3.1、初始化

/**
 * 构造一个空的顺序表L
 * 算法描述:开辟空间,设置顺序表长度为零,返回操作结果
 * @param L 指向顺序表的指针L
 * @return  操作结果状态码
 */
Status initList(SqList *L){
    //为顺序表分配一个大小为MAXN的数组空间
    L->elems = new ElemType[MAXN];
    //存储分配失败,返回OVERFLOW,表示操作异常状态
    if(!L->elems) return OVERFLOW;
    //设置顺序表长度为零
    L->length = 0;
    //构造顺序表成功,返回OK
    return OK;
}

 

3.2、取值

/**
 * 取顺序表L中第i个元素elem
 * 算法描述:判断i是否大于等于1且小于顺序表长度,返回ElemType数组下标为i-1的元素
 * @param L 指向顺序表的指针L
 * @param i 要获取的元素在顺序表中的位置
 * @return  操作结果状态码
 */
Status getElem(SqList *L, int i, ElemType *e){
    //如果i值不合法,返回ERROR表示操作错误
    if(i < 1 || i > L->length){
        return ERROR;
    }
    //将数组的第i个元素的赋值给e指向的内存
    *e = L->elems[i-1];
    //操作成功,返回OK
    return OK;
}

 

3.3、查找

/**
 * 查找元素在顺序表中的位置
 * 算法描述:查找顺序表中和元素e相同的元素出现的位置,若没有和e匹配的元素,返回0
 * @param L 指向顺序表的指针L
 * @param e 要查找的元素
 * @return  元素在顺序表中的位置
 */
int indexOf(SqList *L, ElemType e){
    for (int i = 0; i < L->length; ++i) {
        //查找成功, 下标为i的元素是顺序表的第i+1个元素,返回i+1
        if(e == L->elems[i]){
            return i+1;
        }
    }
    //查找失败,返回0
    return 0;
}

 

3.4、插入

/**
 * 在顺序表L的第i个位置插入元素e,顺序表长度加1
 * 算法描述:若i小于1或者i大于顺序表L的当前长度加1,返回ERROR,
 * 若存储空间已满,返回ERROR,首先需要将顺序表位置为n~i的元素依次后移,再在顺序表位置i上插入元素e,顺序表的长度加1
 * @param L 指向顺序表的指针L
 * @param i 插入位置i
 * @param e 要插入的元素e
 * @return 返回操作结果状态码
 */
Status insertElem(SqList *L, int i, ElemType e){
    //若i小于1或者i大于线性表L的当前长度,返回ERROR
    if(i < 1 || i > L->length + 1)  return ERROR;
    //如果存储空间已满,返回ERROR
    if(L->length == MAXN) return ERROR;
    //将线性表位置为n~i的元素依次后移
    for (int j = L->length; j >= i; --j) {
        L->elems[j] = L->elems[j-1];
    }
    //在顺序表位置i上插入元素e
    L->elems[i-1] = e;
    //线顺序表的长度加1
    ++L->length;
    return OK;
}

 

3.5、删除

/**
 * 删除顺序表L上位置为i的元素,顺序表长度减1
 * 算法描述:若i小于1或者i大于顺序表L的当前长度,返回ERROR,
 * 将顺序表位置为i+1~n的元素依次前移,顺序表的长度减1
 * @param L 指向顺序表的指针L
 * @param i 删除位置i
 * @return 返回操作结果状态码
 */

Status deleteElem(SqList *L, int i){
    //若i小于1或者i大于顺序表L的当前长度,返回ERROR
    if(i < 1 || i > L->length) return ERROR;
    //将线性表位置为i+1~n的元素依次前移
    for (int j = i; j < L->length; ++j) {
        L->elems[j-1] = L->elems[j];
    }
    //顺序表的长度减1
    --L->length;
    return OK;
}

 

4、测试线性表的功能

int main() {
    SqList *L;
    initList(L);
    for (int i = 0; i < 10; ++i) {
        insertElem(L, i+1, i);
    }
    printf("%d\n", indexOf(L, 3));
    deleteElem(L,2);
    printf("%d\n", indexOf(L, 3));
    for (int j = 0; j < L->length; ++j) {
        ElemType *e = new ElemType;
        if(getElem(L, j+1, e) < 1){
            continue;
        }
        printf("%d\n", *e);
    }
    ElemType *e = new ElemType ;
    getElem(L, 4, e);
    printf("%d\n", *e);
    *e = 10;
    getElem(L, 4, e);
    printf("%d\n", *e);
    return 0;
}

 

线性表的顺序表示的简单实现(顺序表的实现)

标签:出现   实现   pre   error   测试   描述   sql   大小   一段   

原文地址:https://www.cnblogs.com/RGBTH/p/13329241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!