线性表是包含若干数据元素的一个线性序列,记为: L = (a0,…ai-1,ai,ai+1,…an-1)
线性表L可用二元组形式描述(程序员间的表述):
L = (D,R)
即线性表 L 包含数据元素集合 D 和关系集合 R
D = {ai | ai ∈ datatype ,i=0,1,2, …n-1 ,n≥0}
R = {i, ai+1> | ai,ai+1∈D,0 ≤ i ≤ n-2}

若将线性表 L = (a0,a1,…,an-1) 中的各元素依次存储于计算机一片连续的存储空间。
设 Loc(ai) 为 ai 的地址,Loc(a0) = b,每个元素占 d 个单元, 则:Loc(ai) = b + i*d
在 C 语言中,可借助于一维数组类型来描述线性表的顺序存储结构:
#define N 100
typedef int data_t;
typedef struct
{
data_t data[N]; //表的存储空间;
int last;
} sqlist, *sqlink;

上面的代码可以这么理解:
typedef struct sqlist 可以看作是整个图书馆,而这里的 data[N] 是图书馆里的书,结构体里的 last 就可以看作是一共有多少本书,虽然叫作 last 是因为它是顺序表里最后一个元素的下标,但是这个下标也可以标识一共有多少本书,只要可以代表总数,也可以换成别的。设线性表 L = (a0,a1,…,an-1) , 对 L 的基本运算有:
1)建立一个空表:list_create(L)
2)置空表:list_clear(L)。若成功返回1,失败返回0。
3)判断表是否为空:list_empty(L)。若表为空,返回值为 0,否则返回 -1
4)求表长:length(L)
5)取表中某个元素:GetList(L,i),即ai。要求0≤ i ≤ length(L) - 1
6)定位运算:Locate(L,x)。确定元素 x 在表 L 中的位置(或序号)
L
o
c
a
t
e
(
L
,
x
)
=
{
i
当元素
x
=
a
i
∈
L
,且
a
i
是第一个与
x
相等时
−
1
当
x
不属于
L
时
Locate(L,x)=\left\{
7)插入:Insert(L,x,i)。将元素 x 插入到表 L 中第 i 个元素 ai 之前,且表长 +1。
我们在实现时一般会写三个文件(顺序表):
1、sqlist.h 定义数据结构,定义线性表运算
2、sqlist.c 实现线性表运算
3、 test.c 实现实际功能,调 sqlist.h 接口
这样写的好处是:①结构清晰; ②代码复用性高:自己可以反复用,不管是现在的项目,还是以后的项目都可以用;同事也可以用。③给外包公司接口,实现部分给他们二进制 .so 文件,这样以后业务升级还找你
分文件编写以后怎么编译运行呢?
可以一条一条的把 .c 汇编为 .o ,最后链接 .o 和 库文件 运行:
例如:
gcc -c sqlist.c -o sqlist.o
gcc -c test.c -o test.o
gcc test.o sqlist.o -o test
利用简洁的命令进行编译执行:
gcc *.c -o test
利用 Makefile 进行编译
SRC=sqlist.c
SRC+=test.c
test:$(SRC)
gcc $^ -o $@
.PHONY:clean
clean:
rm *.o
创建顺序表 list_create()
sqlink list_create()
{
//malloc
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));
if(L == NULL)
{
printf("list malloc failed!\n");
return L;
}
//init
memset(L, 0, sizeof(sqlist));
L->last = -1;
//return
return L;
}
清空顺序表 list_clear(sqlink L)
int list_clear(sqlink L)
{
if(L == NULL)
{
printf("the list is null!\n");
return -1;
}
memset(L, 0, sizeof(sqlist));
L->last = -1;
return 0;
}
判断顺序表是否为空表 list_empty(sqlink L)
int list_empty(sqlink L)
{
if (L == NULL)
{
printf("illegal operation!\n");
return -1;
}
if (L->last == -1)
{
return 0;
}
else
{
return 1;
}
}
计算顺序表长度 list_length(sqlink L)
int list_length(sqlink L)
{
if (L == NULL)
{
return -1;
}
return (L->last + 1);
}
向顺序表中插入元素

int list_insert(sqlink L, data_t value, int pos)
{
int i;
if (L->last == N - 1)
{
printf("the list is full!\n");
return -1;
}
if (pos < 0 || pos > L->last + 1)
{
printf("the insertion position is invalid\n");
return -1;
}
for (i = L->last; i <= pos ; i--)
{
L->data[i+1] = L->data[i];
}
L->data[pos] = value;
L->last++;
return 0;
}
打印顺序表 list_show(sqlink L)
int list_show(sqlink L)
{
int i;
if (L == NULL)
{
printf("invalid!\n");
return -1;
}
if (L->last == -1)
{
printf("the list is null!\n");
return 0;
}
for (i = 0; i <= L->last; i++)
{
printf("%d ", L->data[i]);
}
printf("\n");
销毁顺序表 list_free(sqlink L) ,因为有时候程序并不能主动释放顺序表内存空间,一直占用内存会造成浪费
int list_delete(sqlink L)
{
if (L == NULL)
{
printf("invalid!\n");
return -1;
}
free(L);
L = NULL;
return 0;
}