线性表介绍及顺序表实现
什么是线性表
线性表就是零个或多个相同元素的有限序列。
一个长度为n(n>=0)的线性表可以表示为:
L=(a0,a1,……ai-1,ai,ai+1……an)
序列:元素和元素之间有着前后之分。其中ai+1 称作ai的后继,ai-1称作ai的前驱。
有限:线性表的长度必须是有限长的(计算机所能处理的数据必须是有限的)。
相同元素:简单来说表中的元素的数据类型必须是一致的。
零个:表中可以没有元素,即表是空表的情况下,表也是存在的。
线性表的分类
根据存储方式的不同,可以分为顺序表和链表。
顺序表:将线性表中的元素按照顺序存储的方式存储于一片连续的存储空间中。(采用数组的形式实现)
链表:线性表采用链式存储结构的方式存储。(可分为单链表、双链表、循环链表等)
线性表的特点
(1)线性表的表头无前驱(非空表);
(2)线性表的表尾,无后继;
(3)除了表头和表尾,其它每个元素只有一个直接前驱和一个直接后继。
顺序表
顺序表的基本运算及实现
数据定义
#define MAXLEN 100 //采用宏定义设置表的长度
typedef int data_ty; // 对表中元素数据类型进行重命名,便于复用
typedef struct sequence_list
{
data_ty data[MAXLEN];
int tail; //存放当前表中最后一个元素的位置
}seqlist, *seqlist_p;
(1)建立一个空表
目的为了开辟一段表的存储空间,此时表为空,因此表中最后一个元素位置设为-1;
bool seqlist_create(seqlist_p *p)
{
if (NULL == ((*p) = (seqlist_p)malloc(sizeof(seqlist))))
{
puts("malloc failed");
return false;
}
(*p)->tail = -1; //规定当尾部元素位置为-1,即表为空
return true;
}
(2)清空一个表
这里仅仅是抛弃表中的元素,相当于恢复到空表(表依然存在)
void seqlist_clear(seqlist_p p)
{
p->tail = -1;
}
(3)判断表是否为空
当表尾元素的位置等于-1,即为空表
bool seqlist_empty(seqlist_p p)
{
if (p->tail == -1)
return true;
return false;
}
(4)判断表是否满
当表尾元素的位置等于表的长度减一,即为满表
bool seqlist_full(seqlist_p p)
{
if (p->tail == MAXLEN - 1)
return true;
return false;
}
(5)取出表中的某个元素
这里的位置pos与存放表的数组的下标等价
bool seqlist_out_pos(seqlist_p p,int pos,data_ty *D)
{
if (pos < 0 || pos > p->tail)
{
puts("position invaild");
*D = -1;
return false;
}
*D = p->data[pos];
return true;
}
(6)确定某元素位置
int seqlist_find(seqlist_p p,data_ty da)