一、线性表定义:1. 线性表(list)是零个或多个数据元素的集合。2. 线性表中的数据元素之间是有顺序的。3. 线性表中数据元素个数是有限的。4. 线性表中数据元素类型必须相同。
数学上的定义:线性表是具有相同类型的n(n>=0)个数元素的有限序列。(a1, a2, ..., an)。ai是表项,n是长度。
二、性质:1. a0为线性表第一个元素,只有一个后继。2. an为线性表最后一个元素,只有一个前驱。3. 除了a0和an,其它表项都拥有前驱和后继。4. 线性表能够逐项访问和顺序存取。
三、线性表的操作:1. 创建线性表。2. 销毁线性表。3. 清空线性表。4. 将元素插入线性表中。5. 将元素从线性表中删除。6. 获取线性表中某个位置的元素。7. 获取线性表的长度。
四、线性表在程序中表现为一种特殊的数据类型。一般是需要我们自己抽象,然后自定义类型(struct)。
五、线性表的操作在程序中的表现为一组函数(api)。
六、线性表的物理结构分为顺序存储和链式存储。
七、线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表中的数据元素。一般是需要我们在代码实现中维护着一段地址连续的内存空间,可以理解为数组。
八、线性表顺序存储的设计与实现
1. 插入元素的算法:①判断线性表是否合法。②判断插入位置是否合法。③把最后一个元素到插入位置的元素依次后移一个位置。④将新元素插入。⑤线性表长度加1 。
2.获取线性表中元素的算法:①判断线性表是否合法。②判断位置是否合法。③直接通过数组下标的方式获取元素。
3.删除元素的算法:①判断线性表是否合法。②判断删除位置是否合法。③将元素取出。④将删除元素之后的元素向前移动一个位置。⑤线性表长度减一。
九、顺序储存的线性表优缺点:
1. 优点:无需为线性表中的逻辑关系增加额外的空间(可理解为固定长度的数组)。可以快速的获取表中合法位置的元素。
2. 缺点:在元素基数很大的情况下,插入和删除操作需要前后移动大量的元素。不能动态的分配存储空间。
十、线性表的链式存储:为了表示每个数据元素与其后继元素之间的逻辑关系,每个元素除了存储自身的信息外,还需要存储其后继节点的信息。
十一、表头结点、数据结点、尾结点
1. 表头结点:链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息,如链表长度。
2. 数据结点:链表中代表数据元素的结点,包含指向下一个元素的指针和数据元素的信息。
3. 尾结点:链表中的最后一个数据结点,其下一个元素指针为空,表示无后继。
十二、链表的设计与实现
1. 在C语言中可以用结构体来定义链表中的指针域,链表中的头结点也可以用结构体实现。
//结点指针域定义
typedef struct _LinkListNode
{
struct _LinkListNode* next;
};
//头结点定义
typedef struct _LinkList
{
LinkListNode header;
int length;
};
//数据元素定义
struct BusinessBode
{
LinkListNode node;
int value;
}
2. 插入元素
3. 获取元素
//带头结点、位置从0的单链表
//返回链表中第3个位置处,元素的值
LinkListNode* LinkList_Get(LinkList* list, intpos)
{
int i = 0;
TLinkList *tList = (TLinkList *)list;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
if (list==NULL ||pos<0 || pos>=tList->length)
{
return NULL;
}
current = (LinkListNode *)tList;
for (i=0; i<pos; i++)
{
current = current->next;
}
ret = current->next;
return ret ;
}
4. 删除元素
十二、链表的优缺点
1. 优点:无需一次性定制链表的容量,插入和删除无需移动数据元素。
2. 缺点:数据元素必须保存后继元素的位置信息,获取指定数据的元素操作需要顺序访问之前的元素。