数据结构C语言描述(耿国华)第二章复习过程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构C语言描述(耿国华)第二章复习过程课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 描述 国华 第二 复习 过程 课件
- 资源描述:
-
1、2023-4-271数据结构课件数据结构课件西北大学计算机系2023-4-272第第2章章 线性表线性表 l2.1 线性表的概念及运算 l2.2 线性表的顺序存储 l2.3 线性表的链式存储 l2.4 一元多项式的表示及相加2023-4-2732.1 2.1 线性表的概念及运算线性表的概念及运算l2.1.1 2.1.1 线性表的逻辑结构线性表的逻辑结构 l2.1.2 2.1.2 线性表的抽象数据类型定义线性表的抽象数据类型定义 2023-4-274线性表的定义线性表线性表(Linear List)是由n(n0)个类型相同的数据元素a1,a2,,an组成的有限序列,记做(a1,a2,,ai-1,
2、ai,ai+1,an)。数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后继。线性表的逻辑结构图为:2023-4-275线性表的特点线性表的特点同一性:线性表由同类数据元素组成,每一个ai必须属于同一数据对象。有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数。有序性:线性表中相邻数据元素之间存在着序偶关系。2023-4-2762.1.2 线性表的抽象数据类型定义l抽象数据类型定义抽象数据类型定义:ADT LinearList数据元素数据元素:D=ai|aiD0,i=1,2,,n n0,D0为某一数据对象 关系关系:|ai,ai+1D0,i=1,2,n-1
3、基本操作基本操作:(1)InitList(L)操作前提:L为未初始化线性表。操作结果:将L初始化为空表。(2)DestroyList(L)操作前提:线性表L已存在。操作结果:将L销毁。(3)ClearList(L)操作前提:线性表L已存在。操作结果:将表L置为空表。ADT LinearList2023-4-2772.2 2.2 线性表的顺序存储线性表的顺序存储l2.2.1 线性表的顺序存储结构线性表的顺序存储结构 l2.2.2 线性表顺序存储结构上的基本运算线性表顺序存储结构上的基本运算 2023-4-278顺序存储结构的定义 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个
4、元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。采用顺序存储结构的线性表通常称为顺序表顺序表。假设线性表中每个元素占k个单元,第一个元素的地址为loc(a1),则第k个元素的地址为:loc(ai)=loc(a1)+(i-1)k 2023-4-279顺序存储结构示意图顺序存储结构示意图存储地址 内存空间状态 逻辑地址 Loc(a1)a11 Loc(a1)+(2-1)k a2 2 loc(a1)+(i-1)k ai i loc(a1)+(n-1)k an n.loc(a1)+(maxlen-1)k 空闲20
5、23-4-2710顺序存储结构的顺序存储结构的C语言定义语言定义#definemaxsize=线性表可能达到的最大长度;typedef struct ElemType elemmaxsize;/*线性表占用的数组空间*/int last;/*记录线性表中最后一个元素在数组elem 中的位置(下标值),空表置为-1*/SeqList;注意区分元素的序号和数组的下标,如a1的序号为1,而其对应的数组下标为0。2023-4-27112.2.2 线性表顺序存储结构的基本运算l线性表的基本运算:1.查找操作 2.插入操作 3.删除操作4.顺序表合并算法l线性表顺序存储结构的优缺点分析2023-4-271
6、2查找操作查找操作线性表的两种基本查找运算1.1.按序号查找按序号查找GetData(L,i):要求查找线性表L中第i个数据元素,其结果是L.elemi-1或L-elemi-1。2.2.按内容查找按内容查找Locate(L,e):要求查找线性表L中与给定值e相等的数据元素,其结果是:若在表L中找到与e相等的元素,则返回该元素在表中的序号;若找不到,则返回一个“空序号”,如-1。线性表的查找运算算法描述为:2023-4-2713线性表的查找运算线性表的查找运算 int Locate(SeqList L,ElemType e)i=0;/*i为扫描计数器,初值为0,即从第一个元素开始比较*/whil
7、e(i=L.last)&(L.elemi!=e)i+;/*顺序扫描表,直到找到值为key的元素,或扫描到表尾而没找到*/if (i=L.last)return(i);/*若找到值为e的元素,则返回其序号*/else return(-1);/*若没找到,则返回空序号*/2023-4-2714插入操作插入操作 线性表的插入运算是指在表的第i(1in+1)个位置,插入一个新元素e,使长度为n的线性表(e1,ei-1,ei,en)变成长度为n+1的线性表(e1,,ei-1,e e,ei,en)。线性表的插入运算算法。2023-4-2715插入插入算法示意图算法示意图已知:已知:线性表(4,9,15,2
8、8,30,30,42,51,62),需在第4个元素之前插入一个元素“21”。则需要将第9个位置到第4个位置的元素依次后移一个位置,然后将“21”插入到第4个位置,序号移动元素插入元素12345678109491528303042516249152830304262514915212830304262512023-4-2716插入运算插入运算int InsList(SeqList*L,int i,ElemType e)int k;if(iL-last+2)/*首先判断插入位置是否合法*/printf(“插入位置i值不合法”);return(ERROR);if(L-last=maxsize-1)p
9、rintf(“表已满无法插入”);return(ERROR);for(k=L-last;k=i-1;k-)/*为插入元素而移动位置*/L-elemk+1=L-elemk;L-elemi-1=e;/*在C语言中数组第i个元素的下标为i-1*/L-last+;return(OK);算法演示(此处连接算法演示程序)。2023-4-2717删除操作删除操作 线性表的删除运算是指将表的第i(1in)个元素删去,使长度为n的线性表 (e1,,ei-1,ei,ei+1,en),变成长度为n-1的线性表(e1,,ei-1,ei+1,en)。算法思路示意 算法实现2023-4-2718删除删除算法示意算法示意将
10、线性表(4,9,15,21,28,30,30,42,51,62)中的第5个元素删除。序号123456781094915212830304262514915213030425162删除28后2023-4-2719删除删除算法算法 int DelList(SeqList*L,int i,ElemType*e)/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值*/int k;if(iL-last+1)printf(“删除位置不合法!”);return(ERROR);*e=L-elemi-1;/*将删除的元素存放到e所指向的变量中*/for(k=i;ilast;k+)L-elemk-1=L-e
11、lemk;/*将后面的元素依次前移*/L-last-;return(OK);2023-4-2720合并算法合并算法l已知:有两个顺序表LA和LB,其元素均为非递减有序排列,编写一个算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。l算法思想算法思想:设表LC是一个空表,为使LC也是非递减有序排列,可设两个指针i、j分别指向表LA和LB中的元素,若LA.elemiLB.elemj,则当前先将LB.elemj插入到表LC中,若LA.elemiLB.elemj,当前先将LA.elemi插入到表LC中,如此进行下去,直到其中一个表被扫描完毕,然后再将未扫描完的表中剩余的所有元素放到表LC中
12、。l算法实现l此处连接算法演示 2023-4-2721顺序表顺序表合并算法实现合并算法实现void merge(SeqList*LA,SeqList*LB,SeqList*LC)i=0;j=0;k=0;while(ilast&jlast)if(LA-elemielemj)LC-elemk=LA-elemi;i+;k+;else LC-elemk=LB-elemj;j+;k+;while(ilast)/*当表LA长则将表LA余下的元素赋给表LC*/LC-elemk=LA-elemi;i+;k+;while(jlast)/*当表LB长则将表LB余下的元素赋给表LC*/LC-elemk=LB-ele
13、mj;j+;k+;LC-last=LA-last+LB-last;2023-4-2722顺序存储结构的优点和缺点顺序存储结构的优点和缺点优点:1.无需为表示结点间的逻辑关系而增加额外的存储空间;2.可方便地随机存取表中的任一元素。缺点:1.插入或删除运算不方便,除表尾的位置外,在表的其它位置上进行插入或删除操作都必须移动大量的结点,其效率较低;2.由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配。因此当表长变化较大时,难以确定合适的存储规模。2023-4-27232.3 2.3 线性表的链式存储线性表的链式存储l链表定义:链表定义:采用链式存储结构的线性表称为链表。现在我们从两个
14、角度来讨论链表:1.从实现角度看,链表可分为动态链表和静态链表;2.从链接方式的角度看,链表可分为单链表、循环链表和双链表。2023-4-2724l2.3.1 单链表单链表 l2.3.2 单链表上的基本运算单链表上的基本运算 l2.3.3 循环链表循环链表 l2.3.4 双向链表双向链表 l*2.3.5 静态链表静态链表 l2.3.6 顺序表和链表的比较顺序表和链表的比较链表链表2023-4-27252.3.1 单链表 结点(结点(Node)为了正确地表示结点间的逻辑关系,必须在存储线性表的每个数据元素值的同时,存储指示其后继结点的地址(或位置)信息,这两部分信息组成的存储映象叫做结点(结点(
15、Node)。单链表:链表中的每个结点只有一个指针域,我们将这种链表称为单链表。单链表包括两个域:数据域用来存储结点的值;指针域用来存储数据元素的直接后继的地址(或位置)。头指针头指针:指向链表头结点的指针。2023-4-2726单链表的示例图单链表的示例图头指针H存储地址数据域指针域1 D 437 B 1313 C 119 H NULL25 F 3731 A 737 G 1943 E 25312023-4-2727带头结点的单链表示意图带头结点的单链表示意图有时为了操作的方便,还可以在单链表的第一个结点之前附设一个头结点。l带头结点的空单链表 l带头结点的单链表 Ha1a2Han 2023-4
16、-2728单链表的存储结构描述单链表的存储结构描述typedef struct Node /*结点类型定义*/ElemType data;struct Node *next;Node,*LinkList;/*LinkList为结构指针类型*/2023-4-27292.3.2 单链表上的基本运算l线性表的基本运算:1.建立单链表 2.单链表查找 3.单链表插入操作 4.单链表删除 l算法应用示例:1.求单链表的长度 2.求两个集合的差 2023-4-2730建立单链表建立单链表l头插法建表算法描述:算法描述:从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点
17、插入到当前链表的表头结点之后,直至读入结束标志为止。c1 sLL ci-1 c2 c1 ci sc1 2023-4-2731头插法建表算法头插法建表算法Linklist CreateFromHead()LinkList L;Node *s;int flag=1;/*设置一个标志,初值为1,当输入“$”时,flag为0,建表结束*/L=(Linklist)malloc(sizeof(Node);/*为头结点分配存储空间*/L-next=NULL;while(flag)c=getchar();if(c!=$)/*为读入的字符分配存储空间*/s=(Node*)malloc(sizeof(Node);
18、s-data=c;s-next=L-next;L-next=s;elseflag=0;2023-4-2732尾插法建表尾插法建表C1 srLc1 rsc2 Lc1 rsL2023-4-2733尾插法建表算法尾插法建表算法Linklist CreateFromTail()/*将新增的字符追加到链表的末尾*/LinkList L;Node*r,*s;int flag=1;L=(Node*)malloc(sizeof(Node);/*为头结点分配存储空间*/L-next=NULL;r=L;/*r指针始终动态指向链表的当前表尾*/while(flag)/*标志,初值为1。输入“$”时flag为0,建表
19、结束*/c=getchar();if(c!=$)s=(Node*)malloc(sizeof(Node);s-data=c;r-next=s;r=s else flag=0;r-next=NULL;2023-4-2734单链表查找单链表查找l按序号查找 算法描述:算法描述:设带头结点的单链表的长度为n,要查找表中第i个结点,则需要从单链表的头指针L出发,从头结点(L-next)开始顺着链域扫描,用指针p指向当前扫描到的结点,初值指向头结点(pL-next),用j做记数器,累计当前扫描过的结点数(初值为0),当j=i 时,指针p所指的结点就是要找的第i个结点。算法实现,算法演示。2023-4-2
20、735按序号查找算法实现按序号查找算法实现/*在带头结点的单链表L中查找第i个结点,若找到(1in),则返回该结点的存储位置;否则返回NULL*/Node*Get(LinkList L,int i)Node *p;p=L;j=0;/*从头结点开始扫描*/while(p-next!=NULL)&(jnext;j+;/*扫描下一结点*/*已扫描结点计数器*/if(i=j)return p;/*找到了第i个结点*/else return NULL;/*找不到,i0或in*/2023-4-2736l按值查找算法描述:算法描述:按值查找是指在单链表中查找是否有结点值等于e的结点,若有的话,则返回首次找到
21、的其值为e的结点的存储位置,否则返回NULL。查找过程从单链表的头指针指向的头结点出发,顺着链逐个将结点的值和给定值e作比较。算法实现,算法演示。单链表查找单链表查找2023-4-2737按值查找算法实现按值查找算法实现/*在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL*/Node*Locate(LinkList L,ElemType key)Node*p;p=L-next;/*从表中第一个结点比较*/while(p!=NULL)if(p-data!=key)p=p-next;else break;/*找到结点key,退出循环*/return
22、p;2023-4-2738单链表插入操作单链表插入操作l算法描述:要在带头结点的单链表L中第i个数据元素之前插入一个数据元素e,需要首先在单链表中找到第i-1个结点并由指针pre指示,然后申请一个新的结点并由指针s指示,其数据域的值为e,并修改第i-1个结点的指针使其指向s,然后使s结点的指针域指向第i个结点。esa1an ai-1aiespreLa1an preai-1ai2023-4-2739单链表插入操作算法实现单链表插入操作算法实现void InsList(LinkList L,int i,ElemType e)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。*/Node*
23、pre,*s;pre=L;int k=0;while(pre!=NULL&knext;k=k+1;if(k!=i-1)printf(“插入位置不合理!”);return;s=(Node*)malloc(sizeof(Node);/*为e申请一个新的结点*/s-data=e;/*将待插入结点的值e赋给s的数据域*/s-next=pre-next;pre-next=s;2023-4-2740单链表删除单链表删除l算法描述:欲在带头结点的单链表L中删除第i个结点,则首先要通过计数方式找到第i-1个结点并使p指向第i-1个结点,而后删除第i个结点并释放结点空间。pa1ai-1aian pa1Lan a
24、i-1aiai+1rL2023-4-2741单链表删除算法实现单链表删除算法实现void DelList(LinkList L,int i,ElemType*e)/*在带头结点的单链表L中删除第i个元素,并保存其值到变量*e中*/Node*p,*r;p=L;int k=0;while(p-next!=NULL&knext;k=k+1;if(k!=i-1)/*即while循环是因为p-next=NULL而跳出的*/printf(“删除结点的位置i不合理!”);return ERROR;r=p-next;p-next=p-next-next /*删除结点r*/free(r);/*释放被删除的结点所
25、占的内存空间*/2023-4-2742求单链表的长度求单链表的长度算法描述:算法描述:可以采用“数”结点的方法来求出单链表的长度,用指针p依次指向各个结点,从第一个元素开始“数”,一直“数”到最后一个结点(p-next=NULL)。int ListLength(LinkList L)/*L为带头结点的单链表*/Node*p;p=L-next;j=0;/*用来存放单链表的长度*/while(p!=NULL)p=p-next;j+;return j;算法演示链接。2023-4-2743两个有序单链表的合并两个有序单链表的合并l有两个单链表LA和LB,其元素均为非递减有序排列,编写一个算法,将它们合
展开阅读全文