线性表的顺序表示的简单实现(顺序表的实现)
Posted rgbth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表的顺序表示的简单实现(顺序表的实现)相关的知识,希望对你有一定的参考价值。
目录
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 ", indexOf(L, 3)); deleteElem(L,2); printf("%d ", 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 ", *e); } ElemType *e = new ElemType ; getElem(L, 4, e); printf("%d ", *e); *e = 10; getElem(L, 4, e); printf("%d ", *e); return 0; }
以上是关于线性表的顺序表示的简单实现(顺序表的实现)的主要内容,如果未能解决你的问题,请参考以下文章