顺序表
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。
顺序表的存储结构
typedef unsigned int ElemType; //ElemType类型根据实际情况而定
#define MAXSIZE 5 //存储空间最大值
typedef struct
{
ElemType elem[MAXSIZE]; //数组存储数据,最大值为MAXSIZE
unsigned int length; //线性表当前长度(当前元素个数)
}SqList; //顺序表的结构类型
顺序表中基本操作的实现
初始化
顺序表的初始化操作就是构造一个空的顺序表。
void SqList_Init(SqList* L)
{
L->length = 0;
}
取值
取值操作是根据指定的位置序号 i,获取顺序表中第 i 个数据元素的值,i 从0开始。
printf("%d\n", L.elem[0]);
顺序表的长度
printf("%d\n", L.length);
遍历
void SqList_Traverse(SqList L)
{
assert(L.length != 0); //断言,顺序表不空
for (unsigned int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
追加元素
void SqList_Append(SqList* L, ElemType e)
{
assert(L->length < MAXSIZE); //断言,length < MAXSIZE
L->elem[L->length] = e;
L->length += 1;
}
插入元素
一般情况下,在第 i 个位置插入一个元素时,需从最后一个元素开始,依次向后移动一个位置,直至第 i 个元素。
void SqList_Insert(SqList* L, unsigned int i, ElemType e)
{
assert(L->length != 0); //断言,顺序表不空
assert( i < L->length); //断言, i < L->length
assert(L->length != MAXSIZE); //断言,L->length != MAXSIZE
for (unsigned int j = L->length; j > i; j--)
{
L->elem[j] = L->elem[j - 1]; //所有元素向后移动一个元素
}
L->elem[i] = e;
L->length += 1;
}
删除元素
一般情况下,删除第 i 个元素时需将第 i+1 个至第 n 个元素依次向前移动一个位置( i=n 时无需移动)。
ElemType SqList_Delete(SqList* L, unsigned int i)
{
assert(L->length != 0); //断言,顺序表不空
assert(i < L->length); //断言, i < L->length
ElemType e = L->elem[i];
for (unsigned int j = i; j < L->length; j++)
{
L->elem[j] = L->elem[j + 1]; //所有元素向前移动一个元素
}
L->length -= 1;
return e;
}
测式代码
SqList list;
LSqList_Init(&list);
LSqList_Append(&list, 0);
LSqList_Append(&list, 1);
LSqList_Append(&list, 2);
LSqList_Append(&list, 3);
LSqList_Append(&list, 4);
LSqList_Traverse(list);
printf("%d\n", list.length);
LSqList_Delete(&list, 4);
LSqList_Traverse(list);
LSqList_Insert(&list, 0, 9);
LSqList_Traverse(list);
// LSqList_Append(&list, 6);
printf("%d\n", list.elem[0]);
测式结果:
0 1 2 3 4
5
0 1 2 3
9 0 1 2 3
9