定义
线性表是由n(n≥0)个数据元素(结点)组成的有限序列。
特点
在数据元素的非空有限集中:
- 存在唯一的一个被称做“第一个”的数据元素。
- 存在唯一的一个被称作”最后一个“的数据元素。
- 除第一个之外,集合中的每个数据元素均只有一个前驱。
- 除最后一个之外,集合中每个数据元素均只有一个后继。
表示
大体上分两类,顺序表示和链式表示。
顺序表
存储空间是连续地,以数组的形式表示。
优点:
可随机存取表中任一元素。(由于物理位置的连续)
弱点:
插入和删除元素的操作几乎都要移动另外的元素,移动元素的数目取决于操作的位置。
数据结构:
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}
链表
顺序表在逻辑关系上相邻的两个元素,在物理位置上也相邻的,而链表则不是。
优点:
插入和删除元素不需要移动元素。
缺点:
不能随机存取元素。
分类:
线性链表(或称单链表)、静态单链表、循环链表、双向链表。
数据结构:
单链表
typedef struct LNode{
ElemType data;
struct Lnode *next; //指向下一个元素的指针
}LNode,*LinkList;
静态单链表(用于不设”指针“类型的高级程序设计语言中使用链表结构)
typedef struct{
ElemType data;
int cur; //下一个元素在数组中的下标
}component,SLinkList[MAXSIZE];
循环链表(结构与单链表一样,只是尾结点指向头结点)
双向链表
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList
单链表和双向链表比较:
双向链表可以说是单链表的增强,增加了一个指针域,克服了单链表只能顺指针往后寻查其他结点的问题。