线性表的顺序表示和实现
-
初始化
步骤:
- 为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址
- 将表的当前长度设为0
代码:
//初始化 const int MAXSIZE = 100; bool InitList(SqList L) { L.elem = new ElemType[MAXSIZE]; if(!L.elem){ return 0; } L.length = 0; return true; }
-
取值
步骤:
- 判断指定的位置序号i的值是否合理,若不合理,返回false
- 若值合理,则将第i个数据元素L.elem[i-1]赋值参数e,通过e返回第i个数据元素的传值
//取值 int GetElem(SqList L,int i,ElemType e) { if(i<1 || i>L.length){ return -1; } e=L.elem[i-1]; return e; }
-
查找
步骤:
- 从第一个元素起,依次将其值和e比较,若找到和e值相等的元素L.elem[i],则查找成功,返回该元素的序号i+1
- 若查遍整个顺序表都没有找到,则查找失败,返回0
//查找 int LocateElem(SqList L,ElemType e) { for(int i=0;i<L.length;i++){ if(e==L.elem[i]){ return i+1; }else{ return 0; } } return 0; }
-
插入
- 判断插入位置i是否合法(i值的合法范围为1<=i<=n+1),若不合法返回FALSE
- 判断顺序表的存储空间是否已满,若满了,返回FALSE
- 将第n个至第i个元素依次向后移动一个位置,空出第i个位置(i=n+1时无序移动)
- 将要插入的元素e放入第i个元素
- 表长加一
//插入 bool ListInsert(SqList &L,int i,ElemType e) { if(i<1 || i>L.length+1) { return false; } if(L.length==MAXSIZE){//判断顺序表的存储空间是否已满 return false; } 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 true; }
-
删除
步骤:
- 判断删除位置i是否合法(合法的值为1<=i<=n),若不合法则返回FALSE
- 将第i+1个元素至第n个元素依次向前移动一个位置(i=n时无需移动)
- 表长减一
//删除 bool ListDelete(SqList &L,int i) { if(i>L.length && i<1){ return false; } for(int j=i;j<=L.length-1;j++){ L.elem[j-1]=L.elem[j]; } --L.length; return true; }
2023年7月20日大约 6 分钟