数据结构:第2章-线性表.ppt

上传人:zf 文档编号:30843038 上传时间:2024-01-31 格式:PPT 页数:47 大小:661KB
下载 相关 举报
数据结构:第2章-线性表.ppt_第1页
第1页 / 共47页
数据结构:第2章-线性表.ppt_第2页
第2页 / 共47页
数据结构:第2章-线性表.ppt_第3页
第3页 / 共47页
数据结构:第2章-线性表.ppt_第4页
第4页 / 共47页
数据结构:第2章-线性表.ppt_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

数据结构:第2章-线性表.ppt

《数据结构:第2章-线性表.ppt》由会员分享,可在线阅读,更多相关《数据结构:第2章-线性表.ppt(47页珍藏版)》请在冰豆网上搜索。

数据结构:第2章-线性表.ppt

1,数据结构,第2章线性表,2.1线性表及其抽象数据类型,2.2线性表的顺序存储结构,2.3线性表的链式存储结构,2.6一元多项式的表示及相加,2.4栈和队列,2.5循环线性链表和双向链表,2,数据结构,第2章线性表,2.1线性表及其抽象数据类型,定义:

线性表(LinearList)是由n(n0)个类型相同的数据元素a1,a2,,an组成的有限序列,记做(a1,a2,,ai-1,ai,ai+1,an)。

数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后继。

逻辑结构图:

3,数据结构,第2章线性表,特点:

同一性:

线性表由同类数据元素组成,每一个ai必须属于同一数据对象。

有穷性:

线性表由有限个数据元素组成,表长度就是表中数据元素的个数。

有序性:

线性表中相邻数据元素之间存在着序偶关系。

4,数据结构,第2章线性表,抽象数据类型定义:

ADTLinearList数据元素:

D=ai|aiD0,i=1,2,,n;n0,D0为某一数据对象关系:

=|ai,ai+1D0,i=1,2,n-1基本操作:

(1)InitList(L)操作前提:

L为未初始化线性表。

操作结果:

将L初始化为空表。

(2)DestroyList(L)操作前提:

线性表L已存在。

操作结果:

将L销毁。

p11ADTLinearList,返回,5,数据结构,第2章线性表,定义:

采用顺序存储结构的线性表通常称为顺序表。

假设线性表中每个元素占k个单元,第一个元素的地址为loc(a1),则第i个元素的地址为:

loc(ai)=loc(a1)+(i-1)k,6,数据结构,第2章线性表,7,数据结构,第2章线性表,C语言定义,#definemaxsize线性表可能达到的最大长度typedefstructElemTypeelemmaxsize;intlast;SeqList;,8,数据结构,第2章线性表,基本运算,查找操作,插入操作,删除操作,9,数据结构,第2章线性表,查找操作,按序号查找GetData(L,i):

要求查找线性表L中第i个数据元素,其结果是L.elemi-1。

按内容查找Locate(L,e):

要求查找线性表L中与给定值e相等的数据元素,其结果是:

若在表L中找到与e相等的元素,则返回该元素在表中的序号;若找不到,则返回一个“空序号”,如-1。

10,数据结构,第2章线性表,按内容查找Locate(L,e):

intLocate(SeqListL,ElemTypee)i=0;while(i=L.last),11,数据结构,第2章线性表,2.2线性表的顺序存储,插入操作,是指在表的第i(1in+1)个位置,插入一个新元素e,使长度为n的线性表(e1,ei-1,ei,en)变成长度为n+1的线性表(e1,,ei-1,e,ei,en)。

例如:

线性表(4,9,15,28,30,30,42,51,62),需在第4个元素之前插入一个元素“21”。

则需要将第9个位置到第4个位置的元素依次后移一个位置,然后将“21”插入到第4个位置。

(4,9,15,2128,30,30,42,51,62),#defineOK1#defineERROR0intInsList(SeqList*L,inti,ElemTypee)intk;if(iL-last+2)printf(“插入位置i值不合法”);return(ERROR);if(L-last=maxsize-1)printf(“表已满无法插入”);return(ERROR);for(k=L-last;k=i-1;k-)L-elemk+1=L-elemk;L-elemi-1=e;L-last+;return(OK);,时间复杂度:

O(n),12,数据结构,第2章线性表,删除操作,是指将表的第i(1in)个元素删去,使长度为n的线性表(e1,,ei-1,ei,ei+1,en),变成长度为n-1的线性表(e1,,ei-1,ei+1,en)。

intDelList(SeqList*L,inti,ElemType*e)intk;if(iL-last+1)printf(“删除位置不合法!

”);return(ERROR);*e=L-elemi-1;for(k=i;klast;k+)L-elemk-1=L-elemk;L-last-;return(OK);,时间复杂度:

O(n),13,数据结构,第2章线性表,2.2线性表的顺序存储结构,例2-1:

有两个顺序表LA和LB,其元素均为非递减有序排列,编写一个算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。

算法思想:

设表LC是一个空表,为使LC也是非递减有序排列,可设两个指针i、j分别指向表LA和LB中的元素,若LA.elemiLB.elemj,则当前先将LB.elemj插入到表LC中,若LA.elemiLB.elemj,当前先将LA.elemi插入到表LC中,如此进行下去,直到其中一个表被扫描完毕,然后再将未扫描完的表中剩余的所有元素放到表LC中。

voidmerge(SeqList*LA,SeqList*LB,SeqList*LC)i=0;j=0;k=0;while(ilast,14,数据结构,第2章线性表,优点:

可方便地随机存取表中的任一元素。

缺点:

插入或删除运算不方便,除表尾的位置外,在表的其它位置上进行插入或删除操作都必须移动大量的结点,其效率较低;,无须为表示结点间的逻辑关系而增加额外的存储空间;,由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配。

因此当表长变化较大时,难以确定合适的存储规模。

返回,15,数据结构,第2章线性表,定义:

采用链式存储结构的线性表称为链表。

动态链表,静态链表,单链表,双链表,循环链表,实现角度,链接方式,16,数据结构,第2章线性表,单链表,:

链表中的每个结点只有一个指针域,结点(Node):

单链表包括两个域,数据域:

指针域:

用来存储结点的数据值,用来存储数据元素的直接后继的地址(或位置),头指针:

指向链表头结点的指针。

17,数据结构,第2章线性表,单链表,H,18,数据结构,第2章线性表,单链表,头结点,带头结点的空单链表,带头结点的单链表,19,数据结构,第2章线性表,单链表,存储结构描述,typedefstructNodeElemTypedata;structNode*next;Node,*LinkList;,20,数据结构,第2章线性表,单链表,的基本运算,建立单链表单链表查找单链表插入操作单链表删除求单链表的长度,21,数据结构,第2章线性表,建立单链表,头插法建表,s指向新申请的结点s-data=A;,插入第一个结点:

插入某一个结点:

s-next=H-next;,H-next=s;,顺序可以颠倒吗?

22,数据结构,第2章线性表,2.3线性表的链式存储,建立单链表,头插法建表,算法,LinklistCreateFromHead()LinkListL;Node*s;charc;intflag=1;L=(Linklist)malloc(sizeof(Node);L-next=NULL;while(flag)c=getchar();if(c!

=$)s=(Node*)malloc(sizeof(Node);s-data=c;s-next=L-next;L-next=s;elseflag=0;,23,数据结构,第2章线性表,建立单链表,尾插法建表,s指向新申请的结点s-data=A;,插入第一个结点:

插入某一个结点:

r-next=s;,r=s;,顺序可以颠倒吗?

24,数据结构,第2章线性表,2.3线性表的链式存储,建立单链表,尾插法建表,算法,LinklistCreateFromTail()LinkListL;Node*r,*s;intflag=1;charc;L=(Node*)malloc(sizeof(Node);L-next=NULL;r=L;while(flag)c=getchar();if(c!

=$)s=(Node*)malloc(sizeof(Node);s-data=c;r-next=s;r=s;elseflag=0;r-next=NULL;,25,数据结构,第2章线性表,单链表查找,按序号查找,设带头结点的单链表的长度为n,要查找表中第i个结点,则需要从单链表的头指针L出发,从第一个结点(L-next)开始顺着链域扫描。

用指针p指向当前扫描到的结点,初值指向第一个结点(p=L-next),用j做记数器,累计当前扫描过的结点数(初值为0),当j=i时,指针p所指的结点就是要找的第i个结点。

Node*Get(LinkListL,inti)Node*p;p=L;j=0;while(p-next!

=NULL)&(jnext;j+;if(i=j)returnp;elsereturnNULL;,26,数据结构,第2章线性表,单链表查找,按值查找,指在单链表中查找是否有结点值等于e的结点,若有的话,则返回首次找到的其值为e的结点的存储位置,否则返回NULL。

查找过程从单链表的头指针指向的第一个结点出发,顺着链逐个将结点的值和给定值e作比较。

Node*Locate(LinkListL,ElemTypekey)Node*p;p=L-next;while(p!

=NULL)if(p-data!

=key)p=p-next;elsebreak;returnp;,27,数据结构,第2章线性表,单链表插入,要在带头结点的单链表L中第i个数据元素之前插入一个数据元素e,需要首先在单链表中找到第i-1个结点并由指针pre指示,然后申请一个新的结点并由指针s指示,其数据域的值为e,并修改第i-1个结点的指针使其指向s,然后使s结点的指针域指向第i个结点。

s-next=pre-next;,pre-next=s;,顺序可以颠倒吗?

28,算法实现,数据结构,第2章线性表,2.3线性表的链式存储,单链表插入,voidInsList(LinkListL,inti,ElemTypee)Node*pre,*s;intk=0;pre=L;while(pre!

=NULL,29,数据结构,第2章线性表,单链表删除,欲在带头结点的单链表L中删除第i个结点,则首先要通过计数方式找到第i-1个结点并使pre指向第i-1个结点,而后删除第i个结点并释放结点空间。

pre-next=pre-next-next;,free(r);,30,算法实现,数据结构,第2章线性表,2.3线性表的链式存储,单链表删除,voidDelList(LinkListL,inti,ElemType*e)Node*pre,*r;pre=L;intk=0;while(pre-next!

=NULL,31,数据结构,第2章线性表,求单链表的长度,可以采用“数”结点的方法来求出单链表的长度,用指针p依次指向各个结点,从第一个元素开始“数”,一直“数”到最后一个结点(p-next=NULL)。

算法实现,intListLength(LinkListL)Node*p;p=L-next;j=0;while(p!

=NULL)p=p-next;j+;returnj;,32,数据结构,第2章线性表,2.3线性表的链式存储结构,例2-2有两个单链表LA和LB,其元素均为非递减有序排列,编写一个算法,将它们合并成一个单链表LC,要求LC也是非递减有序排列。

要求:

新表LC利用原表的存储空间。

LinkListMergeLinkList(LinkListLA,LinkListLB)Node*pa,*pb;LinkListLC;pa=LA-next;pb=LB-next;LC=LA;LC-next=NULL;r=LC;while(pa-next!

=NULL,返回,33,数据结构,第2章线性表,循环链表(CircularLinkedList):

是一个首尾相接的链表。

特点:

将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点,就得到了单链形式的循环链表,并称为循环单链表。

在循环单链表中,表中所有结点被链在一个环上。

34,数据结构,第2章线性表,循环链表(CircularLinkedList),例2-3有两个带头结点的循环单链表LA、LB,编写一个算法,将两个循环单链表合并为一个循环单链表,其头指针为LA。

先找到两个链表的尾,并分别由指针p、q指向它们,然后将第一个链表的尾与第二个表的第一个结点链接起来,并修改第二个表的尾q,使它的链域指向第一个表的头结点。

p-next=LB-next;,q-next=LA;,free(LB);,35,数据结构,第2章线性表,循环链表(CircularLinkedList),算法实现1,LinkListmerge_1(LinkListLA,LinkListLB)Node*p,*q;p=LA;q=LB;while(p-next!

=LA)p=p-next;while(q-next!

=LB)q=q-next;p-next=LB-next;free(LB);q-next=LA;return(LA);,时间复杂度为O(n),36,数据结构,第2章线性表,循环链表(CircularLinkedList),例2-3有两个带头结点的循环单链表LA、LB,编写一个算法,将两个循环单链表合并为一个循环单链表,其头指针为LA。

采用带尾指针的循环链表,执行时间可降低为O

(1)。

RA-next=RB-next-next;,RB-next=p;,free(RB-next);,37,数据结构,第2章线性表,循环链表(CircularLinkedList),算法实现2,LinkListmerge_2(LinkListRA,LinkListRB)Node*p;p=RA-next;RA-next=RB-next-next;free(RB-next);RB-next=p;return(RB);,38,数据结构,第2章线性表,双向链表(DoubleLinkedList),在单链表的每个结点里再增加一个指向其前趋的指针域prior。

这样形成的链表中就有两条方向不同的链,我们称之为双(向)链表。

结构定义:

typedefstructDnodeElemTypedata;structDNode*prior,*next;DNode,*DoubleList;,定义:

39,数据结构,第2章线性表,双向链表(DoubleLinkedList),示意图:

40,数据结构,第2章线性表,双向链表(DoubleLinkedList),前插操作:

s,p,p-prior-next=s;,s-prior=p-prior;,顺序可以颠倒吗?

p-prior=s;,s-next=p;,顺序可以颠倒吗?

顺序可以颠倒吗?

41,数据结构,第2章线性表,2.3线性表的链式存储,双向链表(DoubleLinkedList)前插操作,算法实现:

intDlinkIns(DoubleListL,inti,ElemTypee)DNode*s,*p;p=search(L,i);s=(DNode*)malloc(sizeof(DNode);if(s)s-data=e;s-prior=p-prior;p-prior-next=s;s-next=p;p-prior=s;returnTRUE;elsereturnFALSE;,42,数据结构,第2章线性表,2.5循环线性链表和双向链表,双向链表(DoubleLinkedList),删除操作:

p,p-prior-next=p-next;,p-next-prior=p-prior;,free(p);,43,数据结构,第2章线性表,2.5循环线性链表和双向链表,双向链表(DoubleLinkedList)删除操作,算法实现:

intDlinkDel(DoubleListL,inti)DNode*p;p=search(L,i);p-prior-next=p-next;p-next-prior=p-prior;free(p);returnTRUE;,返回,44,数据结构,第2章线性表,2.6一元多项式的表示及相加,一个一元多项式pn(x)可按升幂的形式写成:

pn(x)=p0+p1x+p2x2+p3x3+pnxn,可用单链表存储多项式的结点结构:

typedefstructPolynodeintcoef;intexp;Polynode*next;Polynode,*Polylist;,45,输入多项式的系数和指数,用尾插法建立一元多项式的链表。

数据结构,第2章线性表,2.4一元多项式的表示及相加,Polylistpolycreate()Polynode*head,*rear,*s;intc,e;rear=head=(Polynode*)malloc(sizeof(Polynode);scanf(“%d,%d”,46,数据结构,第2章线性表,2.4一元多项式的表示及相加,两个多项式相加,运算规则:

两个多项式中所有指数相同的项的对应系数相加,若和不为零,则构成“和多项式”中的一项;所有指数不相同的项均复抄到“和多项式”中。

若p-expexp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移;若p-exp=q-exp,则将两个结点中的系数相加,当和不为零时修改结点p的系数域,释放q结点;若和为零,则和多项式中无此项,从A中删去p结点,同时释放p和q结点;若p-expq-exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。

47,数据结构,第2章线性表,2.4一元多项式的表示及相加,两个多项式相加,A(x)=7+3x+9x8+5x17,B(x)=8x+22x7-9x8,p,q,tail,tail,p,11,tail,p,temp,q,free(temp);,tail,q,temp,p,free(temp);,temp,q=NULL;,free(temp);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1