版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.1抽象数据型线性表2.2线性表的实现2.3栈(Stack)2.4队列(Queue)实验一:多项式的代数运算2.5串(String)2.6数组(Array)2.7广义表(Lists)第2章线性表(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的直接后继。④线性表是有限的,也是有序的。线性表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)数学模型举例:设计函数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{elementtypedata[maxlength];intlast;};位置类型:
typedefintposition;线性表L:LISTL;操作:①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.data[q+1]=L.data[q];L.last=L.last+1;L.data[p]=x;}}②positionLOCATE(elementtypex,LISTL){positionq;for(q=1;q<=L.last;q++)if(L.data[q]==x)return(q);return(L.last+1);}③elementtypeRETRIEVE(positionp,LISTL){if(p>L.last)error(“指定元素不存在”);elsereturn(L.data[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.data[q]=L.data[q+1];}}⑤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.3线性表的指针实现结点形式datanext结点信息下一结点地址NODE结点类型structNODE{elementtypedata;structNODE*next;};typedefNODE*LIST;typedefNODE*position;LISTheader;positionp,q;a1a2a3an∧…headerqpa2:(*p).data;q:(*p).next;a2:p->data;q:p->next;记法:操作讨论:插入元素:pa1xheaderqai-1aixpqan∧x∧qp(a)表头插入元素(b)中间插入元素(c)表尾插入元素q=newNODE;q->data=x;q->next=p->next;p→next=q;或:temp=p->next;P->next=newNODE;P->next->data=x;P->next->next=temp;讨论表头结点的作用操作讨论:删除元素: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)删除表尾元素∧ADT操作:①positionEND(LIST){positionq;q=L;while(q→next!=NULL)q=q→next;return(q);};②VoidINSERT(elementtypex,positionp,LIST&L){positionq;q=newNODE;q→data=x;q→next=p→next;p→next=q;}③positionLOCATE(elementtypex,LISTL){positionp;p=L;while(p→next!=NULL)if(p→next→data==x)returnp;elsep=p→next;returnp;}④elementtypeRETRIEVE(positionp,LISTL){return(p→next→data);}⑤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;}}⑦positionNEXT(positionp,LISTL){positionq;if(p→next==NULL)error(“不存在后继元素”);
else{q=p→next;returnq;}}⑧positionMAKENULL(LIST&L){L=newNODE;L→next=NULL;returnL;}⑨positionFIRST(LISTL){returnL;}举例:遍历线性链表,按照线性表中元素的顺序,依次访问表中的每一个元素,每个元素只能被访问一次。VoidVISITE(LISTL){positionp;p=L→next;while(p!=NULL){cout<<p→data;p=p→next;}}线性表静态存储与动态存储的比较比较参数←表的容量→←存取操作→←时间→←空间→…链式存储灵活,易扩充顺序存取访问元素费时间实际长度,节省空间…顺序存储固定,不易扩充随机存取插入删除费时间估算表长度,浪费空间…2.2.4线性表的游标实现结点形式datanext结点信息下一结点位置spacestr结点类型structspacestr{elementtypedata;intnext;};线性表:spacestrSPACE[maxsize];typedefintposition;元素:SPACE[i].data→“型”为elementtype(基本、复合)下一元素位置:SPACE[i].next→“型”为int类似指针链表,对游标实现的线性表仍设表头结点。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].data=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.5双向链表结点形式datanext结点信息后继结点指针dcelltypeprevious前驱结点指针结点类型
structdnodetype{elementtypedata;dnodetype*next,*previous;};typedefdnodetype*DLIST;typedefdnodetype*position;ai-1
ai
ai+1
p删除位置p的元素:p→previous→next=p→next;p→next→previous=p→previous;
∧header
an
∧tail操作:VoidINSERT(elementtypex,positionp,DLIST&L);{positionq;q=newdnodetype;q→data=x;P→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=newNODE;p→data=x;if(R==NULL){p→next=p;R=p;}else{p→next=R→next;R→next=p;}};②在表右端插入结点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){structNODE*p;if(R==NULL)error(“空表”);else{p=R→next;R→next=p→next;if(p==R)R=NULL;deletep;}};双向环形链表:a1
ai
an
……R
双向环形链表的结构与双向连表结构相同,只是将表头元素的空previous域指向表尾,同时将表尾的空next域指向表头结点,从而形成向前和向后的两个环形链表,对链表的操作变得更加灵活。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栈底栈顶栈示意图栈的基本①MAKENULL(S)
操作②TOP(S)③POP(S)④PUSH(x,S)⑤EMPTY(S)例2:利用栈实现行编辑处理。设定符号“#”为擦讫符,用以删除“#”前的字符;符号“@”为删行符,用以删除当前编辑行。原理:一般字符进栈;读字符擦讫符退栈;删行符则清栈算法: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栈的实现1、顺序存储顺序栈示意图an···ai···a3a2a1maxlength-1······3210top结构类型:
typedefstruct{elementtypedata[maxlength];inttop;}STACK;STACKS;栈的容量:maxlength–1;栈空:S.top=0;栈满:S.top=maxlength–1;栈顶元素:S.data[S.top];操作:①VoidMAKENULL(STACK&S){S.top=0;};②BooleanEMPTY(STACKS){if(S.top<1)returnTRUEelsereturnFALSE;};③elementtypeTOP(STACKS){ifEMPTY(S)returnNULL;elsereturn(S.data[S.top]);};操作:④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.data[S.top]=x;}};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]IntIs_Stack_i_Full(STACKS,intbot,inttop,inti)/*判断第i个栈是否满,满返回1,否则返回0*/{……}VoidMove_Stack_i(STACK&S,int&bot,int&top,inti,intdt)/*移动第i个栈,dt为位移量*/{……}…CallB…主程序A…CallC…主程序B…CallD…主程序C……i…主程序DBeginEndDaDaDbDcDbDc栈入栈出栈例1:子程序的嵌套调用2.3.2栈的应用1、栈和递归过程调用Bα
βγδ调用C调用BABC栈调用Bαβ
βγδ调用C调用BABC栈调用Bαβγ
βγδ调用C调用BABC栈A的返回点(1)子程序A正在执行(2)A调用B,B在执行(3)B调用C,C在执行先进先出的规则:在执行的任何点处,若一个程序要将控制返回到调用程序,则该程序一定是最末一个进入的。例2:间接递归3个程序A、B、C,其中A调用B,B调用C,而C又递归调用B。调用Bαβ
βγδ调用C调用BABC栈调用Bαβγ
βγδ调用C调用BABC栈(6)C返回到B,(第一次调用)
B在执行,C执行完毕成(5)B返回到C,C在执行对B的递归调用完毕调用Bα
βγδ调用C调用BABC栈(7)B返回到A,A在执行,非递归调用B完毕调用Bαβγδ
βγδ调用C调用BABC栈(4)C递归调用B,,B在执行SubA…CallA…Da1Da2Da3…Dan-1Da1Da2Da3…Dan-1DanDanBeginEnd例3:直接递归2、迷宫求解问题:010001100011111100011011100111011000011110011110111101101100110100101111111001101110100111011110011111111001101101111101110001101100000001111100011110010011111011110
一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n]出去的路径。11×15→m×n出口入口**********************************************迷宫示例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[v][1]=i+1;h=j+move[v][2]=j+1;Vij说明101E211SE310S41-1SW50-1W6-1-1NW7-10N8-11NE⑶为避免时时监测边界状态,可把二维数组maze[1:m,1:n]扩大为maze[0:m+1,0:n+1],且令0行和0列、m+1行和n+1列的值为1;出口入口****************************迷宫示例⑷采用试探的方法,当到达某个位置且周围八个方向走不通时需要回退到上一个位置,并换一个方向继续试探;为解决回退问题,需设一个栈,当到达一个新位置时将(i,j,v)进栈,回退时退栈。⑸每次换方向寻找新位置时,需测试该位置以前是否已经经过,对已到达的位置,不能重复试探,为此设矩阵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)则到达入口,说明迷宫走不通。VoidGETMAZE(maze,mark,move,S){(i,j,v)=(1,1,1);mark[1][1]=1;s.top=0;do{g=i+move[v][1];h=j+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(s.top>0)(i,j,v++)=POP(S);};}while((s.top)&&(v!=8));cout<<“路径不存在!”;}3、表达式求值
前缀表达式(逆波兰式)表达式:中缀表达式后缀表达式(波兰式)例如:*+ab-ab(a+b)*(a-b)(a+b)*(a-b)ab+ab-*
高级语言中,采用类似自然语言的中缀表达式,但计算机对中缀表达式的处理是很困难的,而对后缀或前缀表达式则显得非常简单。后缀表达式的特点:①在后缀表达式中,变量(操作数)出现的顺序与中缀表达式顺序相同。②后缀表达式中不需要括弧定义计算顺序,而由运算(操作符)的位置来确定运算顺序。波兰逻辑学家J.Lukasiewicz于1929年提出的一种表达式。Ⅰ.将中缀表达式转换成后缀表达式
对中缀表达式从左至右依次扫描,由于操作数的顺序保持不变,当遇到操作数时直接输出;为调整运算顺序,设立一个栈用以保存操作符,扫描到操作符时,将操作符压入栈中,进栈的原则是保持栈顶操作符的优先级要高于栈中其他操作符的优先级,否则,将栈顶操作符依次退栈并输出,直到满足要求为止。遇到“(”进栈,当遇到“)”时,退栈输出直到“)”为止。Ⅱ.由后缀表达式计算表达式的值
对后缀表达式从左至右依次扫描,与Ⅰ相反,遇到操作数时,将操作数进栈保留;当遇到操作符时,从栈中退出两个操作数并作相应运算,将计算结果进栈保留;直到表达式结束,栈中唯一元素即为表达式的值。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.1队列的指针实现元素结构:
structNODE{elementtypedata;
celltype*next;
};队列的“型”:
structQUEUE{celltype*front;
celltype*rear;}a1a2an∧…Q.frontQ.rear队列的指针实现示意图操作:①VoidMAKENULL(QUEUE&Q){Q.front=NewNODE;Q.front→next=NULL;Q.rear=Q.front;};②booleanEMPTY(Q);QUEUE&Q;{if(Q.front==Q.rear)returnTRUE;elsereturnFALSE;};③elementtypeFRONT(Q);QUEUEQ;{returnQ.front→data;};④VoidENQUEUE(elementtypex,QUEUE&Q){Q.rear→next=newNODE;Q.rear=Q.rear→next;Q.rear→data=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{elementtypedata[maxlength];intfront;
intrear;
}随着不断有元素出队和进队(插入和删除),队列的状态由1变成2;此时an占据队列的最后一个位置;第n+1个元素无法进队,但实际上,前面部分位置空闲。a1a2a3a4···an···
Qfrontrearmaxlength右图:队列Q状态1“假溢出“maxlengtha1a2a3a4a5a6···anQfrontrear下图:队列Q状态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.front012345…n-1n-2i…frontreara1a2a3a4a5Q.rear=(Q.rear+1)%nQ.front=(Q.front+1)%n问题:如何解决循环队列中队空与队满状态相同?方法一:约定队列头指针在队列尾指针的下一位置上;方法二:另设一个标志位用以区别队空与队满两种状态;结论:两种方法的代价是相同的。操作:
intaddone(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;}
操作:③elementtypeFRONT(QUEUEQ){if(EMPTY(Q))returnNULL;elsereturn(Q.data[Q.front]);};④VoidENQUEUE(elementtypex,QUEUEQ){if(addone(addone(Q.rear))==Q.front)error(“队列满”);else{Q.rear=addone(Q.rear);Q.datas[Q.rear]=x;}}⑤VoidDEQUEUE(QUEUEQ);{if(EMPTY(Q))error(“空队列”);elseQ.front=addone(Q.front);};实验一多项式的代数运算P(x)=∑aixii=n-10方案1:数组一方案2:数组二n-1an-1……iai……3a32a21a10a0coefn-1expn-1coefn-2expn-2……coefiexpi……coef2exp2coef1exp1coef0exp0……P(x)=3x14+2x8+1P(x)=3x14+2x8+1143130120110100908270605040302010013142810…coeftypep[N};Struct{coeftypecoef;exptypeexp;}p[N]结点结构coefexplink系数指数下一项地址结点类型:
structpolynode{intcoef;
intexp;
polylink*link;
}typedefpolynode*polypointer;P(x)=∑aixii=n0方案3:链表例如:多项式p(x)=3x14+2x8+1采用链表表示如下:3142810∧P算法attch(c,e,d)建立一个新结点,其系数coef=c,指数exp=e;并把它链到d所指结点之后,返回该结点指针。
polypointerattch(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)polypointerpadd()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);p=p→link;break;case‘<‘:d=attch(q→coef,q→exp,d);q=q→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;}d→link=NULL;p=c;c=c→link;deletep;returnc;}2.5串(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.5.1抽象数据型串例一:将串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));}}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.5.2串的实现1、串的顺序存储采用连续的存储空间(数组),自第一个元素开始,依次存储字符串中的每一个字符。
charstr[10]=“China”;‘C’‘h’‘i’‘n’‘a’‘\0’
0123456789str串的顺序存储操作:NULL,ISNULL,IN,LEN,CONCAT,SUBSTR,INDEX2、串的链式存储构造线性链表,element类型为char,自第一个元素开始,依次存储字符串中的每一个字符。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/12intINDEX(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.6数组(ARRAY)2.6.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,···,am
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 提高团队执行力的工作总结计划
- 兰州工业学院《芭蕾舞基训1》2023-2024学年第一学期期末试卷
- 兰州大学《新闻学理论研究与应用》2023-2024学年第一学期期末试卷
- 兰州财经大学《数字信号处理(双语)》2023-2024学年第一学期期末试卷
- 兰州博文科技学院《数字娱乐短片设计》2023-2024学年第一学期期末试卷
- 定制化生产的工作计划设计
- 礼品行业会计个人工作计划
- 税务规划与合规性计划
- 季节性工作的劳动合同三篇
- 文化品牌的构建与传播计划
- 昆明理工大学《自然语言处理》2022-2023学年第一学期期末试卷
- 陈义小学进城务工人员随迁子女入学工作制度和措施
- 部编版六年级道德与法治上册第9课《知法守法 依法维权》精美课件(第2课时)
- 小儿急腹症观察和护理
- 统编版七年级上学期期末考试语文试卷(含答案)
- 《长江电力财务分析》课件
- 2023年中国铁路武汉局集团有限公司招聘大专(高职)学历笔试真题
- 中考英语复习听说模拟训练(一)课件
- 公立医院创新管理薪酬激励方案
- 药品经营使用和质量监督管理办法2024年宣贯培训课件
- 旅社承包合同样本
评论
0/150
提交评论