今天开始复习了一下数据结构的知识.用的书是严蔚敏版本的<<数据结构>>
线性表
线性表:诸如由n(n>=0)个数据特性相同的元素构成的有限序列叫做线性表.
从定义可以提取两点:
(1)线性表的元素应属于同一数据对象.比如:全部属于int类型,全部属于char类型,或者全部属于同一个类类型的对象(学生,教师等).
(2)线性表的长度是有限的.
注意几个专业术语:数据元素,数据项(它们的区别:数据元素里可以有数据项,数据元素是对于线性表而言,数据项是对于数据元素而言。即线性表包含数据元素,数据元素包含数据项)
线性表的长度:线性表的元素个数n(n>=0)
非空线性表(或者线性结构)特点:
(1)存在唯一的一个被称作“第一个”的数据元素
(2)存在唯一的一个被称作“最后一个”的数据元素
(3)除第一个外,结构中的每一个元素均只有一个前驱
(4)出最后一个外,结构中的每一个元素均只有一个后继续
从3,4点可以知道何为“线性”
专业术语:前驱,后继
线性表按表示方式可以分为两大类:顺序表示,链式表示
顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素.特点:(1)逻辑上相连的数据元素物理上也是相邻的.(2)顺序存储,随机存取
典型例子:数组.
链式表示:用一组任意的存储单元存储线性表的数据元素(注意,存储单元可以是连续的,也可以是不连续的.实际中一般都是不连续的)
这里,线性表的数据元素又被称作结点,结点有两个域:数据域,指针域
数据域:存储数据元素信息
指针域:存储直接后继存储位置信息,又称作链(从这里可以知道为什么叫链表)
链式表示的线性表比顺序表示的线性表的数据元素多了一个指针域为什么?
首先存储线性表我们需要存储两部分信息,一个是数据元素本身的数据,另一个就是数据元素之间的逻辑关系.
因为顺序表示的线性表的数据元素之间的逻辑关系和数据存储位置一致,所以我们不需要再开辟数据域去存储
但是链式表示的线性表的数据元素存储位置不一定连续,所以多了一个指针域去描述数据元素之间的逻辑关系。
关于链表的头结点和头指针:
头结点:为了处理方便,在单链表的第一个结点之前附设一个结点,头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等类似的附加信息,所以头结点可有可无.
头指针:表示链表中第一个结点的存储位置.
对表的操作一般两种:查找(按序号和按值)和插入数据
创建单链表时有两种方法需要知道:
前插法:逐个将结点插入到头结点之后(该链表拥有头结点)
后插法:逐个将结点插入到链表表尾(所以需要有一个指针指向链表表尾,方便每次插入新数据时快速定位)
前插法算法描述:
void CreateList_F(LinkList & L,int n){
//注意,这里是你需逆序输入n个元素的值,建立带头结点的单链表L
L=new LNode;
for(int i=n;i>0;--i){
p=new LNode; //生成新结点
cin>>p->data; //插入元素值
p->next=L-next; L-next=p;//插入到表头
}
}
后插法:
void CreateList_L(LinkList &L,int n){
//正序输入
L=new LNode;
L-next=null; //先建立一个带头结点的单链表
for(int i=0;i<n;++i){
p=new LNode; //生成新结点
cin>>p->data; //输入数据值
p->next=null;r->next=p; //将新元素插入表尾
r=p; //指向新的尾节点
}
}
总的来说:
顺序表 顺序存储,随机存取,适用于查找比较多的情况
链式表 随机存储,顺序存取,适用于插入比较多的情况