关闭

关闭

封号提示

内容

首页 第三章+线性表.ppt

第三章+线性表.ppt

第三章+线性表.ppt

上传者: 634381731 2011-09-08 评分 5 0 115 16 521 暂无简介 简介 举报

简介:本文档为《第三章+线性表ppt》,可适用于考试题库领域,主题内容包含第三章线性表ChapterThreelinearform【教学提示】采用理论联系实践、配合实例的方式进行讲解重点讲解线性表的逻辑结构、存储结构及相关符等。

第三章线性表ChapterThreelinearform【教学提示】采用理论联系实践、配合实例的方式进行讲解重点讲解线性表的逻辑结构、存储结构及相关应用体会数据结构中逻辑结构与存储结构之间的对应关系。双向链表、循环链表等内容可作为选学内容。【内容简介】线性表是数据结构中最基本的结构之一其应用非常广泛在高级语言程序设计中经常遇到的数组就是线性表的应用。按线性表的存储结构可将其分为顺序表和链表通过对其操作可以解决许多生活中的实际问题。【知识要点】线性表的概述和基本概念顺序表的基本操作及综合应用链表的基本操作及综合应用实例应用。【KnowledgePoints】outlinedoftheLinearformandbasicconceptsThebasicoperationoftheorderformandintegratedapplicationbasicoperationsofListandintegratedapplicationApplicationexamples。实例引入【学习任务】通过实例初步了解线性表的特征从感性上认识线性表及其简单操作。【例】对于初学计算机者会遇到计算机打字练习目前有很多指法练习软件其中打字游戏集娱乐和学习于一体是计算机初学者比较喜欢使用的打字练习软件。图所示为打字游戏界面。图打字游戏界面图英文打字练习示意图对于如图所示的英文打字软件是对单个字符进行练习的如图所示的界面是对多个英文字符进行练习练习时若输入正确的字母以蓝色显示若输入错误的字母会给出相应提示或显示其他颜色(假设为红色)。在如图所示的提示信息中给出的字母就是按照顺序排列的其中包含了字母、空格等符号用户可以按照字母出现的先后顺序进行操作根据这样的提示输入的信息就是典型的基于前后关系的线性结构。【例】假设现在有一篇英文文章某用户想在其中查找某单词则首先要将这些单词以前后出现的顺序存放在一张表中假设为A=(aa…aiaiai…an)要在其中查找某单词时可按顺序从a开始一直找到最后如果有匹配的单词存在则查找成功否则查找失败。如果查找的过程是在类似于以字母为顺序的字典中进行的则可以先确定该单词的第一个字母所在位置然后进一步查找单词具体位置这些具体操作是基于表A的建立方式不同而不同的。这里表A也是一个线性表的实例。线性表的概述【学习任务】理解线性表的含义熟练掌握线性表的相关概念重点理解线性表中逻辑结构、存储结构和相应操作之间的关系。线性表的概念通过前面的例子可以看出线性表实际上是基于前面元素和后面元素之间的一种相邻关系的结构。.线性表的定义线性表是将多个具有相同类型的数据元素放在一起构成一组有限序列的结构通常记为A =(aa…aiaiai…an)TheconceptofthelinearformLinearformismorewiththesametypeofdataelementstogetherandformthestructureofafinitesequence,usuallydenotedA=(a,a,,ai,ai,ai,,an).线性表的相关概念在上述线性表的定义中相关概念如下。()A代表一个线性表。()ai(in)称为线性表的元素i为元素的下标表示该元素在线性表中的位置。()线性表中n为表长其中n当n=时称该表为空表。()线性表是一种基于相邻数据元素之间的对应关系将元素ai称为元素ai的直接前趋将元素ai称为元素ai的直接后继。通过定义可知在线性表中a是表中第一个元素它没有前趋an是最后一个元素没有后继。()线性表中的元素ai既可以是一个单个元素也可以是一个数据元素即由多个数据项构成的元素。例如在第章中所介绍的图书信息表中一个记录即为一个元素它包括多个数据项(图书编号、书名、数量、价格)。因此线性表的定义也可描述如下:线性表是第一个元素无前驱最后一个元素无后继而其他元素都有唯一直接前驱和直接后继的表结构。例如A=(…)是一个线性表每个数值就是一个元素。B=((计算机应用基础)(大学英语)(机械制图)(数据结构))也是一个线性表每个元素是由个数据项(图书编号、书名、数量、价格)构成的。线性表的存储结构及操作.线性表的逻辑结构(Logicalstructure)与存储结构(Storagestructure)由线性表的定义可知线性表的逻辑结构即相临元素之间所满足的前驱和后继的逻辑关系。如果要在计算机中实现对线性表的各种操作必须了解线性表在计算机中的存储形式(即存储结构)。一种逻辑结构可对应多种存储结构而每种存储结构又有自己的存储特点和操作方式。.线性表的操作线性表的常见操作有:建表(初始化)、求表长、查找、插入、删除等。线性表的操作是在其逻辑结构和存储结构的共同支持下完成的。值得注意的是每种数据结构的相关操作一定不能脱离其逻辑结构和存储结构而独立存在。.线性表的分类线性表的存储结构可分为顺序存储结构和链式存储结构两种因此可将线性表分为顺序表和链表两大类。下面分别介绍顺序表和链表的特点及操作。operationofLinearformcommonoperationsofLinearformare:buildingtable(initialization),seekingalongtable,find,insert,deleteandsoonLineartableoperationisonthejointsupportofitslogicalstructureandstoragestructure顺序表的基本操作及实现【学习任务】理解线性表在顺序存储结构下的特点掌握顺序表的表示、相关算法及程序实现。顺序表的概述.定义顺序表是指线性表在顺序存储形式下构成的表.存储特点顺序表的存储是指在内存中在一段连续的存储单元中存储线性表。其特点为线性表逻辑上相邻的数据元素(直接前驱和直接后继)在存储位置(或物理位置)上也相邻如图所示。OverviewoftheSequencetableDefinitionSequencetableisstoredinlinearformintheorderformconstitutethetableStorageFeaturesSequencetableisstoredinmemory,inastorageunittostoreacontinuouslinearform图线性表的逻辑结构和存储结构对应图在上述表示中m为该顺序表存储的首地址d为每个元素占用的存储空间因此在顺序表的存储结构中有如下的对应关系。设a1的存储地址为m每个数据元素占d个存储单元则第i个数据元素的地址为Loc(ai)=m(i)*din即只要知道顺序表的首地址和每个数据元素所占的字节数就可求出第i个数据元素的地址这也是顺序表具有按数据元素的序号随机存取的特性。通过前面的介绍可知顺序表非常适合用高级语言中的数组去实现。值得注意的是探讨某种数据的操作一定是在一定的逻辑结构和存储结构之上进行的操作。顺序表的基本操作及实现顺序表的基本操作包括建立、插入、删除、查找等下面就重点说明插入、删除等操作的实现算法。.顺序表的表示为实现顺序表的各种操作首先必须了解顺序表的表示方法顺序表由两个量表示即表示同种数据类型的数组和表示数组长度的整型变量。【例】以整型数组的表示为例类如下:publicclassLineList{privateintdataprivateintlengthpublicLineList(){}publicvoidsetData(intdata){thisdata=data}publicvoidsetLength(intlength){thislength=length}publicintgetData(){return(thisdata)}publicintgetLength(){return(thislength)}}说明:该类定义的是整型数组在实际应用中可根据具体情况而定类中的成员设置为private的对外不可见。这就是类的封装性。.插入操作及程序实现顺序表的插入是指在现有表结构的基础上在规定位置插入和顺序表相同性质的元素插入操作具体过程及结果为:首先确定插入位置i按照an~ai的顺序由后至前依次将各元素向后移动为新元素让出位置将新元素x插入已经让出的第i个位置结束插入操作结果如图所示。图顺序表的插入操作示意图()线性表的顺序表插入操作ListInsert(L,i,e)()线性表的顺序表插入操作ListInsert(L,i,e)分析:“插入元素”使线性表的逻辑结构发生什么变化?假设在线性表的第i个元素之前插入一个元素e。插入元素时线性表的逻辑结构由(a,…,ai,ai,…,an)(a,…,ai,e,ai,…,an)<ai,ai><ai,e>,<e,ai>aa…aiai…anaa…ai…aieanListInsert(La,,)ListInsert(La,,)La平均移动次数:算法的基本思想算法的基本思想检查i值是否超出所允许的范围(in)若超出则进行“超出范围”错误处理将线性表的第i个元素和它后面的所有元素均向后移动一个位置将新元素写入到空出的第i个位置上使线性表的长度增。【算法】在整型顺序表的某位置上插入一个值为a的整型元素。publicclassLineList{publicbooleaninsert(inti,inta){intjif(length>=datalength){表空间已经满,不能插入Systemoutprintln("Thetableisoverflow")returnfalse}if(i<||i>length){插入位置是否正确Systemoutprintln("Thepositionismistake"i)returnfalse}for(j=lengthj>=ij)dataj=datajdatai=alengthreturntrue}}说明:顺序表算法的实现是通过移动元素实现的如果插入位置比较靠前则需要移动大量元素顺序表插入操作要注意数组的长度和插入位置的判断否则会出现错误。.删除操作及程序实现顺序表的删除是指在现有表的基础上在规定位置删除某元素删除操作的具体过程及结果为如下:首先确定删除位置i按照ai~an的顺序依次将各元素向前移动将元素ai删除结束删除操作结果如图所示。图顺序表的删除操作示意图()线性表的顺序表删除操作ListDelete(La,i,e)()线性表的顺序表删除操作ListDelete(La,i,e)分析:“删除元素”线性表的逻辑结构发生什么变化?假设删除线性表的第i个元素保存在变量e中。删除元素时线性表的逻辑结构由(a,…,ai,ai,…,an)(a,…,ai,ai,…,an)<ai,ai>aa…aiaiai…anaa…ai…aiean<ai,ai><ai,ai>aiListDelete(La,,e)ListDelete(La,,e)La平均移动次数:e算法的基本思想算法的基本思想检查i值是否超出所允许的范围(in)若超出则进行“超出范围”错误处理将线性表的第i个元素后面的所有元素均向前移动一个位置使线性表的长度减。【算法】在整型顺序表中删除某位置上的元素。publicclassLineList{publicbooleandelete(inti){intjif(i<||i>=length){检查删除位置是否存在Systemoutprintln("Thepositionismistake")returnfalse}for(j=ij<lengthj){dataj=datajlengthreturntrue}}}.顺序表的其他操作及实现对于顺序表来说除了插入和删除操作外还有许多操作如顺序表的建立、顺序表中固定元素的查找、顺序表中固定元素的替换等操作这些操作的原理和插入、删除操作基本相同例如顺序表的建立操作实际上就是由一个空的顺序表不断在表的末端进行元素插入顺序表中固定元素的替换也和插入操作基本一样找到元素后不需要移动元素而是将该位置的元素用新的元素替换。.顺序表算法的效率分析根据前面讲过的顺序表的算法实现可知其操作大部分是在移动元素的基础上完成的。插入算法需要移动的元素为ni(ai~an)而删除元素需要移动的元素个数为ni(ai~an)个这里以删除元素为例分析其效率。()删除操作的时间性能分析顺序表的删除操作的执行时间主要消耗在移动元素上假设删除第i个元素时就需要移动ni个元素(即第i个元素后面的ai~an都要向前移动一个位置)因此该算法的时间复杂度为O(n)。()删除操作的空间性能分析顺序表的删除操作需要使用一个变量存储将要被删除的元素因此其空间复杂度为O()但是由于顺序表存储需要事先规定连续的存储空间即使被删除的元素实际上也在占用空间因此其运算的空间复杂度虽然小但是对空间利用率不是最好的。.小结顺序表的存储特点是利用一段连续的存储空间存储该顺序表中的元素这样可以简化算法操作。但实现时需要大量移动元素使程序执行时间变长尤其是当n很大时其时间复杂度将会很大通过上面的分析该存储结构对空间效率不是最优的。也就是说顺序表的各种算法实现对时间和空间要求都很高如何提高算法效率将是一个重要的问题。线性表的合并问题线性表的合并问题例、已知顺序表LA和LB中的数据元素按值非递减有序排列现要将LA和LB归并为一个新表LC且LC中的数据元素仍按非值递减有序排序。例如:LA=(,,,)LB=(,,,,,,)则LC=(,,,,,,,,,,)VoidMergeList(SqListLa,SqListLb,SqList*Lc){VoidMergeList(SqListLa,SqListLb,SqList*Lc){Pa=Laelempb=LaelemLc>listsize=Lclength=LalengthLblengthPc=Lc>elem=(ElemType*)malloc(Lclistsize*sizeof(ElemType))If(!Lcelem)exit(overfiow)Palast=LaelemLalengthpblast=LbelemLblengthWhile(pa<=palastpb<=pblast){if(*pa<=*pb)*pc=*paelse*pc=*pb}While(pa<=palast)*pc=*paWhile(pb<=pblast)*pc=*pb}时间复杂度?链表的基本操作及实现【学习任务】理解线性表在链式存储结构下的特点掌握链表的表示、相关算法及程序实现。.链表的定义链表也是一种有顺序的表其内容可以存储在一组任意的存储单元中所谓任意的存储单元即这组存储单元可以是连续的也可以是不连续的这就需要在存储元素本身信息的同时还要存储下一个元素的位置由此构成一个链状结构称其为链表如图所示。thebasicoperationsandachievementoflistDefinitionoflistlistisalsoasequentialtable,theircontentcanbestoredinastorageunitinanysocalledarbitrarymemorycell,thatthisgroupofstorageunitscanbecontinuous,itmaybediscontinuous,andthisrequiresthestorageelementsoftheirinformationisalsonecessarytostorethelocationofthenextelement,thusformingachainstructure,calledthelist图带头指针头结点的链表示意图.链表的相关概念将表示数据元素和下一个元素位置的结构称为链表的结点。若第一个结点只表示整个链表的起始位置而无任何信息称其为头结点。对于最后一个结点后面无任何元素其表示元素位置的地址用“”来表示称其为尾结点程序实现中用“”来表示如图所示。relatedconceptsofListnodes:Torepresentdataelementsandthelocationofthenextelementinthestructurecalledthelinkedlistofnodesfirstnode:Ifthefirstnodethatthewholelistonlythestartingposition,withoutanyinformation,callthefirstnodeendnode:Forthelastnode,thebackwithoutanyelement,itslocationaddressesthatelement""torepresent,callingittheendnode,theprogramachievedusing"".链表的表示链表中结点的表示必须要用到两个区域其中一个存放数据元素自身的信息ai称为数据域(DataDomain)另一个存放下一个元素的地址或位置以保证表的连续性称为指针域(PointerDomain)。链表中结点的表示如下:在CC等语言中提供指针以表示某元素的地址但是这样可能会造成比较大的风险。因此Java语言提出了利用javautilLinkedList的类库提供的链表类供编程者使用用户可以通过该类库简单地实现指针操作本章通过另外的方式来实现链表的存储即利用数组的方式实现链表的存储以及算法的实现为此定义如下结构的类:publicclassLinkNode{privateintdata=privateLinkNodenext=publicvoidsetData(intdata){thisdata=data}publicvoidsetNext(LinkNodenext){thisnext=next}publicintgetData(){return(thisdata)}publicLinkNodegetNext(){return(thisnext)}}设该链表中存储的内容为字符串“study”链表表示如图所示。图带头指针头结点的链表示意图【例】假设有如下逻辑结构的线性表A=(aa…a)用数组表示的链表对应关系如图所示。图数组表示的链表之间对应关系示意图第个数组存放的是链表表示的数据第个数组存放的是第一个数组中数据之间的前后关系。例如链表从数组下标为的元素a开始由第个数组对应的下标为的元素数值得出下一个元素a所在的位置为(即第个元素)然后继续从第个数组a的数值为(即第个元素)……以此类推最终得出全部元素。这样可用两个数组配合来表示链表。当用链表表示线性表时由于不是按照元素的顺序进行存储的因此一定要知道第一个元素的位置(即链表的首位置用Head表示)同时还要知道最后一个元素的结束标志(即链表的末位置用表示)。链表的分类按照链表的组成方式可将链表分为单链表、双向链表、循环链表等。下面以单链表为例进行介绍其他链表以此类推即可。.单链表(Singlelinkedlist)单链表是链表中最常用的一种也是结构比较简单的一种是由第个元素到最后一个元素构成的一个链其特点从第个元素(可能有头指针和头结点)到最后一个元素(结束标志为)构成的一个链称为单链表如图所示。单链表的特点是通过前一个元素的指针域可以顺序找到后面元素所在的位置因此所有操作全部是从第个元素(头指针或头结点)开始的。.循环链表(Circularlinkedlist)在单链表中最后一个元素的存储区域是如果将它指向第个元素(头结点)位置就构成了循环链表。如链表中存储的内容为字符串"study"其循环链表表示如图所示。图带头指针头结点的循环链表示意图循环链表的特点是在所有元素之间构成一个环从任何一个元素出发都可以查找其他所有的元素同时还充分地利用了空间。.双向链表(Twowaylinkedlist)前面两种链表的查找方式都是沿着一个方向进行的对于元素比较少的链表进行操作时比较方便但当元素数量非常多时若只沿着一个方向进行操作有时操作不是很方便因此若每个元素都可以向两个方向进行查找元素就大大提高了操作效率这就构成了双向链表。假设该链表中存储的内容为字符串"study"其双向循环链表表示如图所示。该链表的特点是可以从任何一个元素出发向两个方向分别查找相应元素可提高操作效率。实际上链表还可以构成更多的种类如双向循环链表等通过前面对链表分类的介绍应该清楚无论使用哪种形式的链表其操作都是相通的。图带头指针头结点的双向链表示意图单链表的基本运算及实现和顺序表的操作类似单链表的操作也有很多如单链表的建立、插入、删除元素的查找、替换等。下面以单链表的插入、删除操作为例进行讲解。.在单链表的指定位置进行插入操作【例】建立一个单链表将字符串"STUDY"存储在该链表中。根据题意其操作可分为如下步骤。()创建单链表并进行初始化操作建立一个头结点(Head)为其申请空间如图所示。图建立头结点Head()在单链表的表头位置插入元素以如图所示的单链表为基础依次将元素插入到表头位置实现将“STUDY”倒置存放到该单链表中如图所示表示已经将“TUDY”存放到单链表中。图插入元素"TUDY"后的单链表最后将"S"插入到如图所示的单链表中先为元素"S"申请一个结点用new表示将其插入到如图所示的单链表中实现语句为inp=newOnelinkNode()inpnext=HeadHead=inp最后得到如图所示的单链表图插入结点S后的单链表()在单链表的中间位置插入元素设在如图所示的单链表中插入一个元素"R"使其变成"STUDRY"其操作如下:首先确定插入位置用指针minp来表示然后执行如下语句完成插入操作。inp=newOnelinkNode()inpnext=minpnextminpnext=inp其结果如图所示。图中间插入元素后的单链表.在单链表中进行删除操作【例】对于用单链表表示的"STUDY"若将"U"删除应如何操作。首先确定删除元素的位置用delq表示将该元素前一个位置用delp表示然后执行如下语句。delpnext=delqnext或者delpnext=(delpnext)next结果如图所示。图在单链表中删除元素"U"其他形式的链表的相关运算对于双向链表和循环链表其操作和单链表非常类似首先确定操作位置在操作时要注意在指针变化过程中要满足先连线再改变指针位置的操作顺序否则就会出现结点丢失问题。算法实例【算法】在链表的头部插入结点。publicclassLinkNode{privateintdata=privateLinkNodenext=publicvoidsetData(intdata){thisdata=data}publicvoidsetNext(LinkNodenext){thisnext=next}publicintgetData(){return(thisdata)}publicLinkNodegetNext(){return(thisnext)}}publicclassLinkTable{privateLinkNodehead=privateintcounts=publicvoidinsert(intd){if(head==){head=newLinkNode()}LinkNoden=newLinkNode()定义新的链表结点并将数据赋给新结点nsetData(d)if(headgetNext()==){如果头结点的后继无结点注意头结点中无数据headsetNext(n)}else{nsetNext(headgetNext())如果头结点的后继结点存在headsetNext(n)}counts结点总数增加}publicvoidprint(){LinkNoden=headgetNext()intiCounter=while(n!=){Systemoutprint(ngetData()"")n=ngetNext()iCounter}}publicintsize(){returnthiscounts}publicstaticvoidmain(Stringargs){LinkTablelinkTable=newLinkTable()linkTableinsert()linkTableinsert()linkTableinsert()linkTableinsert()linkTableinsert()linkTableinsert()linkTableinsert()linkTableprint()}}程序运行的结果为线性表的应用【学习任务】在学习线性表基础知识的前提下掌握线性表在顺序存储结构和链式存储结构下的应用实例及程序实现。顺序表的连接有两个顺序表A和B其元素均按从小到大的升序排列编写一个算法将它们合并成一个顺序表C要求C的元素也是按从小到大的升序排列。算法思路:依次扫描通过A和B的元素比较当前的元素的值将较小值的元素赋给C直到一个线性表扫描完毕然后将未完的那个顺序表中余下的部分赋给C。C的容量要能够大于A、B两个线性表相加的长度即可。具体程序如下:publicclassCombinate{voidmerge(inta,intb){inti,j,ki=j=k=intalength=alengthintblength=blengthintclength=alengthblengthintc=newintclengthwhile(i<alengthj<blength)if(ai<bj)ck=aielseck=bjwhile(i<alength)ck=aiwhile(j<blength)ck=bjSystemoutprintln()Systemoutprint("排序好的是:")for(intl=l<clengthl)Systemoutprint(""cl)}publicstaticvoidmain(Stringargs){Combinatea=newCombinate()inta={,,}intb={,,,}Systemoutprint("a数组:")for(inti=i<alengthi)Systemoutprint(""ai)Systemoutprintln()Systemoutprint("b数组:")for(intj=j<blengthj)Systemoutprint(""bj)amerge(a,b)}}程序运行的结果为a数组:b数组:排序好的是:字符串的逆转算法假设有如下字符串“STUDY”利用单链表存储该字符串并实现将其逆转即原字符串变为“YDUTS”如图所示。分析:根据单链表的插入和删除操作其实现过程可以以H为基础将其第个元素S作为单链表的末尾元素插入进来(这个过程实际已经完成)将第个元素T从原来的H中删除然后插入到以H为头S为尾的单链表中去然后按照这个过程依次将U、D、Y从原来的链表中删除依次插入到原链表的首部这样就实现了逆转。图单链表的逆转示意图具体程序如下:classLinkCharNode{privatechardata=''privateLinkCharNodenext=publicvoidsetData(chardata){thisdata=data}publicvoidsetNext(LinkCharNodenext){thisnext=next}publicchargetData(){return(thisdata)}publicLinkCharNodegetNext(){return(thisnext)}}publicclassLinkCharTable{privateLinkCharNodehead=privateintcounts=publicLinkCharNodegetHead(){returnhead}publicvoidinsert(chard){if(head==){head=newLinkCharNode()}LinkCharNoden=newLinkCharNode()定义新的链表结点并将数据赋给新结点nsetData(d)if(headgetNext()==){如果头结点的后继无结点注意头结点中无数据headsetNext(n)}else{nsetNext(headgetNext())如果头结点的后继结点存在headsetNext(n)}counts结点总数增加}publicvoiddelete(chard){if(head==){Systemoutprintln("链表中无数据!")return}LinkCharNodep=headLinkCharNoden=headgetNext()while(n!=){if(ngetData()==d){psetNext(ngetNext())}p=nn=ngetNext()}}publicvoidprint(){LinkCharNoden=headgetNext()intiCounter=输出的字符个数while(n!=){Systemoutprint(ngetData()"")n=ngetNext()iCounter}Systemoutprintln()}publicintsize(){returnthiscounts}}publicclassCombinate{publicCombinate(){}publicstaticvoidmain(Stringargs){LinkCharTablelinkTable=newLinkCharTable()linkTableinsert('Y')linkTableinsert('D')linkTableinsert('U')linkTableinsert('T')linkTableinsert('S')linkTableprint()reverse(linkTable)linkTableprint()}publicstaticvoidreverse(LinkCharTablelct){LinkCharNoden=lctgetHead()getNext()while(n!=){charch=ngetData()lctdelete(ch)lctinsert(ch)n=ngetNext()}}}程序运行的结果为STUDYYDUTS

类似资料

编辑推荐

《李卫公问对》.pdf

8910905-Harold-Garfinkel-Studies-in-Ethnomethodology-1967.pdf

宋代美术人才地理分布研究.pdf

艾滋病诊断标准.pdf

罪惟录选辑·烈皇小识.pdf

职业精品

精彩专题

上传我的资料

精选资料

热门资料排行换一换

  • 中国当代中篇小说经典--李敬泽编…

  • 基金投资者教育手册.ppt

  • 象棋对策论.pdf

  • 新会议高手.ppt

  • 效率高手[6不诀].ppt

  • Endnote使用.ppt

  • 研究生ENDNOTE教程2009…

  • 研究生ENDNOTE教程2009…

  • 研究生ENDNOTE教程2009…

  • 资料评价:

    / 80
    所需积分:0 立即下载

    意见
    反馈

    返回
    顶部