当前位置:文档之家› 数据结构c语言版学习笔记-线性表

数据结构c语言版学习笔记-线性表

线性表
线性结构
最常用最简单的数据结构,而线性表是一种典型的线性结构,基本特点是,线性表中的数据元素是有序且有限的。

在这种结构中:
1.存在一个唯一的被称为“第一个”的数据元素
2.存在一个唯一的被称为“最后一个”的数据元素
3.除第一个元素外,每个元素均有唯一一个直接前驱
4.除最后一个元素外,每个元素均有唯一一个直接后继
线性表定义:是由n(n>=0)个数据元素(节点),a1,a2…an组成的有限序列。

该序列中所有的数据节点具有相同的数据类型,其中数据元素的个数n称之为线性表的长度。

线性表的抽象数据类型定义
ADT List{
数据对象:D={ | ∈ ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={ <ai-1 ,ai >| ,∈D, i=2,...,n }
数据操作:
InitList(*L):初始化操作,建立一个空的线性表
ListEmpty(L):若线性表为空,返回True,否则返回False
ClearList(*L):将线性表清空。

GetElem(L,i,e):将线性表L中的第i个位置元素赋值给e LocateElem(L,e):在线性表L中查找与给定值e相等的元
素,如果查找成功返回该元素在表中序号表示

功,否则,返回0表示失败
ListInsert(*L,i,e):在线性表L中的i个位置插入新元素e ListDelete(*L,i,*e):删除线性表L中地i个位置元素,并
用e返回其值
ListLength(L):返回线性表L的元素个数
}
线性表的顺序存储结构
顺序存储:把线性表的节点按逻辑顺序依次存放在一组地址连续的存储单元里。

用这种方法存储的线性表简称顺序表。

特点:线性表的物理顺序与逻辑顺序一致;数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现的。

注:在高级语言环境下,数组具有随机存取的特性,因此借助数组来表示顺序表
typedef struct SeqList
{
ElemType array[MAXSIZE];
int count;//保存线性表中的元素个数
}SeqList
线性表的链式存储结构
链式存储:用一组任意的存储单元存储线性表中的数据元素,用这种方式存储的线性表简称为线性链表。

特点:存储单元可连续可不连续,可零散分布任意位置,因此链表中的元素的逻辑顺序与物理顺序不一定相同。

结构:为了正确表示元素间的逻辑关系,在存储每个元素值的同时,还必须存储其后继节点的位置,称为指针或链,这两部分组成了链表的节点结构。

基本操作:
1.节点赋值
LNode *p;p=(LNode*)malloc(sizeof(LNode)); p->data=20;p->next=NULL
2.指针的操作
单链表的基本操作
单链表:每一个结点只包含一个指针域的链表称为单链表。

1.建立单链表
头插入法:每次插入的节点都作为链表的第一个节点,生成的链表中元素的次序和输入的次序相反
尾插入法:新结点插入到当前链表的表尾,使其成为当前链表的尾结点
2.单链表的查找
按序号查找:对于单链表,不能像顺序表一样直接按序号i访问节点,而只能从链表的头节点出发,沿着链域next逐个节点搜索,直到搜索到第i个节点为止。

链表不是随机存取结构,是顺序存取结构
按值查找:在链表中查找是否有节点值等于给定值的节点,如有,则返回节点的地址,如没有,则返回null。

3.单链表插入
插入运算是将值为e的新节点插入到表的第i个节点上,即插入到第i-1与i之间的位置,因此要先找到i-1所在节点p,将新节点作为p的直接后继节点
4.单链表删除
基本思路:(1)查找所要删除的节点定位;(2)建立其前节点和后节点的链接;(3)删除该位置free();
注意:需要加几个判断条件,因为无法预知链表的长度,所以在定位的时候直接需要防止操作出链表,设单链表长度为n,则删除第i个结点仅当1≤i≤n时是合法的。

则当i=n+1 时,虽然被删结点不存在,但其前趋结点却存在(即终端结点)。

故判断条件之一是p–>next!=NULL
按序号删除:删除单链表第i个节点,首先找到第i-1的节点p,然后将p的next直接指向i节点的后继节点。

最后释放ai的存储空间。

按值删除:删除单链表中值为key的节点。

变形练习1:删除值为key的所有节点变形练习2:删除所有值重复的节点。

5.单链表合并:
设两个有序单链表,头指针分别指向La,Lb,将他们合并为Lc为头指针的有序链表.
循环链表
定义:一种头尾相接的链表,其特点是最后一个节点的指针域指向链表的头节点,整个链表的指针域连城一个环。

从循环链表的任何一个节点出发都可以找到链表的任意节点,使链表操作更加灵活。

操作:对于单循环链表,其操作除合并外与单链表一致,仅需修改一些判断条件:
(1)非空链表判断:head->next = head
(2)尾节点的判断:p->next = head;
双向链表
定义:构成链表的每个节点设置两个指针域,一个指向其直接前驱的指针域prior,一个指向其直接后继的指针域next,这样形成的链表有两个方向不同的链,故称双向链表。

和单链表类似,双向链表一般增加头节点使得双向链表某些运算更方便.
双向链表是为了克服单链表的单向性的缺陷引入的。

将头节点和尾节点连接起来也能构成循环链表,成为双向循环链表.
双向链表对称性描述:节点p的存储位置存放在其直接前驱节点
p->prior的后继指针域中,也存放在其直接后继节点p->next的前驱域指针中。

操作:
(1)插入操作:将值为e的节点插入双向链表中。

(2)删除操作,设要删除的节点为p,删除时可以不引入新的辅助变量指针,可以先断链,再释放节点。

注意:与单链表删除插入操作不同的是,在双向链表中插入和删除必须要同时修改两个方向的指针域指向。

一元多项式的表示和相加
一元多项式表示:P(x)=p0x0+p1x1+p2x2+p3x3+…+p n x n
可改写为:P(x)=p0x e0+p1x e1+p2x e2+p3x e3+…+p n x en
其中p i是指数为e i的项的非零系数,且满足:0<=e1<e2<e3…<e m=n 若用一个长度为m,且每个元素有两个数据项(系数项和指数项)的线性表,则可唯一确定一个一元多项式。

P n(x)=((p1,e1),(p2,e2),(p3,e3),…(p n,e n));
由n+1个系数唯一确定,在计算机中可用线性表表示。

一元多项式的相加:指数不同,链表合并;指数相同,系数相加;算法一:在原两个多项式链表基础上想加,相加后两个多项式链表就不再存在,生成新的链表。

算法二:两个多项式相加,生成一个新的多项式链表,原先多项式仍然存在。

相关主题