CH2数据结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《CH2数据结构课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CH2 数据结构 课件
- 资源描述:
-
1、线性结构线性结构特点特点:在数据元素的非空有限集中:在数据元素的非空有限集中存在存在唯一唯一的一个被称作的一个被称作“第一个第一个”的数据元素的数据元素存在存在唯一唯一的一个被称作的一个被称作“最后一个最后一个”的数据元素的数据元素除第一个外,集合中的每个数据元素均除第一个外,集合中的每个数据元素均只有一个只有一个前驱前驱除最后一个外,集合中的每个数据元素均除最后一个外,集合中的每个数据元素均只有一只有一个后继个后继 2.1 2.1 线性表的逻辑结构线性表的逻辑结构定义:一个线性表是定义:一个线性表是n n个数据元素的有限序列个数据元素的有限序列niaaaa,21如例例 英文字母表英文字母表(
2、A,B,C,.Z)是一个线性表是一个线性表例例学号姓名年龄001张三18002李四19数据元素数据元素例例 一副扑克的点数一副扑克的点数 (2 2,3 3,4 4,J J,Q Q,K K,A A)从以上例子可看出线性表的逻辑特征是:从以上例子可看出线性表的逻辑特征是: 在非空的线性表,有且仅有一个开始结点在非空的线性表,有且仅有一个开始结点a a1 1,它没,它没有直接前趋,而仅有一个直接后继有直接前趋,而仅有一个直接后继a a2 2; 有且仅有一个终端结点有且仅有一个终端结点a an n,它没有直接后继,而仅,它没有直接后继,而仅有一个直接前趋有一个直接前趋a an-1n-1; 其余的内部结
3、点其余的内部结点a ai i(2in-1)(2in-1)都有且仅有一个直接都有且仅有一个直接前趋前趋a ai-1i-1和一个直接后继和一个直接后继a ai+1i+1。 线性表是一种典型的线性结构。数据的运算是定义线性表是一种典型的线性结构。数据的运算是定义在逻辑结构上的,而运算的具体实现则是在存储结构在逻辑结构上的,而运算的具体实现则是在存储结构上进行的。上进行的。特征:特征: 元素个数元素个数n n表长度,表长度,n=0n=0空表空表 11ini=0 数据关系:数据关系:Rl = ai-1, ai | ai-1, ai D,i=1,2,n 基本操作:基本操作: InitList(&L) De
4、stroyList(&L) ClearList(&L) ListEmpty(L) ListLength(L) GetElem(L,I,&e) LocateElem(L,e,compare() PriorElem(L,cur_e,&pre_e) NextElem(L,cur_e,&next_e) ListInsert(&L,i,e) ListDelete(&L,i,&e) ListTraverse(L,visit() ADT List利用两个线性表利用两个线性表LALA和和LBLB分别表示两个集合分别表示两个集合A A和和B B,现要求一个新的集合现要求一个新的集合A=ABA=AB。 void
5、union(List &La,List Lb) La-len=listlength(La); Lb-len=listlength(Lb); for(I=1;I=lb-len;I+) getelem(lb,I,e); if(!locateelem(la,e,equal) listinsert(la,+la-en,e) 算法的时间复杂度:算法的时间复杂度:O(ListLength(LA) ListLength(LB)) 巳知线性表巳知线性表LALA和线性表和线性表LBLB中的数据元中的数据元素按值非递减有序排列,现要求将素按值非递减有序排列,现要求将LALA和和LBLB归并归并为一个新的线性表为一
6、个新的线性表LCLC,且,且LCLC中的元素仍按值非中的元素仍按值非递减有序排列。递减有序排列。void mergelist(list la,list lb,list &lc) initlist(lc); I=j=1;k=0; la-len=listlength(la); lb-len=listlength(lb); while(I=la-len)&(j=lb-len) getelem(la,I,ai);getelem(lb,j,bj); if(ai=bj)listinsert(lc,+k,ai);+I; elselistinsert(lc,+k,bj);+j; while(I=la-len)
7、 getelem(la,I+,ai);listinsert(lc,+k,ai); while(j=lb-len) getelem(lb,j+,bj);listinsert(lc,+k,bj); 算法的时间复杂度:算法的时间复杂度:O(ListLength(LA) +ListLength(LB)) 2.2 2.2 线性表的顺序存储结构线性表的顺序存储结构顺序表:顺序表: 定义:用一组地址连续的存储单元存放一个线性表叫定义:用一组地址连续的存储单元存放一个线性表叫 元素地址计算方法:元素地址计算方法:LOC(aiLOC(ai) = LOC(a1) + (i-1) = LOC(a1) + (i-1)
8、* *L LLOC(ai+1) = LOC(aiLOC(ai+1) = LOC(ai) + L) + L其中:其中:L L 一个元素占用的存储单元个数一个元素占用的存储单元个数LOC(aiLOC(ai) ) 线性表第线性表第i i个元素的地址个元素的地址 特点:特点:实现实现逻辑上相邻逻辑上相邻物理地址相邻物理地址相邻实现实现随机存取随机存取 实现:实现:可用可用C C语言的一维数组实现语言的一维数组实现a1a2an01n-112n内存内存V数组下标数组下标元素序号元素序号M-1typedef int DATATYPE; #define M 1000DATATYPE dataM;例例 type
9、def struct card int num; char name20; char author10; char publisher30; float price;DATATYPE;DATATYPE libraryM; 备用空间备用空间数据元素不是简单类型时数据元素不是简单类型时,可定义可定义结构体数组结构体数组或动态申请和释放内存或动态申请和释放内存DATATYPE *pData = (DATATYPE *)malloc(M*sizeof(DATATYPE);free(pData); 由于由于C语言中的一维数组也是采用顺序存储表示,故可语言中的一维数组也是采用顺序存储表示,故可以用数组类型
10、来描述顺序表。又因为除了用数组来存以用数组类型来描述顺序表。又因为除了用数组来存储线性表的元素之外,顺序表还应该用一个变量来表储线性表的元素之外,顺序表还应该用一个变量来表示线性表的长度属性,所以我们用结构类型来定义顺示线性表的长度属性,所以我们用结构类型来定义顺序表类型。序表类型。 # define ListSize 100 typedef int DataType; typedef struct DataType dataListSize; int length; Sqlist;插入插入 定义:线性表的插入是指在第定义:线性表的插入是指在第i i(1 1 i i n+1 n+1)个元素)个
11、元素之前插入一个新的数据元素之前插入一个新的数据元素x x,使长度为,使长度为n n的线性表的线性表变变为为n+1n+1niiaaaaa,1,21 变成变成长度为长度为n+1n+1的线性表的线性表niiaaxaaa,1,21 需将第需将第i i至第至第n n共共(n-i+1)n-i+1)个元素后移个元素后移 算法算法Void InsertList(Sqlist*L,DataType x,int I) int j; if (Il.length+1) printf(“Position error”); return ERROR; if (l.length=ListSize) printf(“ove
12、rflow”); exit(overflow); for (j=l.length-1;j=I-1;j-) l.dataj+1=l.dataj; l.dataI-1=x; l.length+; 内存内存a a1 1a a2 2a ai ia ai+1i+1a an n0 01 1i-1i-1V V数组下标数组下标n-1n-1i in n1 12 2i i元素序号元素序号i+1i+1n nn+1n+1内存内存a a1 1a a2 2a ai ia ai+1i+1a an n0 01 1i-1i-1V V数组下标数组下标n-1n-1i in n1 12 2i i元素序号元素序号i+1i+1n nn+
13、1n+1a an-1n-1x x 这里的问题规模是表的长度,设它的值为。该算法的这里的问题规模是表的长度,设它的值为。该算法的时间主要化费在循环的结点后移语句上,该语句的执行次时间主要化费在循环的结点后移语句上,该语句的执行次数(即移动结点的次数)是。由此可看出,所需移动结点数(即移动结点的次数)是。由此可看出,所需移动结点的次数不仅依赖于表的长度,而且还与插入位置有关。的次数不仅依赖于表的长度,而且还与插入位置有关。 当当i=n+1时,由于循环变量的终值大于初值,结点后移时,由于循环变量的终值大于初值,结点后移语句将不进行;这是语句将不进行;这是最好最好情况,其时间复杂度情况,其时间复杂度O
14、(1);); 当当i=1时,结点后移语句将循环执行时,结点后移语句将循环执行n次,需移动表中次,需移动表中所有结点,这是所有结点,这是最坏最坏情况,其时间复杂度为情况,其时间复杂度为O(n)。)。 算法时间复杂度算法时间复杂度T(n)T(n)设设PiPi是在第是在第i i个元素之前插入一个元素的概率,个元素之前插入一个元素的概率,则在长度为则在长度为n n的线性表中插入一个元素时,所需的线性表中插入一个元素时,所需移动的元素次数的平均次数为:移动的元素次数的平均次数为:11)1(niiinPEis nOnTninnEisnPnii112)1(1111则若认为 也就是说,在顺序表上做插入运算,平
15、均要移动表上一半也就是说,在顺序表上做插入运算,平均要移动表上一半结点。当表长结点。当表长 n较大时,算法的效率相当低。虽然较大时,算法的效率相当低。虽然Eis(n)中中n的的系数较小,但就数量级而言,它仍然是线性阶的。因的的系数较小,但就数量级而言,它仍然是线性阶的。因此算法的平均时间复杂度为此算法的平均时间复杂度为O(n)。动态删除删除 定义:线性表的删除是指将第定义:线性表的删除是指将第i i(1 1 i i n n)个元素删)个元素删除,使长度为除,使长度为n n的线性表的线性表niiaaaaa,1,21 变成变成长度为长度为n-1n-1的线性表的线性表niiaaaaa,11,21 需
16、将第需将第i+1i+1至第至第n n共共(n-i)n-i)个元素前移个元素前移算法 Void deleteList (Sqlist*L,int i) int j; if (il.length) printf(“Position error”); return ERROR for (j=i;jdatap-data表示表示p p指向结点的数据域指向结点的数据域( (* *p).linkp).linkp-linkp-link表示表示p p指向结点的指针域指向结点的指针域线性链表线性链表 定义:结点中只含一个指针域的链表叫定义:结点中只含一个指针域的链表叫 ,也叫单链表,也叫单链表 typedef l
17、istnode *linklist; listnode *p; linklist head;注意区分注意区分指针变量指针变量和和结点变量结点变量这两个不同的概念。这两个不同的概念。 P为动态变量,它是通过标准函数生成的,即为动态变量,它是通过标准函数生成的,即 p=(listnode*)malloc(sizeof(listnode);函数函数malloc分配了一个类型为分配了一个类型为listnode的结点变量的空间,的结点变量的空间,并将其首地址放入指针变量并将其首地址放入指针变量p中。一旦中。一旦p所指的结点变量不所指的结点变量不再需要了,又可通过标准函数再需要了,又可通过标准函数 fre
18、e ( p )释放所指的结点变量空间。释放所指的结点变量空间。指针变量指针变量P(其值为结点地址)和结点变量(其值为结点地址)和结点变量*P之间的关系。之间的关系。一、建立单链表一、建立单链表 假设线性表中结点的数据类型是字符,我们逐个假设线性表中结点的数据类型是字符,我们逐个输入这些字符型的结点,并以换行符输入这些字符型的结点,并以换行符n为输入结束为输入结束标记。动态地建立单链表的常用方法有如下两种:标记。动态地建立单链表的常用方法有如下两种: 1、头插法建表、头插法建表 该方法从一个空表开始,重复读入数据,生成该方法从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域
19、中,然后新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标将新结点插入到当前链表的表头上,直到读入结束标志为止。志为止。a2.h头结点头结点an-10an linklist createlistf (void) char ch; linklist head; listnode *p; head=null; ch=getchar( ); while (ch!= n) p=(listnode*)malloc(sizeof(listnode); pdata=ch; pnext=head; head=p; ch=getchar( ); return (head
20、); 2、尾插法建表、尾插法建表 头插法建立链表虽然算法简单,但生成的链表中头插法建立链表虽然算法简单,但生成的链表中结点的次序和输入的顺序相反。若希望二者次序一致,结点的次序和输入的顺序相反。若希望二者次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表可采用尾插法建表。该方法是将新结点插入到当前链表的表尾上,为此必须增加一个尾指针的表尾上,为此必须增加一个尾指针r,使其始终指向,使其始终指向当前链表的尾结点。当前链表的尾结点。linklist creater( ) char ch; linklist head; listnode *p,*r; /(, *head;) head=NUL
21、L; r=NULL; while(ch=getchar( )!= n) p=(listnode *)malloc(sizeof(listnode); pdata=ch; if(head= =NULL) head=p; else rnext=p; r=p; if (r!=NULL) rnext=NULL; return(head); 第一个生成的结点是开始结点,将开始结点插入到空第一个生成的结点是开始结点,将开始结点插入到空表中,是在当前链表的第一个位置上插入,该位置上的插入表中,是在当前链表的第一个位置上插入,该位置上的插入操作和链表中其它位置上的插入操作处理是不一样的,原因操作和链表中其它位
22、置上的插入操作处理是不一样的,原因是开始结点的位置是存放在头指针(指针变量)中,而其余是开始结点的位置是存放在头指针(指针变量)中,而其余结点的位置是在其前趋结点的指针域中。结点的位置是在其前趋结点的指针域中。 算法中的算法中的第一个第一个ifif语句语句就是用来对第一个位置上的插入就是用来对第一个位置上的插入操作做特殊处理。算法中的操作做特殊处理。算法中的第二个第二个ifif语句语句的作用是为了分别的作用是为了分别处理空表和非空表两种不同的情况,若读入的第一个字符就处理空表和非空表两种不同的情况,若读入的第一个字符就是结束标志符,则链表是结束标志符,则链表headhead是空表,尾指针是空表
23、,尾指针r r亦为空,结点亦为空,结点* *r r不存在;否则链表不存在;否则链表headhead非空,最后一个尾结点非空,最后一个尾结点* *r r是终端结是终端结点,应将其指针域置空。点,应将其指针域置空。如果我们在链表的开始结点之前附加一个结点,并称它如果我们在链表的开始结点之前附加一个结点,并称它为为头结点头结点,那么会带来以下两个优点:,那么会带来以下两个优点: 由于开始结点的位置被存放在头结点的指针域由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作就和在表的其它中,所以在链表的第一个位置上的操作就和在表的其它位置上的操作一致,无需进行特殊处理;位置上的操作
24、一致,无需进行特殊处理; 无论链表是否为空,其头指针是指向头结点在无论链表是否为空,其头指针是指向头结点在的非空指针(空表中头结点的指针域为空),因此空表的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就统一了。和非空表的处理也就统一了。ha1a2头结点头结点an .h空表空表头结点:头结点:在单链表第一个结点前附设一个结点叫在单链表第一个结点前附设一个结点叫头结点指针域为空表示线性表为空头结点指针域为空表示线性表为空linklist createlistr1( ) char ch; linklist head=(linklist)malloc(sizeof(listnode)
展开阅读全文