数据结构与算法-线性表_第1页
数据结构与算法-线性表_第2页
数据结构与算法-线性表_第3页
数据结构与算法-线性表_第4页
数据结构与算法-线性表_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.1抽象数据型线性表2.2线性表的实现2.3栈(Stack)2.4队列(Queue)2.5串(String)2.6数组(Array)2.7广义表(Lists)线性表(LinerList)2.1抽象数据型线性表[定义]

线性表是由n(n≥0)个相同类型的元素组成的有序集合。记为:

(a1,a2,a3,……ai-1,ai,ai+1,……an)其中:①n为线性表中元素个数,称为线性表的长度;当n=0时,为空表,记为()。②ai为线性表中的元素,类型定义为elementtype③a1为表中第1个元素,无前驱元素;an为表中最后一个元素,无后继元素;对于…ai-1,ai,ai+1…(1<i<n),称ai-1

为ai的直接前驱,ai+1为ai的直接后继。④线性表是有限的,也是有序的。2.1抽象数据型线性表线性表LIST=(D,R)D={ai|ai

∈Elementset,i=1,2,…,n,n≥0}R={H}H={<ai-1,ai>|ai-1,ai

∈D,i=2,…,n}操作:设L的型为LIST线性表实例,x的型为elementtype的元素实例,p为位置变量。所有操作描述为:①INSERT(x,p,L)②LOCATE(x,L)③RETRIEVE(p,L)④DELETE(p,L)⑤PREVIOUS(p,L),NEXT(p,L)⑥MAKENULL(L)⑦FIRST(L)数学模型2.1抽象数据型线性表举例:设计函数DELEVAL(LIST&L,elementtyped),其功能为删除L中所有值为d的元素。

VoidDELEVAL(LIST&L,elementtyped)

{positionp;p=FIRST(L);while(P!=END(L))

{if(same(RETRIEVE(p,L),d))DELETE(p,L);elsep=NEXT(p,L);

}

}2.2线性表的实现问题:确定数据结构(存储结构)实现型LIST,并在此基础上实现各个基本操作。存储结构的三种方式:①连续的存储空间(数组)→静态存储②非连续存储空间——指针(链表)→动态存储③游标(连续存储空间+动态管理思想)→静态链表2.2.1指针和游标指针:地址量,其值为另一存储空间的地址;游标:整型量,其值为数组的下表,用以表示指定元素的“地址”或“位置”2.2.2线性表的数组实现

第1个元素第2个元素

……最后1个元素……012maxlength-1last表空单元图2-1线性表的数组实现表的长度

……第i个元素1≤i≤last类型定义:#definemaxlength100structLIST{

elementtypeelements[maxlength];

intlast;};位置类型:

typedef

intposition;线性表L:LISTL;2.2.2线性表的数组实现操作:①VoidINSERT(elementtypex,positionp,LIST&L){positionq;if(L.last>=maxlength–1)error(“表满”);

elseif((P>L.last+1)||(p<1))error(“指定位置不存在”);

else{

for(q=L.last;q>=p;q--)L.elements[q+1]=L.elements[q];L.last=L.last+1;L.elements[p]=x;

}

}②positionLOCATE(elementtypex,LISTL){positionq;for(q=1;q<=L.last;q++)if(L.elements[q]==x)return(q);return(L.last+1);}2.2.2线性表的数组实现③elementtypeRETRIEVE(positionp,LISTL){if(p>L.last)error(“指定元素不存在”);elsereturn(L.elements[p]);}④VoidDELETE(positionp,LIST&L){positionq;if((p>L.last)||(p<1))error(“指定位置不存在”);

else{L.last=L.last–1;for(q=p;q<=L.last;q++)L.elements[q]=L.elements[q+1];}}2.2.2线性表的数组实现⑤positionPREVIOUS(positionp,LISTL){if((p<=1)||(p>L.last))error(“前驱元素不存在”);elsereturn(p–1);}⑧positionEND(LISTL){return(L.last+1);}⑦positionFIRST(LISTL){return(1);}

positionNEXT(positionp,LISTL){if((p<1)||(p>=L.last))error(“前驱元素不存在”);elsereturn(p+1);}⑥positionMAKENULL(LIST&L){L.last=0;return(L.last+1);}

2.2.2线性表的数组实现2.2.3线性表的指针实现结点形式elementnext结点信息下一结点地址celltype结点类型struct

celltype{

elementtypeelement;

celltype*next;};typedef

celltype*LIST;typedef

celltype*position;LISTheader;positionp,q;a1a2a3an∧…headerqpa2:(*p).element;q:(*p).next;a2:p→element;q:p→next;记法:操作讨论:2.2.3线性表的指针实现插入元素:pa1xheaderqai-1aixpqan∧x∧qp(a)表头插入元素(b)中间插入元素(c)表尾插入元素q=newcelltype;q→element=x;q→next=p→next;p→next=q;或:temp=p→next;p→next=newcelltype;p→next→element=x;p→next→next=temp;讨论表头结点的作用操作讨论:2.2.3线性表的指针实现删除元素:q=p→next;p→next=q→next;deleteq;或:q=p→next;p→next=p→next→next;deleteq;讨论结点ai

的位置pa1header(a)删除第一个元素a2qpai-1aipq(b)删除中间元素ai+1an∧an-1qp(c)删除表尾元素∧操作:2.2.3线性表的指针实现①positionEND(LIST){positionq;q=L;while(q→next!=NULL)q=q→next;return(q);};②VoidINSERT(elementtypex,positionp,LIST&L){positionq;q=newcelltype;q→element=x;q→next=p→next;p→next=q;}操作:2.2.3线性表的指针实现③positionLOCATE(elementtypex,LISTL){positionp;p=L;while(p→next!=NULL)if(p→next→element==x)returnp;elsep=p→next;returnp;}④elementtypeRETRIEVE(positionp,LISTL){return(p→next→element);}操作:2.2.3线性表的指针实现⑤VoidDELETE(positionp,LIST&L){positionq;if(p→next!=NULL){q=p→next;p→next=q→next;deleteq;}};⑥positionPREVIOUS(positionp,LISTL){positionq;if(p==L→next)error(“不存在前驱元素”);

else{q=L;while(q→next!=p)q=q→next;returnq;}}操作:2.2.3线性表的指针实现⑦positionNEXT(positionp,LISTL){positionq;if(p→next==NULL)error(“不存在后继元素”);

else{q=p→next;returnq;}}⑧positionMAKENULL(LIST&L){L=newcelltype;L→next=NULL;returnL;}操作:2.2.3线性表的指针实现⑨positionFIRST(LISTL){returnL;}静态链表与动态链表的比较比较参数←表的容量→←存取操作→←时间→←空间→链式存储灵活,易扩充顺序存取访问元素费时间实际长度,节省空间顺序存储固定,不易扩充随机存取插入删除费时间估算表长度,浪费空间举例:遍历线性链表,按照线性表中元素的顺序,依次访问表中的每一个元素,每个元素只能被访问一次。VoidVISITE(LISTL){positionp;p=L→next;while(p!=NULL){cout<<p→element;p=p→next;}}2.2.4线性表的游标实现结点形式elementnext结点信息下一结点位置spacestr结点类型struct

spacestr{

elementtypeelement;

intnext;};线性表:spacestrSPACE[maxsize];typedef

intposition;元素:SPACE[i].element→“型”为elementtype(基本、复合)下一元素位置:SPACE[i].next→“型”为int类似指针链表,对游标实现的线性表仍设表头结点。2.2.4线性表的游标实现d65c-1--0a108e-1--4-1--11b21210123456789101112SPACE73LM9available线性表:L=(a,b,c)L=7M=(d,e)M=3空闲表:available=9q=newspacestr;q=SPACE[available].next;SPACE[available].next=SPACE[q].next;deleteq;SPACE[q].next=SPACE[available].next;SPACE[available].next=q;①VoidINSERT(elementtypex,positionp,spacestr*SPACE){positionq;q=newspacestr;SPACE[q].element=x;SPACE[q].next=SPACE[p].next;SPACE[p].next=q;}②VoidDELETE(positionp,spacestr*SPACE){positionq;if(SPACE[p].next!=-1){SPACE[q]=SPACE[p].next;SPACE[p].next=SPACE[q].next;deleteq;}};2.2.4线性表的游标实现操作:2.2.5双向链表结点形式elementnext结点信息后继结点指针dcelltypeprevious前驱结点指针结点类型

struct

dcelltype{

elementtypeelement;

dcelltype*next,*previous;};typedef

dcelltype*DLIST;typedef

dcelltype*position;ai-1

ai

ai+1

p删除位置p的元素:p→previous→next=p→next;p→next→previous=p→previous;

∧header

an

∧tail2.2.5双向链表操作:VoidINSERT(elementtypex,positionp,DLIST&L);{positionq;q=newdcelltype;q→element=x;q→previous→next=q;q→previous=p→previous;q→next=p;p→previous=q;};讨论:元素的位置?2.2.6环形链表单向线性链表双向线性链表单向循环链表双向循环链表对线性链表的改进,解决“单向操作”的问题;改进后的链表,能够从任意位置元素开始,访问表中的每一个元素。单向环形链表:a1a2a3an…R其结构与单向线性链表相同,用表尾指针标识链表,从而省去了表头结点。表头:R→next(亦即表中的一个元素a1)操作:①在表左端插入结点INSERT(x,FIRST(R),R);→LINSERT(x,R)VoidLINSERT(elementtypex,LIST&R){celltype*p;p=newcelltype;p→element=x;if(R==NULL){p→next=p;R=p;}else{p→next=R→next;R→next=p;}};2.2.6环形链表②在表右端插入结点INSERT(x,END(R),R);→RINSERT(x,R)VoidRINSERT(elementtypex,LISTR){LINSERT(x,R);R=R→next;}操作:③从表左端删除结点DELETE(FIRST(R),R);→LDELETE(R)VoidLDELETE(LIST&R){celltype*p;if(R==NULL)error(“空表”);else{p=R→next;R→next=p→next;if(p==R)R=NULL;deletep;}};2.2.6环形链表2.2.6环形链表双向环形链表:a1

ai

an

……R

双向环形链表的结构与双向连表结构相同,只是将表头元素的空previous域指向表尾,同时将表尾的空next域指向表头结点,从而形成向前和向后的两个环形链表,对链表的操作变得更加灵活。举例:设计算法,将一个单向环形链表反向。头元素变成尾元素,尾元素变成新的头元素,依次类推。2.2.6环形链表a1a2a3an…Ranan-1an-2a1…RVoidREVERS(LIST&R){positionp,q;p=R→next;R→next=p→next;p→next=p;while(R!=NULL)

{q=R→next;R→next=q→next;q→next=p→next;p→next=q;

}R=p;};算法如下:2.3栈(Stack)栈是线性表的一种特殊形式,是一种限定性数据结构,也就是在对线性表的操作加以限制后,形成的一种新的数据结构。定义:是限定只在表尾进行插入和删除操作的线性表。栈又称为后进先出(LastInFirstOut)的线性表。简称LIFO结构。栈举例a1a2······an-1anInsertDeletetopbottom栈底栈顶栈示意图2.3栈栈的基本①MAKENULL(S)操作

②TOP(S)③POP(S)④PUSH(x,S)⑤EMPTY(S)举例:利用栈实现行编辑处理。设定符号“#”为擦讫符,用以删除“#”前的字符;符号“@”为删行符,用以删除当前编辑行。原理:一般字符进栈;读字符擦讫符退栈;删行符则清栈算法:VoidLINEEDIT(){STACKS;

charc;MAKENULL(S);c=getchar();while(c!=‘\n’){if(c==‘#’)POP(S);elseif(c==‘@’)MAKENULL(S);elsePUSH(c,S);c=getchar();}

逆序输出栈中所有元素;}2.3.1栈的实现2.3栈1、顺序存储顺序栈示意图an···ai···a3a2a1---maxlength-1······3210top结构类型:

typedef

struct{

elementtype

elements[maxlength];

inttop;}STACK;STACKS;栈的容量:maxlength–1;栈空:S.top=0;栈满:S.top=maxlength–1;栈顶元素:S.elements[S.top];2.3.1栈的实现1、顺序存储操作:①VoidMAKENULL(STACK&S){S.top=0;};②BooleanEMPTY(STACKS){if(S.top<1)returnTRUEelsereturnFALSE;};③

elementtypeTOP(STACKS){ifEMPTY(S)returnNULL;elsereturn(S.elements[S.top]);};2.3.1栈的实现1、顺序存储操作:④elementtypePOP(STACK&S){if(EMPTY(S))error(“栈空”);elseS.top=S.top–1;};⑤VoidPUSH(elementtypex,STACK&S){if(S.top==maxlength-1)error(“栈满”);else{S.top=S.top+1;S.elements[S.top]=x;}};2.3.1栈的实现2、链式存储采用由指针形成的线性链表来实现栈的存储,要考虑链表的哪一端实现元素的插入和删除比较方便。实现的方式如右图所示,其操作与线性链表的表头插入和删除元素相同。anan-1a2······a1∧top3、多个栈共用一个存储空间的讨论STACK[maxlength]bot[1]top[1]bot[2]top[2]bot[3]top[3]top[2]bot[n]top[n]············0Maxlength-1bot[n+1]bot[i]top[i]出口入口迷宫示例2、迷宫求解2.3.2栈的应用问题:010001100011111100011011100111011000011110011110111101101100110100101111111001101110100111011110011111111001101101111101110001101100000001111100011110010011111011110一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n]出去的路径。11×15→m×n1、栈和递归过程P.74-75演示2、迷宫求解分析:⑴迷宫可用二维数组Maze[i,j](1≤i≤m,1≤j≤n)表示,入口maze[1,1]=0;耗子在任意位置可用(i,j)坐标表示;⑵位置(i,j)周围有8个方向可以走通,分别记为:E,SE,S,SW,W,NW,N,NE;如图所示。方向v按从正东开始且顺时针分别记为1-8,v=1,8;设二维数组move记下八个方位的增量;i,jN:(i-1,j)NE:(i-1,j+1)E:(i,j+1)SE:(i+1,j+1)S:(i+1,j)SW:(i+1,j-1)W:(i,j-1)NW:(i-1,j-1)ji出口入口迷宫示例从(i,j)到(g,h)

且v=2(东南)则有:g=i+move[2,1]=i+1;h=j+move[2,2]=j+1;Vij说明101E211SE310S41-1SW50-1W6-1-1NW7-10N8-11NE2、迷宫求解⑶为避免时时监测边界状态,可把二维数组maze[1:m,1:n]扩大为maze[0:m+1,0:n+1],且另0行和0列、m+1行和n+1列的值为1;2、迷宫求解⑷采用试探的方法,当到达某个位置且周围八个方向走不通时需要回退到上一个位置,并换一个方向继续试探;为解决回退问题,需设一个栈,当到达一个新位置时将(v,i,j)进栈,回退时退栈。⑸每次换方向寻找新位置时,需测试该位置以前是否已经经过,对已到达的位置,不能重复试探,为此设矩阵mark,其处置为0,一旦到达位置(i,j)时,置mark[i,j]=1;文字描述算法:⑴耗子在(1,1)进入迷宫,并向正东(v=1)方向试探。⑵监测下一方位(g,h)。若(g,h)=(m,n)且maze[m,n]=0,则耗子到达出口,输出走过的路径;程序结束。⑶若(g,h)≠(m,n),但(g,h)方位能走通且第一次经过,则记下这一步,并从(g,h)出发,再向东试探下一步。否则仍在(i,j)方位换一个方向试探。⑷若(i,j)方位周围8个方位阻塞或已经过,则需退一步,并换一个方位试探。若(i,j)=(1,1)则到达入口,说明迷宫走不通。2、迷宫求解VoidGETMAZE(maze,mark,move,s){(i,j,v)=(1,1,1);mark[1,1]=1;top=0;do{g=move[v,1];h=move[v,2];if((g==m)&&(h==n)&&(maze[m,n]==0)){output(S);return;}if((maze[g,h]==0)&&mark[g,h]==0)){mark[g,h]=1;PUSH(i,j,v,s);(i,j,v)=(g,h,1);}elseif(v<8)v=v+1;else{while((s.v==8)&&(!EMPTY(s)))POP(s);if(top>0)(i,j,v++)=POP(s);};

}while((top)&&(v!=8));

cout<<“路径不存在!”;}3、表达式求值前缀表达式(逆波兰式)表达式:中缀表达式后缀表达式(波兰式)例如:*+ab-ab(a+b)*(a-b)(a+b)*(a-b)

ab+ab-*高级语言中,采用类似自然语言的中缀表达式,但计算机对中缀表达式的处理是很困难的,而对后缀或前缀表达式则显得非常简单。后缀表达式的特点:①在后缀表达式中,变量(操作数)出现的顺序与中缀表达式顺序相同。②后缀表达式中不需要括弧定义计算顺序,而由运算(操作符)的位置来确定运算顺序。3、表达式求值Ⅰ.将中缀表达式转换成后缀表达式对中缀表达式从左至右依次扫描,由于操作数的顺序保持不变,当遇到操作数时直接输出;为调整运算顺序,设立一个栈用以保存操作符,扫描到操作符时,将操作符压入栈中,进栈的原则是保持栈顶操作符的优先级要高于栈中其他操作符的优先级,否则,将栈顶操作符依次退栈并输出,直到满足要求为止。遇到“(”进栈,当遇到“)”时,退栈输出直到“)”为止。Ⅱ.由后缀表达式计算表达式的值对后缀表达式从左至右依次扫描,与Ⅰ相反,遇到操作数时,将操作数进栈保留;当遇到操作符时,从栈中退出两个操作数并作相应运算,将计算结果进栈保留;直到表达式结束,栈中唯一元素即为表达式的值。2.4队列(Queue)队列是对线性表的插入和删除操作加以限定的另一种限定型数据结构。[定义]将线性表的插入和删除操作分别限制在表的两端进行,和栈相反,队列是一种先进先出(FirstInFirstOut,简称FIFO结构)的线性表。a1,a2,a3,···,···,an-1,an出队列入队列,插入,排队删除,出队队头队尾队列示意图frontrear操作:MAKENULL(Q)、FRONT(Q)、ENQUEUE(x,Q)、DEQUEUE(Q)、EMPTY(Q)2.4队列(Queue)2.4.1队列的指针实现元素结构:

struct

celltype{

elementtypeelement;

celltype*next;

};队列的“型”:

structQUEUE{

celltype*front;

celltype*rear;}a1a2an∧…Q.frontQ.rear队列的指针实现示意图2.4.1队列的指针实现操作:①VoidMAKENULL(QUEUE&Q)

{Q.front=Newcelltype;Q.front→next=NULL;Q.rear=Q.front;

};②booleanEMPTY(Q);QUEUE&Q;{if(Q.front==Q.rear)returnTRUE;elsereturnFALSE;};③elementtypeFRONT(Q);QUEUEQ;{returnQ.front→element;};2.4.1队列的指针实现④VoidENQUEUE(elementtypex,QUEUE&Q){Q.rear→next=newcelltype;Q.rear=Q.rear→next;Q.rear→element=x;Q.rear→next=NULL;};⑤VoidDELETE(QUEUE&Q)

{

celltype*temp;if(EMPTY(Q))error(“空队列”);else{temp=Q.front→next;Q.front→next=temp→next;deletetemp;if(Q.front→next==NULL)Q.rear=Q.front;}

};2.4.2队列的数组实现队列的“型”:

structQUEUE{

elementtypeelement[maxlength];

intfront;

intrear;}a1a2a3a4···an···

Qfrontrearmaxlength右图:队列Q状态1随着不断有元素出队和进队(插入和删除),队列的状态由1变成2;此时an占据队列的最后一个位置;第n+1个元素无法进队,但实际上,前面部分位置空闲。“假溢出“maxlengtha1a2a3a4a5a6···anQfrontrear下图:队列Q状态22.4.2队列的数组实现解决假溢出的方法有多种;一是通过不断移动元素位置,每当有元素出队列时,后面的元素前移一个位置,是队头元素始终占据队列的第一个位置。第二种方法是采用循环队列。········Q.rearQ.front01maxlength-1队列Q······插入元素:

Q.rear=(Q.rear+1)%maxlength删除元素:

Q.front=(Q.front+1)%maxlength队空:

(Q.rear+1)%maxlength==Q.front队满:

(Q.rear+1)%maxlength==Q.front?2.4.2队列的数组实现问题:如何解决循环队列中队空与队满状态相同?方法一:约定队列头指针在队列尾指针的下一位置上;方法二:另设一个标志位用以区别队空与队满两种状态;结论:两种方法的代价是相同的。操作:

int

addone(inti){return((i+1)%maxlength);};①VoidMAKENULL(QUEUE&Q){Q.front=0;Q.rear=maxlength–1;}②booleanEMPTY(Q)QUEUEQ;{if(addone(Q.rear)==Q.front)returnTRUE;elsereturnFALSE;}2.4.2队列的数组实现

操作:③elementtypeFRONT(QUEUEQ){if(EMPTY(Q))returnNULL;elsereturn(Q.elements[Q.front]);};④VoidENQUEUE(elementtypex,QUEUEQ){if(addone(addone(Q.rear))==Q.front)error(“队列满”);else{Q.rear=addone(Q.rear);Q.elements[Q.rear]=x;}}2.4.2队列的数组实现⑤VoidDEQUEUE(QUEUEQ);{if(EMPTY(Q))error(“空队列”);elseQ.front=addone(Q.front);};2.5多项式的代数运算结点结构coefexplink系数指数下一项地址结点类型:

struct

polynode{

int

coef

intexp;

polylink*link;

}typedef

polynode*polypointer

;2.5多项式的代数运算例如:多项式p(x)=3x14+2x8+1采用链表表示如下:3142810∧P算法attch(c,e,d)建立一个新结点,其系数coef=c,指数exp=e;并把它链到d所指结点之后,返回该结点指针。

polypointer

attch(intc,inte,polypointerd){polypointerx;x=newpolynode;

x→coef=c;x→exp=e;d→link=x;returnx;};算法padd

实现两个多项式

a,b相加;

c(x)=a(x)+b(x)2.5多项式的代数运算polypointer

padd()

polypointera,polypointerb;{polypointerp,q,d,c;

intx;p=a→link;q=b→link;c=newpolynode;d=c;while((p!=NULL)&&(q!=NULL))switch(compare(p→exp,q→exp)){case‘=‘:x=p→coef+q→coef;if(x)d=attch(x,p→exp,d);p=p→link;q=q→link;break;case‘>’:d=attch(p→coef,p→exp,d);

q=q→link;break;case‘<‘:d=attch(q→coef,q→exp,d);p=p→link;break;}while(p!=NULL){d=attch(p→coef,p→exp,d);p=p→link;}while(q!=NULL){d=attch(q→coef,q→exp,d);q=q→link;}2.5多项式的代数运算

d→link=NULL;p=c;c=c→link;deletep;returnc;}2.6串(String)串是线性表的一种特殊形式,表中每个元素的类型为字符型,是一个有限的字符序列。串的基本形式可表示成:S=‘a1a2a3······an’;其中:charai

;0≤i≤n;n≥0;当n=0时,为空串。

n为串的长度;C语言中串有两种实现方法:

1、字符数组,如:charstr1[10];

2、字符指针,如:char*str2;操作:stringNULL();booleanISNULL(S);VoidIN(S,a);intLEN(S);VoidCONCAT(S1,S2);stringSUBSTR(S,m,n);booleanINDEX(S,S1);2.6.1抽象数据型串2.6串(String)例一:将串T插在串S中第i个字符之后INSERT(S,T,i)。VoidINSERT(STRING&S,STRINGT,inti){STRINGt1,t2;if((i<0)||(i>LEN(S))error‘指定位置不对’;elseif(ISNULL(S))S=T;elseif(ISNULL(T)){t1=SUBSTR(S,1,i);t2=SUBSTR(S,i+1,LEN(S));S=CONCAT(t1,CONCAT(T,t2));}}2.6串(String)VoidDELETE(STRING&S,STRINGT){STRINGt1,t2;

intm,n;m=INDEX(S,T);if(m==0)error‘串S中不包含子串T’;else{n=LEN(T);t1=SUBSTR(S,1,m-1);t2=SUBSTR(S,m+n,LEN(S));S=CONCAT(t1,t2);}}例二:从串S中将子串T删除DELETE(S,T)。2.6串(String)2.6.2串的实现1、串的顺序存储采用连续的存储空间(数组),自第一个元素开始,依次存储字符串中的每一个字符。

charstr[10]=“China”;‘C’‘h’‘i’‘n’‘a’‘\0’

0123456789str串的顺序存储操作:NULL,ISNULL,IN,LEN,CONCAT,SUBSTR,INDEX2、串的链式存储构造线性链表,element类型为char,自第一个元素开始,依次存储字符串中的每一个字符。2.6.2串的实现2、串的链式存储‘i’

‘n’

‘a’∧‘C’

‘h’

str1structnode{chardata;node*link;};typedefnode*STRING1;STRINGstr1;structnode{chardata[4];node*link;};typedefnode*STRING2;STRINGstr2;‘C’‘h’‘i’‘n’

‘C’‘¢’‘¢’‘¢’∧str2假设地址量(link)占用2个字节5/155/122、串的链式存储intINDEX(STRING1S,S1){

structnode*p,*q,*i;

intt;if((S1!=NULL)&&(S!=NULL))

{t=1;i=S;q=S1;do{if(p→data==q→data){q=q→link;if(q==NULL)return(t);p=p→link;}else{t=t+1;i=i→link;p=i;q=S1;}

}while(p!=NULL);

}return0;};INDEX(S,S1)若S1是S的子串则返回

S1首字符在S中的位置;否则,返回0;操作:2.7数组(ARRAY)2.7.1抽象数据型数组●数组是由下标(index)和值(value)组成的序对(index,value)的集合。●也可以定义为是由相同类型的数据元素组成有限序列。●数组在内存中是采用一组连续的地质空间存储的,正是由于此种原因,才可以实现下标运算。●所有数组都是一个一维向量。数组1:(a1,a2,a3,···,ai

,···,an);数组2:(a11,···,a1n,a21,···,a2n,···,aij

,···,am1,···,amn);1≤i≤m,1≤j≤n;数组3:(a111,···,a11n,a121,···,a12n,···,aijk

,···,amn1,···,amnp);1≤i≤m,1≤j≤n,1≤k≤p;2.7.1抽象数据型数组

n维数组中含有∏bi个数据元素,每个元素都受着n个关系的约束。在每个关系中,元素aj1j2···jn(0≤ji

≤bi-2)都有一个直接后继元素。i=1n因此,数组仍是一种特殊形式的线性表。对二维数组可以理解成一维数组,其每个元素又是一个一维数组;以此类推,所谓n维数组同样如此。操作:CREATE();建立一个空数组

RETRIEVE(array,index);返回第index个元素

STORE(array,index,value);

在数组array中,为第index个元素赋值value注:由于高级语言中都提供了数组,本课略去操作。2.7.2数组的实现1、数组的顺序存储数组的顺序表示,指的是在计算机中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论