目录
一.前言
二. 顺序表的优缺点
三. 顺序表的定义和初始化
四.顺序表的相关操作
一.前言
首先介绍下线性表的定义,线性表是具有相同特性的数据元素的一个有限序列。而我们的顺序表就是线性表的一种,是线性表的顺序存储结构。所谓顺序存储就是把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
二. 顺序表的优缺点
顺序表的优点就是能够以物理位置相邻表示逻辑关系,任一元素均可随机存取。原因就在于它占用一片连续的存储空间。并且知道了其中第一个元素的存储位置之后,就能得到其它数据元素的存储位置。如下所示:
但它也同样存在一些缺点问题:首先第一个就是存储空间分配的不灵活,第二个就是运算的空间复杂度高。也就是说,如果我要找的数据元素在最后一位,它就要从开头一直查找到最后一位。为了解决上面这些问题,我们可以使用链式存储,现在我们主要学习顺序存储。
三. 顺序表的定义和初始化
我们可以知道,顺序表中的每个位置都存储了对应的数据结构,因此我们在定义顺序表的时候,就要包含两个因素,一个是顺序表实际占用的长度。另外一个就是对应长度上存储的数据。如下所示即为我们顺序表的定义:
#define LIST_INIT_SIZE 100 //定义整个线性表存储空间的初始分配量typedef struct{ //定义一个结构体类型ElemType elem[LIST_INIT_SIZE]; //用来存储数据int length; //顺序表实际当前的长度
}SqList; //起一个别名,命名为SqList
在得到了顺序表的定义之后,我们还得用它来修饰一个变量名,再对这个进行初始化或者赋值。就像C语言中的数据类型一样,知道了数据类型,还得用它来修饰变量并给变量进行赋值等相关操作。我们定义一个顺序表就是SqList L。表示L就是SqList类型的顺序表。
下面我们来了解下顺序表的初始化:
#define MAXSIZE 100
#define OVERFLOW -2
#define OK 1
typedef int Status;
typedef char ElemType;int InitList_Sq(SqList &L){L.elem=new ElemType[MAXSIZE]; //为顺序表分配空间if(!L.elem) exit(OVERFLOW); //分配空间失败,则退出并返回OVERFLOW对应的数值,也就是-2L.length=0; //空顺序表里面没有元素,实际长度也就为0;return OK;
}
值得注意的是:这里面形参的格式为SqList &L表示的是我们数据结构使用类C语言的一种参数引用形式,表示直接修改顺序表L中的数据,而不是单单的一个数据。以后一出现&都表示引用。
其中的MAXSIZE和OVERFLOW以及OK都是代表着某个数字,在函数的开头有声明。其中的Status和ElemType也都表示一种数据类型。为了后面操作的方便,我在这里全部列举出来,如下所示:
//定义函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2//再定义两个函数类型
typedef int Status;
typedef char ElemType;
四.顺序表的相关操作
1.顺序表的取值
如下所示,顺序表的取值就是根据位置i来获取相应位置数据元素的内容。
Status GetElem(SqList L,int i,ElemType &e){if(i<1||i>L.length) return ERROR;//判断查找的位置i是否合理,若不合理则返回ERRORe=L.elem[i-1]; //第i-1个单元存储着第i个数据,并通过e返回取值结果return OK;
}
2. 顺序表的查找
如下所示,顺序表的查找就是在线性表中查找值为e的数据元素,并返回其序号(是第几个元素)。
Status LocateElem(SqList L,ElemType e){for(int i=0;i<L.length;i++){if(L.elem[i]==e) return i+1; //查找成功则返回它的序号,是第几个元素}return 0; //上面查找失败,则返回0
}
3. 顺序表的插入
如下所示,顺序表的插入运算就是在表的第i个位置上,插入一个新结点e,使长度为n的顺序表变成长度为n+1的顺序表。值得注意的是,需要先判断插入位置是否合法。
Status ListInsert_Sq(SqList &L,int i,ElemType e){if(i<1||i>L.length+1) return ERROR; //插入的位置i不合法的情况,就返回ERRORif(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; //将新的元素e放入第i个位置
L.length++; //顺序表的表长加一
return OK;
}
4. 顺序表的删除
如下所示,顺序表的删除就是删除顺序表中第i个元素,并且将被删除元素的后面元素都前移,保证顺序表存储空间的连续性。
Status ListDelete_Sq(SqList &L,int i){if(i<1||i>L.length) return ERROR; //要删除的位置i不合法for(int j=i;j<=L.length-1;j++){L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移}L.length--; //表长长度减一return OK;
}