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