printf(\请输入第一个报数上限值m(m>0):\ scanf(\
printf(\ printf(\出列的顺序为:\\n\ q=L;
p=L->next;
while(n!=1) /*计算出列的顺序*/ {
j=1;
while(j q=p; /*q为当前结点p的前驱结点*/ p=p->next; j++; } printf(\ m=p->password; /*获得新密码*/ n--; q->next=p->next; /*p出列*/ r=p; p=p->next; free(r); } printf(\ } 第3章 限定性线性表 — 栈和队列 第三章答案 1按3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: (1) 如进站的车厢序列为123,则可能得到的出站车厢序列是什么? (2) 如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说 明原因(即写出以“S”表示进栈、“X”表示出栈的栈序列操作)。 【解答】 (1)可能得到的出站车厢序列是:123、132、213、231、321。 (2)不能得到435612的出站序列。 因为有S(1)S(2)S(3)S(4)X(4)X(3)S(5)X(5)S(6)S(6),此时按照“后进先出”的原则,出栈的顺序必须为X(2)X(1)。 能得到135426的出站序列。 因为有S(1)X(1)S(2)S(3)X(3)S(4)S(5)X(5)X(4)X(2)X(1)。 3 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 【解答】(1)顺序栈 (top用来存放栈顶元素的下标) 判断栈S空:如果S->top==-1表示栈空。 判断栈S满:如果S->top==Stack_Size-1表示栈满。 (2) 链栈(top为栈顶指针,指向当前栈顶元素前面的头结点) 判断栈空:如果top->next==NULL表示栈空。 判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。 4 照四则运算加、减、乘、除和幂运算的优先惯例,画出对下列表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F 5 【解答】 5 写一个算法,判断依次读入的一个以@为结束符的字母序列,是否形如‘序列1&序列2’的字符序列。序列1和序列2中都不含‘&’,且序列2是序列1 的逆序列。例如,’a+b&b+a’是属于该模式的字符序列,而’1+3&3-1’则不是。 【解答】算法如下: int IsHuiWen() { Stack *S; Char ch,temp; InitStack(&S); Printf(“\\n请输入字符序列:”); Ch=getchar(); While( ch!=&) /*序列1入栈*/ { Push(&S,ch); ch=getchar(); } do /*判断序列2是否是序列1的逆序列*/ { ch=getchar(); Pop(&S,&temp); if(ch!= temp) /*序列2不是序列1的逆序列*/ { return(FALSE); printf(“\\nNO”);} } while(ch!=@ && !IsEmpty(&S)) if(ch = = @ && IsEmpty(&S)) { return(TRUE); printf(“\\nYES”);} /*序列2是序列1的逆序列*/ else {return(FALSE); printf(“\\nNO”);} }/*IsHuiWen()*/ 8 要求循环队列不损失一个空间全部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法。 【解答】入队算法: int EnterQueue(SeqQueue *Q, QueueElementType x) { /*将元素x入队*/ 6 if(Q->front==Q->front && tag==1) /*队满*/ return(FALSE); if(Q->front==Q->front && tag==0) /*x入队前队空,x入队后重新设置标志*/ tag=1; Q->elememt[Q->rear]=x; Q->rear=(Q->rear+1)%MAXSIZE; /*设置队尾指针*/ Return(TRUE); } 出队算法: int DeleteQueue( SeqQueue *Q , QueueElementType *x) { /*删除队头元素,用x返回其值*/ if(Q->front==Q->rear && tag==0) /*队空*/ return(FALSE); *x=Q->element[Q->front]; Q->front=(Q->front+1)%MAXSIZE; /*重新设置队头指针*/ if(Q->front==Q->rear) tag=0; /*队头元素出队后队列为空,重新设置标志域*/ Return(TUUE); } 第4章 串 第四章答案 1 设s=’I AM A STUDENT’,t=’GOOD’, q=’WORKER’。给出下列操作的结果: 【解答】StrLength(s)=14; SubString(sub1,s,1,7) sub1=’I AM A ’; SubString(sub2,s,7,1) sub2=’ ’; StrIndex(s,4,’A’)=6; StrReplace(s,’STUDENT’,q); s=’I AM A WORKER’; StrCat(StrCat(sub1,t),StrCat(sub2,q)) sub1=’I AM A GOOD WORKER’。 2编写算法,实现串的基本操作StrReplace(S,T,V)。 【解答】算法如下: int strReplace(SString S,SString T, SString V) {/*用串V替换S中的所有子串T */ int pos,i; pos=strIndex(S,1,T); /*求S中子串T第一次出现的位置*/ if(pos = = 0) return(0); while(pos!=0) /*用串V替换S中的所有子串T */ { switch(T.len-V.len) { case 0: /*串T的长度等于串V的长度*/ for(i=0;i<=V.len;i++) /*用V替换T*/ S->ch[pos+i]=V.ch[i]; case >0: /*串T的长度大于串V的长度*/ for(i=pos+t.ien;i 7 S->len=S->len-T.len+V.len; case <0: /*串T的长度小于串V的长度*/ if(S->len-T.len+V.len)<= MAXLEN /*插入后串长小于MAXLEN*/ { /*将S中子串T后的所有字符后移V.len-T.len个位置*/ for(i=S->len-T.len+V.len;i>=pos+T.len;i--) S->ch[i]=S->ch[i-T.len+V.len]; for(i=0;i<=V.len;i++) /*用V替换T*/ S->ch[pos+i]=V.ch[i]; S->len=S->len-T.len+V.len; } else { /*替换后串长>MAXLEN,但串V可以全部替换*/ if(pos+V.len<=MAXLEN) { for(i=MAXLEN-1;i>=pos+T.len; i--) S->ch[i]=s->ch[i-T.len+V.len] for(i=0;i<=V.len;i++) /*用V替换T*/ S->ch[pos+i]=V.ch[i]; S->len=MAXLEN;} else /*串V的部分字符要舍弃*/ { for(i=0;i pos=StrIndex(S,pos+V.len,T); /*求S中下一个子串T的位置*/ }/*while()*/ return(1); }/*StrReplace()*/ 第五章 数组和广义表 第五章答案 1.假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。已知A的基地址为1000,计算: (1) 数组A共占用多少字节; (288) (2) 数组A的最后一个元素的地址; (1282) (3) 按行存储时,元素A36的地址; (1126) (4) 按列存储时,元素A36的地址; (1192) 4.设有三对角矩阵An×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=aij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。 【解答】(1)k=2(i-1)+j (2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余) 5.在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。 【解答】算法(一) FastTransposeTSMatrix(TSMartrix A, TSMatrix *B) {/*把矩阵A转置到B所指向的矩阵中去,矩阵用三元组表表示*/ int col,t,p,q; int position[MAXSIZE]; B->len=A.len; B->n=A.m; B->m=A.n; 8