在学习数据结构线性表后,其实是有很多不太清楚的地方。为了加深理解和记忆,现在这里整理下基本思路和代码实现:
以下为顺序表的整理,顺序存储方法即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法,以数组为载体。
线性表的基本操作包括初始化、销毁、判断表空、查询表长、插入、删除、查询指定位置元素值、查询指定元素位置、输出表。
Status InitList(SeqList *L); //初始化
Status DestroyList(SeqList *L); //销毁
Status IsEmpty(SeqList L, int *empty); //判断是否为空,将结果返回empty,
Status GetLength(SeqList L, int *lenp); //查询表长,将结果返回给lenp
Status InsertList(SeqList *L, int i, ElemType e); //插入操作
Status DeleteList(SeqList *L, int i, ElemType *e); //删除操作
Status GetData(SeqList L, int i, ElemType *e); //查询指定位置元素
Status GetLocation(SeqList L, int *i, ElemType e); //查询指定元素位置
Status PrintList(SeqList L); //输出表中所有元素
定义顺序表的存储结构:
typedef int ElemType; //ElemType的类型可根据实际情况而定,这里假设为int
typedef struct {
ElemType *dataspace; //存储空间的首地址,相当于数组dataspace[0]
int len; //标记存储元素的位置
}SeqList;
注意:表的长度=len+1
1、初始化顺序表:
Status InitList(SeqList *L) { //需要改变线性表的状态,所以传指针
L->dataspace = (ElemType *)malloc(sizeof(ElemType)*MAXSIZE); //分配一个ElemType类型,长度为MAXSIZE的空间(即一个长度为MAXSIZE的数组),将首地址赋给dataspace
if (L->dataspace == NULL) //如果数组首地址空间为NULL,申请空间失败,返回ERROR
return ERROR;
L->len = 0; //顺序表中没有元素
return OK;
}
2、销毁线性表:
Status DestroyList(SeqList *L) {
if (L->dataspace == NULL) //申请空间失败,所以也就进行无法销毁操作,返回ERROR
return ERROR;
free(L->dataspace); //释放首地址的空间(与malloc函数对应)
L->dataspace = NULL; //将dataspace指针置空
L->len = 0; //置0(可做可不做)
return OK;
}
注意释放dataspace的空间后,需要将该指针置空
3、判断是否为空:
Status IsEmpty(SeqList L, int *empty) {
if (L.dataspace == NULL) //判断是否初始化
return ERROR;
*empty = (L.len == 0); //顺序表长度为0时,*empty为1,表示空表
return OK;
}
4、查询表长
Status GetLength(SeqList L, int *lenp) { //查询表长,将结果赋给lenp返回主调函数
if (L.dataspace == NULL)
return ERROR;
*lenp = L.len; //长度值赋给*lenp
return OK;
}
5、插入操作
Status InsertList(SeqList *L, int i, ElemType e) { //在表中第i个位置,插入元素e
int p;
if ( L->dataspace == NULL || (i > L->len + 1 || i