数据结构学习-线性表02-2

309 阅读5分钟

always thinking,there must be an echo。念念不忘,必有回响。


单链表的基本操作

单链表:每一个结点只包含一个指针域的链表称为单链表。

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+…+pnxn

可改写为:P(x)=p0xe0+p1xe1+p2xe2+p3xe3+…+pnxen

其中pi是指数为ei的项的非零系数,且满足:0<=e1<e2<e3…<em=n

若用一个长度为m,且每个元素有两个数据项(系数项和指数项)的线性表,则可唯一确定一个一元多项式。

Pn(x)=((p1,e1),(p2,e2),(p3,e3),…(pn,en));

由n+1个系数唯一确定,在计算机中可用线性表表示。

一元多项式的相加:

实质原理:指数相同,系数相加;指数不同,链表合并。

算法一:在原两个多项式链表基础上想加,相加后两个多项式链表就不再存在,生成新的链表。

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


**看完点个赞吧,**给别人点赞,会让自己觉得自己是一个善良的人。

关注一下,让自己觉得自己是一个友善的人,开放包容的人,人生会不经意间美妙一点点。

我的收获期待与你分享,希望一同成长!