线性表的定义
零个或多个数据元素的有限序列
。
数学图形定义描述如下:
首元素a1
无前驱元素,尾元素an
无后继元素。中间元素都有唯一的前驱和后继元素。
n(n >= 0)
是线性表的长度,n = 0
时,线性表是空表。
线性表的每个数据元素的类型都相同。
线性表的存储结构
线性表的顺序存储结构
线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
由于线性表的每个数据元素的类型都相同且是连续不断的,所以在C 语言(其他语言也相同)中一般用的一维数组来实现顺序存储结构。
描述线性表顺序存储的数据结构:
#define MAX_ARRY_SIZE 50 //线性表中数组的长度
typedef struct LinearList
{
int data_array[MAX_ARRY_SIZE]; //数据区
int list_len; //线性表的长度
}LinearList_t,*P_LINEAR_LIST;
描述线性表顺序存储的数据结构:
1、MAX_ARRY_SIZE
存储数据的区域的空间的大小
2、data_array
存储数据的区域的空间
3、list_len
当前线性表的长度
当前线性表的长度list_len
和数组的长度MAX_ARRY_SIZE
是两个概念。
list_len
是指当前线性表中有多少个元素,随着插入or删除操作变化。而MAX_ARRY_SIZE
是数据数组的大小,是不变的。 list_len
总是小于等于 MAX_ARRY_SIZE
。
获取元素
/*
* 获取线性表中的元素
* list 要操作的线性表 index 线性表中的第几个元素
*/
int GetLinearListItem(LinearList_t list,int index)
{
if(list.list_len == 0 || index > MAX_ARRY_SIZE || index < 0)
{
return FALSE;
}
return list.data_array[index-1];
}
遍历线性表
void TraversingLinearList(P_LINEAR_LIST p_list)
{
int index;
if(p_list->list_len == 0)
return;
for(index = 0;index < p_list->list_len;index++)
{
printf("第%d元素为%d\r\n",index+1,p_list->data_array[index]);
}
}
插入元素
/*
* 向线性表中插入元素
* p_list 要操作的线性表 insert_item要插入的元素 index 线性表中的第几个元素
*/
void InsertLinearListItem(P_LINEAR_LIST p_list,int insert_item,int index)
{
int i;
//线性表已满
if(p_list->list_len >= MAX_ARRY_SIZE)
{
return FALSE;
}
//插入位置不合理
if(index > MAX_ARRY_SIZE || index < 1)
{
return FALSE;
}
/* 如果插入元素合理不在表尾 */
if(index <= MAX_ARRY_SIZE)
{
for(i = p_list->list_len-1;i >= index-1;i--)//插入元素位置后的元素往后挪一位
{
p_list->data_array[i+1] = p_list->data_array[i];
}
}
p_list->data_array[index-1] = insert_item;
p_list->list_len++;
}
删除元素
int DeleteLinearListItem(P_LINEAR_LIST p_list,int index)
{
int i;
int ret_val;
if(p_list->list_len == 0) //如果线性表为空
{
return FALSE;
}
if(index > MAX_ARRY_SIZE || index < 1) //删除位置不合理
{
return FALSE;
}
ret_val = p_list->data_array[index-1];
if(index < p_list->list_len)
{
for(i = index; i < p_list->list_len; i++) //将删除位置的后的元素往前挪一位
{
p_list->data_array[i-1] = p_list->data_array[i];
}
}
p_list->list_len--;
return ret_val; //返回被删除的元素
}
线性表顺序存储结构的优缺点
线性表的链式存储结构
线性表链式存储结构定义
为了表示每个数据元素a1
与其直接后继数据元素a+1
之间的逻辑关系,对数据元素ai
来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域
,把存储直接后继位置的域称为指针域
。指针域中存储的信息称做指针
或链
。这两部分信息组成数据元素ai的存储映像,称为结点
(Node
)。
PS:
学习书籍:《大话数据结构》