一、定义、特点
1、定义
线性表是包含若F数据元素的一个线性序列
记为: L=(ao1 … ai-1, a, ai+1… an-1) L为表名,
ai(0si≤n-1)为数据元素; n为表长,n>O时,
线性表L为非空表,否则为空表。 线性表L可用二元组形式描述: L= (D,R)
即线性表L包含数据元素集合D和关系集合R D={a;a; E datatypei=0,1, 2,…,n≥0}
R={<a;,ai+1> | a; ,ai+1∈D, 0≤i≤n-2}
关系符<a;, a+1>在这 里称为有序对
表示任意相邻的两个元素之间的一种先后次序关系 ai是ai+1的直接前驱,ai+1是ai的直接后继
2、特点
线性表的特征: 1)对非空表,ag是表头,无前驱; 2) an1是表尾,无后继;
3)其它的每个元素ai有且仅有一个直接前驱ai-1和一个后继ai+1
3、存储结构
若将线性表L=ag21… )中的各元素依次存储于计算机片连续灼存储空间。
设Loc(a;)为a;的地址,Loc(ao)=b,每个元素占d个单元,则:Loc(ai)=b+i*d
4、顺序存储特点
- 逻辑上相邻的元素ai, ai+1其存储位置也是相邻的
- 对数据元ai的存取为随机存取或按地址存取
- 存储密度高
存储密度D=(数据结构中元素所占存储空间)/(整个数据所占的存储空间)
缺点:对表的插入和删除等运算的时间复杂度较差。
二、实现方法
在C语言中,可借助于一维数组类型来描述线性表的顺序存储结构
我们的代码要规范:
1、自己可以不同的项目用
2、其他同事用
3、外包公司给.h .so文件
1、建一个空表
sqlink list_create()
{ /*malloc*/
sqlink List;
List = (sqlink)malloc(sizeof(sqlist));
if (List == NULL) {
printf("creare:list malloc failed\n");
return List;
}
/*initialize*/
memset(List, 0, sizeof(sqlist));/*清零*/
List->last = -1;/*last = -1:表示链表为空*/
printf("List create success!");
return List;
}
2、置空一个表
int lsit_clear(sqlink List)
{
if (List == NULL) {
return -1;
}
memset(List, 0, sizeof(sqlist));
List->last = -1;
return 0;
}
3、判断一个表是否为空
int list_empty(sqlink List)
{
if (List->last == -1) {
return 0;
}
else {
return - 1;
}
}
4、判断一个表是否为满
int list_full(sqlink List)
{
if (List->last == (N-1)) {
return 0;
}
else {
return -1;
}
}
5、求表长度
int list_length(sqlink List)
{
if (List == NULL) {
return -1;
}
return (List->last + 1);
}
6、判断表中是否存在某个元素
int list_loacte(sqlink List, data_t value)
{
int i = 0;
if (List == NULL) {
printf("loacte:List is NULL!");
return -1;
}
for (i = 0; i <= List->last; i++) {
if (List->data[i] == value) {
return i;
}
}
return -1;
}
7、删除某个位置的元素
int list_delete_one(sqlink List, int pos)
{
int i = 0;
if (List == NULL) {
printf("delete_one: List is NULL!");
return - 1;
}
/*pos[0,last]*/
if (pos < 0 || pos > List->last) {
printf("delete_one: pos is invalid!");
return - 1;
}
/*move pos [pos+1,last]*/
for (i = pos + 1; i <= List->last; i++) {
List->data[i - 1] = List->data[i];
}
/*updata*/
List->last--;
return 0;
}
8、在指定位置插入元素
int list_insert(sqlink List, data_t value, int pos)
{
int i = 0;
if (List->last == N - 1) {
printf("insert:List is fail!");
return -1;
}
/*check param 0 <= pos <= N-1 */
if (pos <= 0 || pos >= List->last + 1) {
printf("insert:pos is invalid!\n");
return -1;
}
/*move*/
for (i = List->last; i >= pos; i--) {
List->data[i + 1] = List->data[1];
}
/*updata value last*/
List->data[pos] = value;
List->last++;
return 0;
}
9、合并两个链表
int list_merge(sqlink List1, sqlink List2)
{
int i = 0, ret = 0;
if (List1 == NULL || List2 == NULL) {
printf("merge:List is NULL");
return -1;
}
while (i <= List2->last)
{
ret = list_loacte(List1, List2->data[i]);
if (ret == -1) {
if (list_insrte(List1, List2->data[i], List1->last + 1) == -1) {
return -1;
}
}
i++;
}
return 0;
}
10、打印链表
int list_show(sqlink List)
{
int i = 0;
if (List == NULL) {
printrf("show:list is NUll!\n");
return -1;
}
for (i = 0; i <= List->last; i++) {
printf("%d", List->data[i]);
}
puts("");
return 0;
}
三、总结
这里只是把所有的功能函数展示出来了,并没有实际的应用!