2.2.1线性表顺序存储定义
线性表的顺序存储结构是指用一段连续的存储单元依次存储线性表中的数据元素。
线性表的顺序存储结构的示意图如下:
| ... | ... |
假设线性表中的每个元素占L个单元,那么第个数据元素的存储位置和第
个数据元素的存储位置满足关系:
2.2.2 线性表顺序存储的特点
用物理位置相邻来表示数据元素之间的逻辑关系,任一数据元素都可以随机存取。
2.2.3 线性表的表示
#define MAXSIZE 100 //线性表的最大存储空间
typedef int ElemType; //定义线性表数据元素的数据类型
typedef struct
{
ElemType data[MAXSIZE]; //使用数组存储数据元素,数组的大小为MAXSIZE
int length; //线性表的长度
}Sqlist;
2.2.4 线性表的实现
1、线性表的初始化
/*Function name: Init_Sqlist
**Description: 线性表初始化
**Parameter:
**@L: 要初始化的线性表
**Return: 0:success, other:false
*/
int Init_Sqlist(Sqlist*L)
{
L->data = (ElemType *)malloc(sizeof(Sqlist) * MAXSIZE); //给线性表的数据元素数量分配空间
L->length = 0;
if (!L->data)
return 1;
else
return 0;
}
2、判断线性表是否为空
/*Function name: SqlistEmpty
**Description: 判断线性表是否为空
**Parameter:
*@L: 线性表
**Return: 0:success,other:fail
*/
int SqlistEmpty(Sqlist L)
{
if (L.length == 0)
return 0;
else
return 1;
}
3、获取线性表中的数据元素
/*Function name: GetElem
**Description: 获取线性表的数据元素
*Parameter:
*@L: 线性表
*@index: 第index个数据元素
*@e: 传出参数,用于保存获取的数据元素
**Return: 0:success,other:fail
*/
int GetElem(Sqlist L, int index, ElemType *e)
{
if (index < 1 || index > L.length)
return 1;
*e = L.data[index-1];
return 0;
}
4、获取线性表第index个数据元素的直接前趋
/*Function name: PriorElem
**Description: 获取数据元素的直接前趋
**Paramter:
*@L: 线性表
*@index: 第index个数据元素
*@pre_e: 传出参数,用于保存第index个数据元素的直接前趋
**Return: 0:success,other:fail
*/
int PriorElem(Sqlist L, int index, ElemType *pre_e)
{
if (index <= 2 || index > L.length)
return 1;
*pre_e = L.data[index-2];
return 0;
}
5、获取线性表第index个数据元素的直接后继
/*Function name: NextElem
**Description: 获取第index个数据元素的直接后继
**Parameter:
*@L: 线性表
*@index: 第index个数据元素
*@next_e: 传出参数
**Return: 0:success,other:fail
*/
int NextElem(Sqlist L, int index, ElemType *next_e)
{
if (index <= 0 || index >= L.length)
return 1;
*next_e = L.data[index];
return 0;
}
6、插入数据元素
/*Function name: ListInsert
**Description: 插入数据元素
**Parameter:
*@L 线性表
*@index 数据元素插入的位置
*@e 插入数据元素的值
*Return 0:success,other:fail
*/
int ListInsert(SqlList *L, int index, ElemType e)
{
if (L->length == MAXSIZE)
return 1;
if (index < 1 || index > L->length+1)
return 1;
if (index <= L->length) //如果数据元素插入的位置不在表尾 {
for (int i = L->length-1; i >= index-1; i--)
L->data[i+1] = L->data[i];
}
L->data[index-1] = e;
L->length++;
return 0;
}
7、删除数据元素
/*Function name: ListDelete
**Description: 删除数据元素
**Parameter:
*@L 线性表
*@index 数据元素的位置
*@e 传出参数
**Return: 0:success,other:fail
*/
int ListDelete(Sqlist *L, int index, ElemType *e)
{
if (L->length == 0)
return 1;
if (index < 1 || index > L->length)
return 1;
*e = L->data[index-1];
if (index < L->length) //如果删除的数据元素不在表尾
{
for (int i = index-1; i < L->length-1; i++)
L->data[i] = L->data[i+1];
}
L->length--;
return 0;
}
8、获取线性表的长度
/*Function name: ListLength
**Description: 获取线性表的长度
**Parameter:
*@L 线性表
**Return: 线性表的长度
*/
int ListLength(Sqlist L)
{
return L.length;
}
9、清空线性表
/*Function name: ClearList
**Description: 清空线性表
**Parameter:
*@L 线性表
*Return void
*/
void ClearList(Sqlist *L)
{
L->length=0;
}
10、销毁线性表
/*Function name: DestoryList
**Description: 销毁线性表
**Parameter:
*@L 线性表
*Return: void
*/
void DestoryList(Sqlist *L)
{
if (L->data)
free(L->data);
}
2.3.5 线性表顺序存储的优缺点
优点:
1、不需要另外的存储空间来表示顺序表中的数据元素的逻辑关系;
2、可以快速存取表中的任一位置的数据元素。
缺点:
1、插入和删除操作需要移动大量数据元素;
2、当线性表长度变化较大时,很难确定存储空间的容量;
3、造成存储利用不充分。
1108

被折叠的 条评论
为什么被折叠?



