QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4971|回复: 3
打印 上一主题 下一主题

《数据结构(c语言版)习题集》算法设计解决方案

[复制链接]
字体大小: 正常 放大

66

主题

1

听众

648

积分

VisaSky.com 加拿大移民留学网

  • TA的每日心情
    开心
    2012-6-9 03:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发帖功臣 元老勋章

    跳转到指定楼层
    1#
    发表于 2004-11-28 18:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    < >说明: <p></p></P>
    + o  h. c, r; V5 `# W<><FONT size=3>1. <FONT face=宋体>本文是对严蔚敏《数据结构</FONT>(c<FONT face=宋体>语言版</FONT>)<FONT face=宋体>习题集》一书中所有算法设计题目的解决方案<p></p></FONT></FONT></P>
    & j" j, \) N0 P# k<><FONT size=3>2. <FONT face=宋体>本解答中的所有算法均采用类</FONT>c<FONT face=宋体>语言描述</FONT>,<FONT face=宋体>设计原则为面向交流、面向阅读</FONT>,<FONT face=宋体>作者不保证程序能够上机正常运行</FONT>(<FONT face=宋体>这种保证实际上也没有任何意义</FONT>);<p></p></FONT></P>
    - t7 l" v$ m  c8 G+ e<><FONT size=3>3. <FONT face=宋体>本解答原则上只给出源代码以及必要的注释</FONT>,<FONT face=宋体>对于一些难度较高或思路特殊的题目将给出简要的分析说明</FONT>,<FONT face=宋体>对于作者无法解决的题目将给出必要的讨论</FONT>.<FONT face=宋体>目前尚未解决的题目有</FONT>: 5.20, 10.40;<p></p></FONT></P>7 E2 m6 P: ]/ \0 b, h
    <><FONT size=3>4. <FONT face=宋体>请读者在自己已经解决了某个题目或进行了充分的思考之后</FONT>,<FONT face=宋体>再参考本解答</FONT>,<FONT face=宋体>以保证复习效果</FONT>;<p></p></FONT></P>. D4 V% m# o8 Q2 y* H1 A
    <><FONT size=3>5. <FONT face=宋体>由于作者水平所限</FONT>,<FONT face=宋体>本解答中一定存在不少这样或者那样的错误和不足</FONT>,<FONT face=宋体>希望读者们在阅读中多动脑、勤思考</FONT>,<FONT face=宋体>争取发现和纠正这些错误</FONT>,<FONT face=宋体>写出更好的算法来</FONT>.<p></p></FONT></P>' [0 q6 m3 p! ~
    < ><FONT face=宋体>第一章</FONT> <FONT face=宋体>绪论</FONT> <p></p></P>$ u5 J) Y* N1 o- e
    <><FONT size=3>1.16 <p></p></FONT></P>
    ( _7 C$ I* Z5 y; n7 u, w! E: d<><FONT size=3>void print_descending(int x,int y,int z)//<FONT face=宋体>按从大到小顺序输出三个数</FONT></FONT>2 D- o1 n4 T; [  n/ p1 I
    <FONT size=3>{1 I+ _! [% `) @( t2 l
      scanf("%d,%d,%d",&amp;x,&amp;y,&amp;z);" f* |# l6 x6 w/ y: r! x3 a
      if(x&lt;y) x&lt;-&gt;y; //&lt;-&gt;</FONT><FONT size=3><FONT face=宋体>为表示交换的双目运算符</FONT>,<FONT face=宋体>以下同</FONT></FONT>' X, l) u: }' T. M
    <FONT size=3>  if(y&lt;z) y&lt;-&gt;z;
    0 A* W. s. Y% @9 d2 X8 `  if(x&lt;y) x&lt;-&gt;y; //</FONT><FONT face=宋体 size=3>冒泡排序</FONT>
    7 D7 |. }& b( ]  _! _- J<FONT size=3>  printf("%d %d %d",x,y,z);7 y6 k8 k8 \1 ?/ s
    }//print_descending <p></p></FONT></P>, w( D' N1 d7 A
    <><FONT size=3>1.17 <p></p></FONT></P>1 M* C& P8 @  D- h% `8 s* G
    <><FONT size=3>Status fib(int k,int m,int &amp;f)//<FONT face=宋体>求</FONT>k<FONT face=宋体>阶斐波那契序列的第</FONT>m<FONT face=宋体>项的值</FONT></FONT><FONT size=3>f
    * E; {6 L8 p1 f. |% |{
    7 ?* |3 c6 a8 g- {4 {! H5 b5 z  int tempd;& ]1 S" F+ \# ^% }! u7 Y* H. I& N( o
      if(k&lt;2||m&lt;0) return ERROR;" M6 v, U+ E$ l
      if(m&lt;k-1) f=0;6 P- U" s" I% ^0 m% {3 d3 b
      else if (m==k-1) f=1;
    & ], R# ]% B" k+ D  else" U" {# [+ t$ \5 k
      {2 b3 b3 F* m" J3 Y' C0 w9 m
        for(i=0;i&lt;=k-2;i++) temp=0;  C' k: @. Q* z
        temp[k-1]=1; //<FONT face=宋体>初始化</FONT></FONT>& D7 G0 r  ], t
    <FONT size=3>    for(i=k;i&lt;=m;i++) //</FONT><FONT size=3><FONT face=宋体>求出序列第</FONT>k<FONT face=宋体>至第</FONT>m<FONT face=宋体>个元素的值</FONT></FONT>7 R" A! k: }, q/ t# a7 e7 }) I
    <FONT size=3>    {6 V0 q" o! b$ G4 L& \
          sum=0;
    , y1 {* k9 D5 F; r5 J' U      for(j=i-k;j&lt;i;j++) sum+=temp[j];
    ! [9 ]% ~1 q/ q, @! y. a6 G      temp=sum;
    8 u7 X0 M0 N7 U    }
    % c3 a8 s/ t* D# E$ ~4 r    f=temp[m];
    : n! G3 Q; ]4 Y2 X- C9 z) n  }1 l# b0 k) J  z: D2 B
      return OK;
    * l- p0 L% o. @0 f: h1 x}//fib8 _( v$ u( s. F  S% `
    </FONT><FONT size=3><FONT face=宋体>分析</FONT>:<FONT face=宋体>通过保存已经计算出来的结果</FONT>,<FONT face=宋体>此方法的时间复杂度仅为</FONT>O(m^2).<FONT face=宋体>如果采用递归编程</FONT>(<FONT face=宋体>大多数人都会首先想到递归方法</FONT>),<FONT face=宋体>则时间复杂度将高达</FONT>O(k^m). <p></p></FONT></P>
    6 T3 |# |9 b& z+ `# H( j  O<><FONT size=3>1.18 <p></p></FONT></P>
    8 U4 q* d" k2 N$ u$ J<><FONT size=3>typedef struct{! C* B5 Z. [; v# G
                        char *sport;
    7 u9 U1 Z, e9 j- r                    enum{male,female} gender;  R$ j! K8 n" R# e6 d- V: Q
                        char schoolname; //<FONT face=宋体>校名为</FONT>'A','B','C','D'<FONT face=宋体>或</FONT></FONT><FONT size=3>'E'5 P9 K( {* G& V0 p3 L
                        char *result;
    $ b8 }! Z5 b2 T& @$ g                    int score;
    ; w7 j! I& E" l3 z                  } resulttype; <p></p></FONT></P>
    / j/ S1 ]) b8 B% w, m) Z9 p<><FONT size=3>typedef struct{
    # d' F& _% B" o5 \, X                    int malescore;
    $ Q: N+ Z- f( N% r                    int femalescore;
    ; H7 s5 A$ E! V3 k                    int totalscore;
    4 a/ }& i4 ~5 G; s6 s8 n5 O                  } scoretype; <p></p></FONT></P>
    ; ~( m% M8 g  F$ o0 t9 g: E<><FONT size=3>void summary(resulttype result[ ])//<FONT face=宋体>求各校的男女总分和团体总分</FONT>,<FONT face=宋体>假设结果已经储存在</FONT>result[ ]<FONT face=宋体>数组中</FONT></FONT>9 e- y. s) D) N5 g5 y
    <FONT size=3>{
    . @7 N1 ~& S- d" [  scoretype score;
    7 c* Y7 m3 s0 q( U  i=0;
    & l  E3 a# W" ^0 D# R+ m  while(result.sport!=NULL)/ ]) p, l, B& f1 A
      {
    8 a4 l: ~( Z% Q    switch(result.schoolname)
    8 o( Q, U  W3 {1 O4 E! }    {
      S' Z7 ]' r* ~/ j      case 'A':
    ) x5 ]7 I- U# T+ ^/ S) o$ A        score[ 0 ].totalscore+=result.score;0 j6 Z# g9 _" g; d0 ]
            if(result.gender==0) score[ 0 ].malescore+=result.score;
    9 I9 [# S6 {; Q/ J        else score[ 0 ].femalescore+=result.score;2 Z7 c" K% l* G' @9 n5 [# H# n
            break;
    , Q3 h3 [' ]6 a7 ^      case 'B':
    : G/ t+ R4 t* S9 C9 K1 Y! B" X        score.totalscore+=result.score;' G: u+ `* r, `
            if(result.gender==0) score.malescore+=result.score;" L- j* U8 {5 `( @  W8 o' K% R
            else score.femalescore+=result.score;1 Z# }& Y: ]$ S& l9 a/ ?) i
            break;$ X/ k9 t$ L3 n; y' U- f
          </FONT><FONT size=3><FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT></FONT>0 _. }" P1 C3 \; q
    <FONT size=3>    }
    ' z3 I' C& {0 |1 t8 p    i++</FONT><FONT face=宋体 size=3>;</FONT>  T0 a5 C& {! T4 N" w
    <FONT size=3>  }' F3 b9 p. f. E9 }
      for(i=0;i&lt;5;i++)  u  Q" n: G6 P2 I7 y, `! B( T
      {
    9 b* Z4 G" P0 i2 i& Q9 ?- h1 N    printf("School %d:\n",i);) K- I0 ?& `- q/ D$ G5 m
        printf("Total score of male:%d\n",score.malescore);7 M' C$ e. H, X- W9 V! ?! m8 w+ `
        printf("Total score of female:%d\n",score.femalescore);
    & J  P6 y: J: q8 x' ^$ |    printf("Total score of all:%d\n\n",score.totalscore);3 M# o5 m! S6 f* U
      }
    , S+ O* R4 s2 w+ {( }1 `}//summary <p></p></FONT></P>
    0 F5 o6 ?' E. \8 @6 Z( N<><FONT size=3>1.19 <p></p></FONT></P>
    & y; m6 B! Z& m8 T2 X' Y<><FONT size=3>Status algo119(int a[ARRSIZE])//<FONT face=宋体>求</FONT>i!*2^i<FONT face=宋体>序列的值且不超过</FONT></FONT><FONT size=3>maxint
    7 U" ]+ W% c8 s* ~{: q9 C, L& P/ l
      last=1;1 O) `" r9 v' C! }
      for(i=1;i&lt;=ARRSIZE;i++)
    " t+ ^- b' r1 h9 f* {1 q3 _& S  {/ O6 k2 t6 h6 T6 X  z
      a[i-1]=last*2*i;
    $ H1 T" e$ c, d+ i1 H( a   if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;
    " @! V: _0 V/ X) L: J   last=a[i-1];
    4 ~1 p4 N0 \" N! L) Q# F+ i: D! j   return OK;
    ' P8 F/ A% V! z% v  }
    ' W7 d4 ^( Z' v}//algo119
    # N! H  S" F; d( _# W* ^* S- Y# W<FONT face=宋体>分析</FONT>:<FONT face=宋体>当某一项的结果超过了</FONT>maxint<FONT face=宋体>时</FONT>,<FONT face=宋体>它除以前面一项的商会发生异常</FONT>. <p></p></FONT></P>+ x# F! t* E" x* }+ n
    <><FONT size=3>1.20 <p></p></FONT></P>
    . s7 i* T* d  V' ^<><FONT size=3>void polyvalue()
    # g; o$ q6 H( M' X{6 @  b( L  {  U. L$ v5 ]
      float ad;7 L* D$ J+ C5 _5 ~0 M- q
      float *p=a;
    - \; M) r) D- {5 T% G" w1 O  printf("Input number of terms:");6 h; M' M: p" \: d- S/ D; u
      scanf("%d",&amp;n);
    * I* b% U$ c- G7 ]0 ]2 a4 X  printf("Input the %d coefficients from a0 to a%d:\n",n,n);8 T7 [$ U) h2 Y% x
      for(i=0;i&lt;=n;i++) scanf("%f",p++);6 ?* P" s4 |6 Z  v" h8 ^" ]
      printf("Input value of x:");1 @# U) Y* V4 E7 m/ c5 \
      scanf("%f",&amp;x);
    0 E4 S+ q8 D$ e% l/ ^  p=a;xp=1;sum=0; //xp<FONT face=宋体>用于存放</FONT>x<FONT face=宋体>的</FONT>i<FONT face=宋体>次方</FONT></FONT>( q) e7 n' @9 d4 U; ]
    <FONT size=3>  for(i=0;i&lt;=n;i++)5 H  o: I8 T7 O4 s
      {
    ) J8 f- x6 T# z0 _+ Q    sum+=xp*(*p++);7 m  H9 O1 I7 L
        xp*=x;
    % g7 d) s' r" K% T% h% y6 d  }
    ' e; n# p- o5 |: [  printf("Value is:%f",sum);
    ; L, c  k; ^5 C}//polyvalue<p></p></FONT></P>
    / N# e$ N2 P; J; M  t< ><p><FONT face="Times New Roman"> </FONT></p></P>
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    66

    主题

    1

    听众

    648

    积分

    VisaSky.com 加拿大移民留学网

  • TA的每日心情
    开心
    2012-6-9 03:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发帖功臣 元老勋章

    < 0cm 0cm 0pt; TEXT-INDENT: 144pt; mso-char-indent-count: 9.0">第二章 线性表 <p></p></P><><FONT size=3>2.10 <p></p></FONT></P><><FONT size=3>Status DeleteK(SqList &amp;a,int i,int k)//<FONT face=宋体>删除线性表</FONT>a<FONT face=宋体>中第</FONT>i<FONT face=宋体>个元素起的</FONT>k<FONT face=宋体>个元素</FONT></FONT>
    # o# i" d+ u7 o( z4 k/ @( d/ \<FONT size=3>{
    3 f' b" B& F& G& s+ Z" V  D$ R  if(i&lt;1||k&lt;0||i+k-1&gt;a.length) return INFEASIBLE;
    ! h5 x$ H: i: \( e/ q9 \: k* M  for(count=1;i+count-1&lt;=a.length-k;count++) //</FONT><FONT face=宋体 size=3>注意循环结束的条件</FONT>' w* ~2 z1 \  U& h! U+ I
    <FONT size=3>    a.elem[i+count-1]=a.elem[i+count+k-1];
    % a4 d! v' ]; F" y! r! L2 c  a.length-=k;
    % N" O7 {- c  m  return OK;5 P/ l9 G( `4 U- w( e
    }//DeleteK <p></p></FONT></P><><FONT size=3>2.11<p></p></FONT></P><><FONT size=3>Status Insert_SqList(SqList &amp;va,int x)//<FONT face=宋体>把</FONT>x<FONT face=宋体>插入递增有序表</FONT>va<FONT face=宋体>中</FONT></FONT>" u. b- u5 ~3 _9 u' T* `7 ]
    <FONT size=3>{
    5 g! Y) I# y- V0 F. `$ i! e  if(va.length+1&gt;va.listsize) return ERROR;& Q* \4 ?+ \6 [9 C
      va.length++;* d+ f0 d/ M  J8 g* ~3 ~; D
      for(i=va.length-1;va.elem&gt;x&amp;&amp;i&gt;=0;i--)' c9 c) b" O8 V* G
        va.elem[i+1]=va.elem;6 r$ q/ Q. I- R8 I0 o
      va.elem[i+1]=x;
    & x# o# R6 {7 w2 U  return OK;$ |$ b7 l- U! W- W/ S
    }//Insert_SqList <p></p></FONT></P><><FONT size=3>2.12 <p></p></FONT></P><><FONT size=3>int ListComp(SqList A,SqList B)//<FONT face=宋体>比较字符表</FONT>A<FONT face=宋体>和</FONT>B,<FONT face=宋体>并用返回值表示结果</FONT>,<FONT face=宋体>值为正</FONT>,<FONT face=宋体>表示</FONT>A&gt;B;<FONT face=宋体>值为负</FONT>,<FONT face=宋体>表示</FONT>A&lt;B;<FONT face=宋体>值为零</FONT>,<FONT face=宋体>表示</FONT></FONT><FONT size=3>A=B
    ; X4 U. e# W& r{
    3 S3 ~1 ]0 \' ?& o! D% I  for(i=1;A.elem||B.elem;i++)) a1 S7 W8 U) }* v, w2 d0 Z
        if(A.elem!=B.elem) return A.elem-B.elem;- R* i. E& C* Q$ D+ ~
      return 0;
    5 r; O, Z: t+ V. V- ^}//ListComp <p></p></FONT></P><><FONT size=3>2.13 <p></p></FONT></P><><FONT size=3>LNode* Locate(LinkList L,int x)//<FONT face=宋体>链表上的元素查找</FONT>,<FONT face=宋体>返回指针</FONT></FONT>
    / a7 k8 N! ]  C' _. k% N6 L- w<FONT size=3>{& I! y( U6 a8 X6 J' W( \0 s
      for(p=l-&gt;next;p&amp;&amp;p-&gt;data!=x;p=p-&gt;next);
    $ R( }' p$ t$ W4 }' C' R  return p;
    1 R0 C3 H. C; A) G7 v" P3 M}//Locate <p></p></FONT></P><><FONT size=3>2.14 <p></p></FONT></P><><FONT size=3>int Length(LinkList L)//<FONT face=宋体>求链表的长度</FONT></FONT>7 E! h+ `7 z6 {1 K% Z9 |; U5 E  `
    <FONT size=3>{
    7 m! N5 L+ r& n2 ^  for(k=0,p=L;p-&gt;next;p=p-&gt;next,k++);) L% q9 A* ^, _
      return k;  `+ B4 N7 j. S  I
    }//Length <p></p></FONT></P><><FONT size=3>2.15 <p></p></FONT></P><><FONT size=3>void ListConcat(LinkList ha,LinkList hb,LinkList &amp;hc)//<FONT face=宋体>把链表</FONT>hb<FONT face=宋体>接在</FONT>ha<FONT face=宋体>后面形成链表</FONT></FONT><FONT size=3>hc
    9 I5 ~3 y# v  L1 L! q{
    8 r! T6 Y' P. t  hc=ha;p=ha;
    ' R8 s$ W0 i9 L& B! N2 M5 a  while(p-&gt;next) p=p-&gt;next;$ ?7 t1 U5 u- w  a
      p-&gt;next=hb;% o* C+ ~; V& q9 F+ Z* |
    }//ListConcat <p></p></FONT></P><><FONT size=3>2.16 <p></p></FONT></P><><FONT size=3><FONT face=宋体>见书后答案</FONT>. <p></p></FONT></P><><FONT size=3>2.17 <p></p></FONT></P><><FONT size=3>Status Insert(LinkList &amp;L,int i,int b)//<FONT face=宋体>在无头结点链表</FONT>L<FONT face=宋体>的第</FONT>i<FONT face=宋体>个元素之前插入元素</FONT></FONT><FONT size=3>b
    3 }& I* i% j0 v/ B{& l& [( `! b5 K% w, A/ i' B: N
      p=L;q=(LinkList*)malloc(sizeof(LNode));
    * A/ F+ [7 j' u$ c$ d# x. E8 Y  q.data=b;
    ) h9 W, N1 w4 N# O  if(i==1)
      L3 D% D6 R) D4 |! A0 b4 [  {
    ( w$ a8 \' m" z% Y: r+ _( w# v    q.next=p;L=q; //<FONT face=宋体>插入在链表头部</FONT></FONT>5 I* C- ^  q$ [/ P5 E+ S7 K' s3 J& L
    <FONT size=3>  }" d. @/ L$ ~/ c; u
      else
    " K" f. m5 |# O  {/ Z8 ?3 i: I! C! D4 n' m1 Z" A! q
        while(--i&gt;1) p=p-&gt;next;+ h3 Z" @; z) z- J! V% L# B
        q-&gt;next=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>插入在第</FONT>i<FONT face=宋体>个元素的位置</FONT></FONT>
    ; }7 p0 @: y/ f- R, A; {( H- A1 V<FONT size=3>  }. q- @" f0 z  z. q/ t) r, E8 c
    }//Insert <p></p></FONT></P><><FONT size=3>2.18 <p></p></FONT></P><><FONT size=3>Status Delete(LinkList &amp;L,int i)//<FONT face=宋体>在无头结点链表</FONT>L<FONT face=宋体>中删除第</FONT>i<FONT face=宋体>个元素</FONT></FONT>) ~9 A8 h7 ?+ R( M- i5 E4 e% _
    <FONT size=3>{
    0 i: G0 K( @. ]' d% V, y. W# h7 s  if(i==1) L=L-&gt;next; //</FONT><FONT face=宋体 size=3>删除第一个元素</FONT>
    . S4 a& N5 l- w& C1 w$ e  L" X: ?<FONT size=3>  else
    % Q# C  i7 j. i! p  {
    - |- g3 y1 Q1 |+ R; J: p2 |- }# X    p=L;
    ! C0 }0 e* R" Q7 h7 o3 f/ l( B    while(--i&gt;1) p=p-&gt;next;0 i0 \/ M1 h- o) m2 e+ \2 @9 T" I
        p-&gt;next=p-&gt;next-&gt;next; //</FONT><FONT size=3><FONT face=宋体>删除第</FONT>i<FONT face=宋体>个元素</FONT></FONT>6 E% j4 ~4 ^' Q$ Q' l9 g; ^0 L
    <FONT size=3>  }+ k/ j, H  ~) y, s) V
    }//Delete <p></p></FONT></P><><FONT size=3>2.19 <p></p></FONT></P><><FONT size=3>Status Delete_Between(Linklist &amp;L,int mink,int maxk)//<FONT face=宋体>删除元素递增排列的链表</FONT>L<FONT face=宋体>中值大于</FONT>mink<FONT face=宋体>且小于</FONT>maxk<FONT face=宋体>的所有元素</FONT></FONT>1 o8 v' m4 E) C+ u; ?9 t, I
    <FONT size=3>{
    ! M4 P2 _2 k; o& T1 Y) {% H* t  p=L;
    . r9 n. a8 E$ T. B0 z  while(p-&gt;next-&gt;data&lt;=mink) p=p-&gt;next; //p</FONT><FONT size=3><FONT face=宋体>是最后一个不大于</FONT>mink<FONT face=宋体>的元素</FONT></FONT>
    : M6 _, R/ E6 U<FONT size=3>  if(p-&gt;next)    //</FONT><FONT size=3><FONT face=宋体>如果还有比</FONT>mink<FONT face=宋体>更大的元素</FONT></FONT>' N" q, T  C" P! A4 M0 ?
    <FONT size=3>  {
    % O- o4 P3 g# G- n5 z& l  |1 h    q=p-&gt;next;# m( Q1 {6 a; l
        while(q-&gt;data&lt;maxk) q=q-&gt;next; //q</FONT><FONT size=3><FONT face=宋体>是第一个不小于</FONT>maxk<FONT face=宋体>的元素</FONT></FONT>: |& B+ D8 I1 h
    <FONT size=3>    p-&gt;next=q;
    ; e; P1 W, E7 h  }
    ( W4 q+ t# v- z* w5 D( z}//Delete_Between <p></p></FONT></P><><FONT size=3>2.20 <p></p></FONT></P><><FONT size=3>Status Delete_Equal(Linklist &amp;L)//<FONT face=宋体>删除元素递增排列的链表</FONT>L<FONT face=宋体>中所有值相同的元素</FONT></FONT>
    & i$ h: |' q' c/ A/ k; b<FONT size=3>{
    / w8 G+ ^  s8 {2 \  p=L-&gt;next;q=p-&gt;next; //p,q</FONT><FONT face=宋体 size=3>指向相邻两元素</FONT>
    , t: J* ]1 A6 {2 A; o8 D<FONT size=3>  while(p-&gt;next)
    % [1 g2 }  h2 S) @0 U  {
    ) i/ F% \. K' w4 n4 C    if(p-&gt;data!=q-&gt;data)' K) s9 J0 L0 U2 Z! C
        {( M$ {. \$ d" q, c4 d1 G7 ^/ q0 A% g
          p=p-&gt;next;q=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>当相邻两元素不相等时</FONT>,p,q<FONT face=宋体>都向后推一步</FONT></FONT>
    + _/ |- ^* q* E& r. ^/ P  c- [<FONT size=3>    }
    6 e. I" x' w" W8 n: V# @* B3 ?    else
    3 ^: ~, l" |# y0 P& A    {
    / J) v# O$ s9 I9 H6 ?  ]# e      while(q-&gt;data==p-&gt;data) 1 q4 Z! y3 X. @! H2 c8 U- m
       {0 {( m0 B7 @6 a
         free(q);- J* ]# G# D& e  R
         q=q-&gt;next;
    ' {" R! d  |0 `; f" Z' G! \   }
    1 ~- n/ ?( H: M6 C      p-&gt;next=q;p=q;q=p-&gt;next; //</FONT><FONT face=宋体 size=3>当相邻元素相等时删除多余元素</FONT>
    . m. @8 P9 K2 S" I<FONT size=3>    }//else+ m0 ?4 \) I$ k  W7 E6 m6 Z/ R
      }//while
    % |( F3 R& E, x9 Z7 J}//Delete_Equal <p></p></FONT></P><><FONT size=3>2.21 <p></p></FONT></P><><FONT size=3>void reverse(SqList &amp;A)//<FONT face=宋体>顺序表的就地逆置</FONT></FONT>
    + q2 U  W( E; q& O3 O" B<FONT size=3>{7 h4 Q# S7 y* T( v6 I* x
      for(i=1,j=A.length;i&lt;j;i++,j--)# G- ?  |0 x# h8 i0 A
        A.elem&lt;-&gt;A.elem[j];
    - K! N2 t: A: D}//reverse <p></p></FONT></P><><FONT size=3>2.22 <p></p></FONT></P><><FONT size=3>void LinkList_reverse(Linklist &amp;L)//<FONT face=宋体>链表的就地逆置</FONT>;<FONT face=宋体>为简化算法</FONT>,<FONT face=宋体>假设表长大于</FONT></FONT><FONT size=3>2
    9 O% w0 D3 n5 I{) x3 _# O, f7 H' N- b
      p=L-&gt;next;q=p-&gt;next;s=q-&gt;next;p-&gt;next=NULL;- e2 \: _% a" U* P8 v1 Q1 F) t
      while(s-&gt;next): @& b# [1 Z' u1 M
      {3 [) V- l6 ~8 g: s- O) B
        q-&gt;next=p;p=q;% G; G2 f! w+ O3 k+ k
        q=s;s=s-&gt;next; //<FONT face=宋体>把</FONT>L<FONT face=宋体>的元素逐个插入新表表头</FONT></FONT>
    9 l$ `" ?) a1 \1 t<FONT size=3>  }& D; M- h  o7 @2 Q5 B" P
      q-&gt;next=p;s-&gt;next=q;L-&gt;next=s;
    ' L% t1 O* i( P. t}//LinkList_reverse
    " @' F6 G' W# l6 N. @% F</FONT><FONT size=3><FONT face=宋体>分析</FONT>:<FONT face=宋体>本算法的思想是</FONT>,<FONT face=宋体>逐个地把</FONT>L<FONT face=宋体>的当前元素</FONT>q<FONT face=宋体>插入新的链表头部</FONT>,p<FONT face=宋体>为新表表头</FONT>. <p></p></FONT></P><><FONT size=3>2.23 <p></p></FONT></P><><FONT size=3>void merge1(LinkList &amp;A,LinkList &amp;B,LinkList &amp;C)//<FONT face=宋体>把链表</FONT>A<FONT face=宋体>和</FONT>B<FONT face=宋体>合并为</FONT>C,A<FONT face=宋体>和</FONT>B<FONT face=宋体>的元素间隔排列</FONT>,<FONT face=宋体>且使用原存储空间</FONT></FONT>% u( J* d1 }9 |" e) I+ r
    <FONT size=3>{4 v9 f7 U1 }1 \* P, f9 {1 h/ Y" L
      p=A-&gt;next;q=B-&gt;next;C=A;' _" \1 T1 @7 T- u# j2 i3 }
      while(p&amp;&amp;q)
    + w! P( f  X8 I: y: A/ V4 A  {) ]) P: j/ y# x& A* e
        s=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>B<FONT face=宋体>的元素插入</FONT></FONT>' ]: d# ^4 t( L9 M
    <FONT size=3>    if(s)
    " j; f1 E: O+ @& y    {; K5 B" N+ R0 j# i9 r3 @# x
          t=q-&gt;next;q-&gt;next=s; //</FONT><FONT size=3><FONT face=宋体>如</FONT>A<FONT face=宋体>非空</FONT>,<FONT face=宋体>将</FONT>A<FONT face=宋体>的元素插入</FONT></FONT>1 U, A9 h; B: [* n* A! l
    <FONT size=3>    }
    7 Q) u0 ~4 \! o& j, M    p=s;q=t;
    - m/ P: v3 [# l. f  }//while
    ' q% o( O# c. H2 e% [% `) g}//merge1 <p></p></FONT></P><><FONT size=3>2.24 <p></p></FONT></P><P><FONT size=3>void reverse_merge(LinkList &amp;A,LinkList &amp;B,LinkList &amp;C)//<FONT face=宋体>把元素递增排列的链表</FONT>A<FONT face=宋体>和</FONT>B<FONT face=宋体>合并为</FONT>C,<FONT face=宋体>且</FONT>C<FONT face=宋体>中元素递减排列</FONT>,<FONT face=宋体>使用原空间</FONT></FONT>
    5 j$ h- e0 A; r' [; H<FONT size=3>{
    " a- n0 I' c9 y& d( w/ w  K9 q) U$ l  pa=A-&gt;next;pb=B-&gt;next;pre=NULL; //pa</FONT><FONT size=3><FONT face=宋体>和</FONT>pb<FONT face=宋体>分别指向</FONT>A,B<FONT face=宋体>的当前元素</FONT></FONT>5 m' @5 F2 k1 o! i. n
    <FONT size=3>  while(pa||pb)  ^0 @- @: A. U" g1 R
      {
    , e9 C7 m- O. J: X    if(pa-&gt;data&lt;pb-&gt;data||!pb)
    # ?+ H$ u1 {+ U& C* R1 w. j8 W- H    {4 ^# U4 W$ o/ T. w: C5 Z  C
          pc=pa;q=pa-&gt;next;pa-&gt;next=pre;pa=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>A<FONT face=宋体>的元素插入新表</FONT></FONT># T, K$ \! k) y! B6 g
    <FONT size=3>    }2 y! a1 ?; f6 C7 k5 |5 i
        else' Y7 g4 u& M; A5 f0 ?6 ~7 p$ Y
        {0 O0 j7 j, n6 g7 F1 D5 t
          pc=pb;q=pb-&gt;next;pb-&gt;next=pre;pb=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>B<FONT face=宋体>的元素插入新表</FONT></FONT>
    + J) `$ J" l2 f  h; k  R" |- f5 R<FONT size=3>    }
    # Q/ [4 r% S, P- D    pre=pc;% G- @0 }6 ~8 a. f) t' g( [$ R! ]0 w
      }+ I8 n7 U5 l8 D/ g
      C=A;A-&gt;next=pc; //</FONT><FONT face=宋体 size=3>构造新表头</FONT>4 F4 f, h9 Y$ ?7 R! R7 x
    <FONT size=3>}//reverse_merge/ r; w( C. f! S. P
    </FONT><FONT size=3><FONT face=宋体>分析</FONT>:<FONT face=宋体>本算法的思想是</FONT>,<FONT face=宋体>按从小到大的顺序依次把</FONT>A<FONT face=宋体>和</FONT>B<FONT face=宋体>的元素插入新表的头部</FONT>pc<FONT face=宋体>处</FONT>,<FONT face=宋体>最后处理</FONT>A<FONT face=宋体>或</FONT>B<FONT face=宋体>的剩余元素</FONT>. <p></p></FONT></P><P><FONT size=3>2.25 <p></p></FONT></P><P><FONT size=3>void SqList_Intersect(SqList A,SqList B,SqList &amp;C)//<FONT face=宋体>求元素递增排列的线性表</FONT>A<FONT face=宋体>和</FONT>B<FONT face=宋体>的元素的交集并存入</FONT>C<FONT face=宋体>中</FONT></FONT>; m3 L- t, O, ]  d# n2 Q
    <FONT size=3>{7 [$ n7 v& }& R* A- [. Y1 G
      i=1;j=1;k=0;
    5 T6 ^* O9 @# X# l' Q$ }" b1 q+ u4 m  while(A.elem&amp;&amp;B.elem[j])
    8 F7 h: A  e, ~! V! f. p  {3 w  L4 _7 r9 {- _
        if(A.elem&lt;B.elem[j]) i++;% D$ G1 j3 y! I: `
        if(A.elem&gt;B.elem[j]) j++;; g5 e/ C! U) K: [
        if(A.elem==B.elem[j])
    : @$ G5 c& z8 J9 \    {9 e# i1 V; d2 b3 [2 o$ }- i
          C.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT><FONT size=3>,4 ?9 R+ j9 Q  m& Q2 F) ?
          i++;j++; //<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>" I) Z. Y& f+ u+ V6 ^5 u; T1 d1 |9 H7 f
    <FONT size=3>    }! p% z: H8 ]$ l! L- ]2 d
      }//while
    5 H1 b2 i% x4 J}//SqList_Intersect <p></p></FONT></P><P><FONT size=3>2.26 <p></p></FONT></P><P><FONT size=3>void LinkList_Intersect(LinkList A,LinkList B,LinkList &amp;C)//<FONT face=宋体>在链表结构上重做上题</FONT></FONT>
    4 Q9 _0 v2 B/ d: e" U( Y% R; e% n<FONT size=3>{) X% S' x' }- G. ?1 W
      p=A-&gt;next;q=B-&gt;next;
    # d0 \0 L! x" d" w- a  pc=(LNode*)malloc(sizeof(LNode));! x0 z* O4 }8 _0 g* w2 P
      while(p&amp;&amp;q)
    8 i: x8 o! {& [7 A( s- l4 r  {
    3 n! x- u& V1 T8 Q( I3 C+ g- B4 y    if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;
    * X6 T2 j, ?1 V) W* y2 Z6 Q    else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;
    . y( J. @$ w7 g) O    else
    , J, \- N- c- M    {. `( i! n. [+ F; {6 _6 b
          s=(LNode*)malloc(sizeof(LNode));
    ; k4 m7 v: \8 s9 ~* N( O7 h      s-&gt;data=p-&gt;data;
    $ {' h; L+ `2 A5 [      pc-&gt;next=s;pc=s;
    ! Y% q; G5 c* b# W      p=p-&gt;next;q=q-&gt;next;
    ' ]' n+ J4 V' }- R* _$ g4 V* K    }
    ; q$ Q) d% S/ B  }//while
    ! e) {. l" L5 @  C=pc;
    " j+ S; @: t, A: n6 \; D- Y, H}//LinkList_Intersect <p></p></FONT></P><P><FONT size=3>2.27 <p></p></FONT></P><P><FONT size=3>void SqList_Intersect_True(SqList &amp;A,SqList B)//<FONT face=宋体>求元素递增排列的线性表</FONT>A<FONT face=宋体>和</FONT>B<FONT face=宋体>的元素的交集并存回</FONT>A<FONT face=宋体>中</FONT></FONT>  q2 k  ^; {8 V6 T% q
    <FONT size=3>{$ Y1 B4 e* F" b
      i=1;j=1;k=0;5 N' R; P+ X  d/ M* [3 m/ E& d$ o- y
      while(A.elem&amp;&amp;B.elem[j])
    " _$ P% P1 }: ^( U( y# [  {* y! x! H9 z- r3 |5 s! H  ]
        if(A.elem&lt;B.elem[j]) i++;/ m9 \% M) v9 A( Y: S( Q8 N0 P
        else if(A.elem&gt;B.elem[j]) j++;: b2 p* u) l2 k" L" W6 W
        else if(A.elem!=A.elem[k])
    & I, A* d7 m2 Y) L# P    {
    & ~2 P) G0 w2 ]2 z6 S: ~% q      A.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT>
      a! E0 I/ z4 f7 T9 p0 ]<FONT size=3>      i++;j++; //</FONT><FONT size=3><FONT face=宋体>且</FONT>C<FONT face=宋体>中没有</FONT>,<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>
    # C3 M4 ~  S4 l3 B4 i8 |8 g6 \3 @  L9 P<FONT size=3>    }
    + o7 a; w6 c2 P6 X  }//while
    / ~/ q" n2 ?' r0 y3 Q  while(A.elem[k]) A.elem[k++]=0;
    0 m8 W# ^6 n6 }}//SqList_Intersect_True <p></p></FONT></P><P><FONT size=3>2.28 <p></p></FONT></P><P><FONT size=3>void LinkList_Intersect_True(LinkList &amp;A,LinkList B)//<FONT face=宋体>在链表结构上重做上题</FONT></FONT>! i& U8 r+ _/ ^4 r5 n! o/ H
    <FONT size=3>{7 p2 c0 H2 Y( z! k1 b- N- k$ {0 M
      p=A-&gt;next;q=B-&gt;next;pc=A;
    & u) b/ _% f. B# b0 N* l  while(p&amp;&amp;q)
    2 H$ u4 `5 Q% S! U1 C, \( R$ _. _  {: q9 O9 [* g1 m
        if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;
    , l0 e( ]0 K9 {! d" D+ {2 y0 _    else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;2 w* }" l' b6 ]) ]8 X
        else if(p-&gt;data!=pc-&gt;data)# {  u2 e: x9 Y+ Z# z
        {
    $ P. `+ G9 Y5 u% Z% M      pc=pc-&gt;next;" o# ~" ~/ y( |
          pc-&gt;data=p-&gt;data;3 u2 E) f3 `( S
          p=p-&gt;next;q=q-&gt;next;
    5 ]5 h$ B* {; Y/ m* {" W+ p    }
    1 q9 H- F1 S! R7 |5 _3 y$ Y  }//while
    4 F0 g! a5 A1 Z% p1 o}//LinkList_Intersect_True <p></p></FONT></P><P><FONT size=3>2.29 <p></p></FONT></P><P><FONT size=3>void SqList_Intersect_Delete(SqList &amp;A,SqList B,SqList C)
    . t8 H7 j; S+ m8 b{
    ; }0 |3 R6 o. {  {# X  i=0;j=0;k=0;m=0;    //i<FONT face=宋体>指示</FONT>A<FONT face=宋体>中元素原来的位置</FONT>,m<FONT face=宋体>为移动后的位置</FONT></FONT>$ g7 Z- |3 x) |9 L
    <FONT size=3>  while(i&lt;A.length&amp;&amp;j&lt;B.length&amp;&amp; k&lt;C.length) 0 Y* ?1 e( i7 \* Y/ B
      {7 D0 x6 _, {: j) C& J
        if(B.elem[j]&lt;C.elem[k]) j++;8 ?2 L9 W3 f! L" T
        else if(B.elem[j]&gt;C.elem[k]) k++;1 s6 G- T7 g# G( d8 ?
        else( N: d* K# A" x+ Q; m" R' |, |8 f
        {
    4 P) Q8 P7 E9 p: i      same=B.elem[j];                   //</FONT><FONT face=宋体 size=3>找到了相同元素</FONT><FONT size=3>same
    + r6 @7 r! G# \" ^+ h      while(B.elem[j]==same) j++;6 Z! b& ]0 ~' ?- J
          while(C.elem[k]==same) k++;     //j,k<FONT face=宋体>后移到新的元素</FONT></FONT>
    ! u8 ?  I, D3 b& v<FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem&lt;same)
      ~8 f+ ^) @9 Y3 I0 T        A.elem[m++]=A.elem[i++];            //</FONT><FONT face=宋体 size=3>需保留的元素移动到新位置</FONT>1 e0 C4 t& x$ r. r
    <FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem==same) i++;       //</FONT><FONT face=宋体 size=3>跳过相同的元素</FONT>
    8 S2 P* O6 w4 w  @( Z, Q; B' h<FONT size=3>    }
    ' q7 d8 [: f! {' c3 v  ~  }//while
    ; g1 _' s  |; K& w  while(i&lt;A.length)
    % j; r4 Z- s/ M1 T    A.elem[m++]=A.elem[i++];      //A</FONT><FONT face=宋体 size=3>的剩余元素重新存储。</FONT>5 X( S; D0 p: f7 w
    <FONT size=3>  A.length=m; ' N  A( `) l, ]2 r. ]: c9 K
    }// SqList_Intersect_Delete
    / }" v4 ~9 g$ m" r8 G* z</FONT><FONT size=3><FONT face=宋体>分析</FONT>:<FONT face=宋体>先从</FONT>B<FONT face=宋体>和</FONT>C<FONT face=宋体>中找出共有元素</FONT>,<FONT face=宋体>记为</FONT>same,<FONT face=宋体>再在</FONT>A<FONT face=宋体>中从当前位置开始</FONT>, <FONT face=宋体>凡小于</FONT>same<FONT face=宋体>的</FONT></FONT>
    - y. R3 u: N  s! o2 _3 j% c<FONT size=3><FONT face=宋体>元素均保留</FONT>(<FONT face=宋体>存到新的位置</FONT>),<FONT face=宋体>等于</FONT>same<FONT face=宋体>的就跳过</FONT>,<FONT face=宋体>到大于</FONT>same<FONT face=宋体>时就再找下一个</FONT>same. <p></p></FONT></P><P><FONT size=3>2.30 <p></p></FONT></P><P><FONT size=3>void LinkList_Intersect_Delete(LinkList &amp;A,LinkList B,LinkList C)//<FONT face=宋体>在链表结构上重做上题</FONT></FONT>
    7 q3 G9 l  g4 Q7 V* W/ n+ Q! h<FONT size=3>{* ]+ o( o. |0 ]8 K7 y0 ~
      p=B-&gt;next;q=C-&gt;next;r=A-next;: R% a( `6 k% W
      while(p&amp;&amp;q&amp;&amp;r)& s2 h& [1 u( ~. v
      {0 T0 j8 F$ ?# M: D, G8 [
        if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;
    ; Q4 [, d9 S' h) L    else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;; t+ g+ i3 E# o
        else; k2 o6 ^5 e" C8 ?  F$ y2 |3 Z
        {* C+ h& b- X& O. ^' ?
          u=p-&gt;data; //</FONT><FONT face=宋体 size=3>确定待删除元素</FONT><FONT size=3>u2 v- B' G2 j% \; w3 [8 Z( w8 t
          while(r-&gt;next-&gt;data&lt;u) r=r-&gt;next; //<FONT face=宋体>确定最后一个小于</FONT>u<FONT face=宋体>的元素指针</FONT></FONT><FONT size=3>r
    , t6 j7 J# \' `      if(r-&gt;next-&gt;data==u)
    2 f( Z8 ~- n0 Z4 d" [: f      {+ t$ B7 g( v5 O( ^
            s=r-&gt;next;
    & ^1 G$ _4 z7 R( ]% S6 X        while(s-&gt;data==u)
    . [2 b$ ?! u1 V1 U, f        {1 n$ ?( y$ {& ^1 K+ s! k" g
              t=s;s=s-&gt;next;free(t); //<FONT face=宋体>确定第一个大于</FONT>u<FONT face=宋体>的元素指针</FONT></FONT><FONT size=3>s
    + S  w" d: I- j3 ]) J5 {# q+ U6 D2 T        }//while1 l+ ], x: v. w" S$ d) h( m
            r-&gt;next=s; //<FONT face=宋体>删除</FONT>r<FONT face=宋体>和</FONT>s<FONT face=宋体>之间的元素</FONT></FONT>
    . T' M: B. U2 A( T9 {6 \: T<FONT size=3>      }//if
    7 Z/ k4 i4 _+ s$ S" Q) N      while(p-&gt;data=u) p=p-&gt;next;7 J) B( E. B% v" }3 M# L8 ?
          while(q-&gt;data=u) q=q-&gt;next;1 \4 [; E7 ^) s6 q5 N5 e! B. C
        }//else( E) R9 ?1 y% y! l# }
      }//while
    " E2 ?' C4 p( B& [( S) E: z  G}//LinkList_Intersect_Delete <p></p></FONT></P><P><FONT size=3>2.31 <p></p></FONT></P><P><FONT size=3>Status Delete_Pre(CiLNode *s)//<FONT face=宋体>删除单循环链表中结点</FONT>s<FONT face=宋体>的直接前驱</FONT></FONT>9 d2 b; ^2 w1 n& ]  F
    <FONT size=3>{# a8 h( y1 x6 j0 i+ c5 @
      p=s;
    + T$ e' b% E' S  while(p-&gt;next-&gt;next!=s) p=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>找到</FONT>s<FONT face=宋体>的前驱的前驱</FONT></FONT><FONT size=3>p
    ' S8 s& p- ]9 D4 r! U5 W0 `3 Z7 d  p-&gt;next=s;( b3 P: O& O- V  c( q) |
      return OK;* P& z' k. w& [1 L/ P5 ^6 B
    }//Delete_Pre <p></p></FONT></P><P><FONT size=3>2.32 <p></p></FONT></P><P><FONT size=3>Status DuLNode_Pre(DuLinkList &amp;L)//<FONT face=宋体>完成双向循环链表结点的</FONT>pre<FONT face=宋体>域</FONT></FONT>
    & l! k$ x( W! f% t4 T<FONT size=3>{( t9 Q* n3 ~  u9 o
      for(p=L;!p-&gt;next-&gt;pre;p=p-&gt;next) p-&gt;next-&gt;pre=p;
    8 b! g; f- h5 N& \  return OK;
    6 P1 h2 v* y. ^5 r6 i( k0 h) h}//DuLNode_Pre <p></p></FONT></P><P><FONT size=3>2.33 <p></p></FONT></P><P><FONT size=3>Status LinkList_Divide(LinkList &amp;L,CiList &amp;A,CiList &amp;B,CiList &amp;C)//<FONT face=宋体>把单链表</FONT>L<FONT face=宋体>的元素按类型分为三个循环链表</FONT>.CiList<FONT face=宋体>为带头结点的单循环链表类型</FONT></FONT><FONT size=3>.* T; k. a$ s0 Q  B# W% e2 \5 @. \
    {
    9 q( u( B" G  U: D0 {; f  s=L-&gt;next;
    # [4 D; o0 O' u; U& A  A=(CiList*)malloc(sizeof(CiLNode));p=A;
    , S6 `4 m) `! G" ]; `2 I7 ]  B=(CiList*)malloc(sizeof(CiLNode));q=B;
    5 T0 a4 [9 m; E8 M+ I2 k4 m( {  C=(CiList*)malloc(sizeof(CiLNode));r=C; //<FONT face=宋体>建立头结点</FONT></FONT>
    ' a3 \# m9 @. r9 i+ x/ U! @" v<FONT size=3>  while(s)2 ^3 q& l* H* a4 o$ E: d
      {* A  [% ~% `# p: _+ y* x$ s
        if(isalphabet(s-&gt;data))
    7 `5 U, r8 d1 A% Z% R    {
    9 G( b0 F! M, V5 M5 G' k' Z      p-&gt;next=s;p=s;
    8 A7 M3 d+ b+ B8 p0 S    }
    " H! Y% |" }! r4 f2 ~4 u6 D/ j    else if(isdigit(s-&gt;data))
    " D. r6 {# a$ g9 q  s    {
    3 }) R8 N) [1 U      q-&gt;next=s;q=s;+ D! r: y# F( a, U& l5 l
        }
    & N; U6 P0 b+ d) P3 H& v( f; D    else( P+ M  F# p- `9 N( K$ W2 y: N
        {
    $ p4 E5 ]# |# ]4 o  M      r-&gt;next=s;r=s;
    ! M) E! z, o3 i- K* c    }( B, q7 I* o% B' k, n6 p
      }//while
    6 S. W& \0 L/ D* B/ b( q; Q  p-&gt;next=A;q-&gt;next=B;r-&gt;next=C; //</FONT><FONT face=宋体 size=3>完成循环链表</FONT>5 ~4 \' ~' }8 V; n' v
    <FONT size=3>}//LinkList_Divide <p></p></FONT></P><P><FONT size=3>2.34 <p></p></FONT></P><P><FONT size=3>void Print_XorLinkedList(XorLinkedList L)//<FONT face=宋体>从左向右输出异或链表的元素值</FONT></FONT>
    - _( p$ Z$ @4 f<FONT size=3>{- O/ s# J  K+ L  W. o
      p=L.left;pre=NULL;. Y8 Y, B1 L& \) N2 V: i
      while(p)- C3 m8 g" C6 L: [9 K. Z
      {: q. L- D. |+ ]4 Y+ W' R
        printf("%d",p-&gt;data);% s% r* H+ e* f7 E
        q=XorP(p-&gt;LRPtr,pre);' {0 p& u% n* ~* K1 M: H/ S
        pre=p;p=q; //</FONT><FONT size=3><FONT face=宋体>任何一个结点的</FONT>LRPtr<FONT face=宋体>域值与其左结点指针进行异或运算即得到其右结点指针</FONT></FONT>% ?  G  z! n4 C7 k  h. e! y" n9 L
    <FONT size=3>  }& O- `  I0 [( W% R1 f8 o; r5 v* J2 n
    }//Print_XorLinkedList <p></p></FONT></P><P><FONT size=3>2.35 <p></p></FONT></P><P><FONT size=3>Status Insert_XorLinkedList(XorLinkedList &amp;L,int x,int i)//<FONT face=宋体>在异或链表</FONT>L<FONT face=宋体>的第</FONT>i<FONT face=宋体>个元素前插入元素</FONT></FONT><FONT size=3>x
    ! f% _' c: l, d# U4 C! }3 H{* I- f) e* o; b+ b' j2 D
      p=L.left;pre=NULL;
    1 C9 q( P7 b) x: Y6 p+ }/ f' s  r=(XorNode*)malloc(sizeof(XorNode));
    " g' m' M- n3 j1 o& i  r-&gt;data=x;) S+ c) J6 P% f9 i
      if(i==1) //<FONT face=宋体>当插入点在最左边的情况</FONT></FONT>  D% {- n3 ]/ t, Z% h
    <FONT size=3>  {
    " M# I& [5 m# J. j    p-&gt;LRPtr=XorP(p.LRPtr,r);
    4 b, J* Y9 [1 k+ O. m' V    r-&gt;LRPtr=p;
    - Q8 _3 J( ^) J: }2 |. K+ ^    L.left=r;0 m4 S. R" X0 e( e" k" B
        return OK;
      @3 o% U/ U2 j  z6 {0 k0 L  }
      N  p3 t# P. i: b4 r  j=1;q=p-&gt;LRPtr; //</FONT><FONT face=宋体 size=3>当插入点在中间的情况</FONT>2 d3 Q5 ^) J" i$ I1 p
    <FONT size=3>  while(++j&lt;i&amp;&amp;q)
    # q2 o( _1 j0 m+ X. M; G  {+ a6 R( a/ W* p8 \5 d
        q=XorP(p-&gt;LRPtr,pre);
    , r! ^$ ]% o2 \' k" Y: l    pre=p;p=q;
    ) V- a% c1 c1 K& I# F, o( \! z8 u4 y  }//while //</FONT><FONT size=3><FONT face=宋体>在</FONT>p,q<FONT face=宋体>两结点之间插入</FONT></FONT>
    ! j/ |& z' s8 Z% `! K8 ^/ A! D<FONT size=3>  if(!q) return INFEASIBLE; //i</FONT><FONT face=宋体 size=3>不可以超过表长</FONT>) Y: l' p) F# V# F6 T5 w$ Y! j- A
    <FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);; x8 G& m/ _. s" y5 m9 o7 p/ G
      q-&gt;LRPtr=XorP(XorP(q-&gt;LRPtr,p),r);
    # L  S; M8 a: u9 R1 Q# f( L  r-&gt;LRPtr=XorP(p,q); //</FONT><FONT face=宋体 size=3>修改指针</FONT>9 `! Q" Y6 d  Z/ r# l  `
    <FONT size=3>  return OK;4 @6 b. W' w0 }+ o; z
    }//Insert_XorLinkedList <p></p></FONT></P><P><FONT size=3>2.36 <p></p></FONT></P><P><FONT size=3>Status Delete_XorLinkedList(XorlinkedList &amp;L,int i)//<FONT face=宋体>删除异或链表</FONT>L<FONT face=宋体>的第</FONT>i<FONT face=宋体>个元素</FONT></FONT>8 d2 `8 L# v/ Z! J
    <FONT size=3>{
    ! W8 r5 V9 n) h! A1 V4 ?& h  p=L.left;pre=NULL;/ R% p$ @$ X9 S  w$ Z4 P
      if(i==1) //</FONT><FONT face=宋体 size=3>删除最左结点的情况</FONT>
    * S: }) ^0 K: h, c, ?7 i<FONT size=3>  {
    1 A) c# H( l# ~  G    q=p-&gt;LRPtr;
    0 Z( Q# O9 F: T7 [! _# B. Q    q-&gt;LRPtr=XorP(q-&gt;LRPtr,p);
    ! C# @6 I' w: L( _4 H    L.left=q;free(p);
    5 C8 X0 z! z( u0 V3 \6 Y/ L+ X    return OK;
    / ]8 Z2 e3 X: G; J; m  }2 a7 S6 E7 J4 D5 ^2 m4 m4 K
      j=1;q=p-&gt;LRPtr;
    ; f% N" Z/ N5 T5 k9 H  while(++j&lt;i&amp;&amp;q)
    3 f' D: p& L+ C% H  {
    $ n1 v5 n' M6 I7 L' H    q=XorP(p-&gt;LRPtr,pre);; s% Y/ h' m; i0 c# @
        pre=p;p=q;6 X. X6 L% l2 z, a0 P4 q6 R
      }//while //</FONT><FONT face=宋体 size=3>找到待删结点</FONT><FONT size=3>q
    / ]! t3 \! N! D% c& M9 E  if(!q) return INFEASIBLE; //i<FONT face=宋体>不可以超过表长</FONT></FONT>
    , B8 |8 z# |* ~6 ^& X) v<FONT size=3>  if(L.right==q) //q</FONT><FONT face=宋体 size=3>为最右结点的情况</FONT>
    * @0 f6 [* \  _' @4 _+ W<FONT size=3>  {) e. o# D, |2 r. F: J- R
        p-&gt;LRPtr=XorP(p-&gt;LRPtr,q);1 ^( ^3 c7 P2 b$ R' P) k' |8 H% J
        L.right=p;free(q);
    ( {2 e% H/ M$ |& h" \  ^- ^* s8 H    return OK;5 p. h$ ~& q3 m; G9 N) w
      }
    ; e2 C+ x9 L& d- v, y8 l" d2 i  r=XorP(q-&gt;LRPtr,p); //q</FONT><FONT size=3><FONT face=宋体>为中间结点的情况</FONT>,<FONT face=宋体>此时</FONT>p,r<FONT face=宋体>分别为其左右结点</FONT></FONT>
    4 V, j9 m8 O& g6 z( }4 O$ w<FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);! r5 @  l, N+ G0 {3 J; K
      r-&gt;LRPtr=XorP(XorP(r-&gt;LRPtr,q),p); //</FONT><FONT face=宋体 size=3>修改指针</FONT>6 V3 T( K+ W) ?; d: ]
    <FONT size=3>  free(q);
    8 o0 }/ |  q( [  return OK;
    ; B8 p' F* p& z  U2 w8 ?}//Delete_XorLinkedList <p></p></FONT></P><P><FONT size=3>2.37 <p></p></FONT></P><P><FONT size=3>void OEReform(DuLinkedList &amp;L)//<FONT face=宋体>按</FONT>1,3,5,...4,2<FONT face=宋体>的顺序重排双向循环链表</FONT>L<FONT face=宋体>中的所有结点</FONT></FONT>- d/ |4 x, C, o% E
    <FONT size=3>{4 M+ k4 F: u! P: X+ f  S! W3 B9 f- g
      p=L.next;3 L, R0 Z. H3 m0 E2 Q' A, t
      while(p-&gt;next!=L&amp;&amp;p-&gt;next-&gt;next!=L)
    - e" b' }+ g; l/ ~  {5 a; t$ q' \  t2 K2 f' F
        p-&gt;next=p-&gt;next-&gt;next;/ S6 W: P9 W# U2 X& x- K. O& n
        p=p-&gt;next;
    9 F' s# n5 D& ?- _  o, @$ P& k  } //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个奇数结点</FONT></FONT>7 u% N+ t0 J) v9 U3 I# M. [% r
    <FONT size=3>  if(p-&gt;next==L) p-&gt;next=L-&gt;pre-&gt;pre;
    ( ]0 ?0 }, ~& A8 D6 Y  i. l  else p-&gt;next=l-&gt;pre;
    " g: z2 x9 z5 C% G" k: h  p=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个偶数结点</FONT></FONT>2 E; m) j+ F, I; R. t% ~# s
    <FONT size=3>  while(p-&gt;pre-&gt;pre!=L)
    9 _" `& x9 W7 Q+ X" A  {
    $ [. {  l# U/ K" X1 f) }" Z    p-&gt;next=p-&gt;pre-&gt;pre;  c7 N- e  ?8 L' U, v2 ]
        p=p-&gt;next;4 U3 }  J! L/ `' R* j
      }
    + {9 k$ P- C0 r0 r$ h5 n$ a. w  p-&gt;next=L; //</FONT><FONT size=3><FONT face=宋体>按题目要求调整了</FONT>next<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>此时</FONT>pre<FONT face=宋体>链仍为原状</FONT></FONT>9 J8 R. y3 b# i6 G' O$ Q  V9 E5 D
    <FONT size=3>  for(p=L;p-&gt;next!=L;p=p-&gt;next) p-&gt;next-&gt;pre=p;: j7 r; N& `1 Y& r" @3 U
      L-&gt;pre=p; //</FONT><FONT size=3><FONT face=宋体>调整</FONT>pre<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>同</FONT>2.32<FONT face=宋体>方法</FONT></FONT>
    1 R' j# v# A; A( K<FONT size=3>}//OEReform9 u( j  \- M9 J) I
    </FONT><FONT size=3><FONT face=宋体>分析</FONT>:next<FONT face=宋体>链和</FONT>pre<FONT face=宋体>链的调整只能分开进行</FONT>.<FONT face=宋体>如同时进行调整的话</FONT>,<FONT face=宋体>必须使用堆栈保存偶数结点的指针</FONT>,<FONT face=宋体>否则将会破坏链表结构</FONT>,<FONT face=宋体>造成结点丢失</FONT>. <p></p></FONT></P><P><FONT size=3>2.38 <p></p></FONT></P><P><FONT size=3>DuLNode * Locate_DuList(DuLinkedList &amp;L,int x)//<FONT face=宋体>带</FONT>freq<FONT face=宋体>域的双向循环链表上的查找</FONT></FONT>
    3 y: g7 b+ t6 X4 P9 X$ O5 H& d<FONT size=3>{' z; ?9 x, v& N6 t+ j3 U7 o' _
      p=L.next;
    5 Z! d" g* T9 q/ X# Q, [" D! _$ w  while(p.data!=x&amp;&amp;p!=L) p=p-&gt;next;
    9 I6 V4 c+ d3 d$ z$ X8 m  if(p==L) return NULL; //</FONT><FONT face=宋体 size=3>没找到</FONT>
    + Z: g/ k+ X' q9 J* `, `" g<FONT size=3>  p-&gt;freq++;q=p-&gt;pre;3 C, Q! C5 b$ \  I+ m- D6 o
      while(q-&gt;freq&lt;=p-&gt;freq) q=q-&gt;pre; //</FONT><FONT face=宋体 size=3>查找插入位置</FONT>
    0 k/ y$ r. Y' I  r( k8 }: G  l<FONT size=3>  if(q!=p-&gt;pre)- D4 _' O9 m4 I
      {1 @3 W4 D, V/ t9 y$ v$ {# d5 o* g
        p-&gt;pre-&gt;next=p-&gt;next;p-&gt;next-&gt;pre=p-&gt;pre;# y: x, v3 r+ \$ }" _  b0 @. X
        q-&gt;next-&gt;pre=p;p-&gt;next=q-&gt;next;$ S& f2 _$ P1 h/ ?$ g* c
        q-&gt;next=p;p-&gt;pre=q; //</FONT><FONT face=宋体 size=3>调整位置</FONT>
    ' s! K1 Y( ~3 t  L<FONT size=3>  }$ }2 {; k2 B- [, v3 n, Y
      return p;
    & N* b  C9 u1 G}//Locate_DuList <p></p></FONT></P><P><FONT size=3>2.39 <p></p></FONT></P><P><FONT size=3>float GetValue_SqPoly(SqPoly P,int x0)//<FONT face=宋体>求升幂顺序存储的稀疏多项式的值</FONT></FONT>
    2 V8 B0 I$ A* g: e" W& N5 \<FONT size=3>{
    " h  b$ k1 h% Q' E8 y! O  PolyTerm *q;5 y' b5 G# @  r
      xp=1;q=P.data;
    * O* N4 \& z) y) P2 L. l  sum=0;ex=0;) h! {6 Y7 c8 F; w/ g0 }/ ^
      while(q-&gt;coef)
    ! r* M3 o2 v- S" ~3 O  {) e" L/ Z9 U4 w
        while(ex&lt;q-&gt;exp) xp*=x0;" g) q9 j* L2 ~2 M9 R) M1 B/ e# k
        sum+=q-&gt;coef*xp;
    . O6 o6 E# e  g9 E6 J$ {    q++;
    " l  Y) `2 Q9 E/ t  }" ?- I/ b6 D; |$ _
      return sum;. U5 X2 o4 Y" m" r, K6 U4 e
    }//GetValue_SqPoly <p></p></FONT></P><P><FONT size=3>2.40 <p></p></FONT></P><P><FONT size=3>void Subtract_SqPoly(SqPoly P1,SqPoly P2,SqPoly &amp;P3)//<FONT face=宋体>求稀疏多项式</FONT>P1<FONT face=宋体>减</FONT>P2<FONT face=宋体>的差式</FONT></FONT><FONT size=3>P3
    9 K5 e) U* D( d% y{
    ) G, Q+ W2 P. V% V7 u* W- X! L/ N  PolyTerm *p,*q,*r;
    ' s7 G+ ^, j$ U0 O; D  |  l  Create_SqPoly(P3); //<FONT face=宋体>建立空多项式</FONT></FONT><FONT size=3>P3
    ) C3 `4 k( Y1 @+ {, R7 f# ~  p=P1.data;q=P2.data;r=P3.data;8 p9 \3 [0 `4 g! h' w
      while(p-&gt;coef&amp;&amp;q-&gt;coef)
    6 P1 J; L7 i: G, {  {
    9 t( d* I* s/ m( _' [- v3 H    if(p-&gt;exp&lt;q-&gt;exp)' v! Y. Q9 ~9 X3 @* ~) @) _
        {
    2 n, o# v6 S7 n* j( e      r-&gt;coef=p-&gt;coef;
    ! K) T% j' O& u6 a4 \% h8 I% m      r-&gt;exp=p-&gt;exp;
    0 Q8 F/ U( e$ R      p++;r++;
    ' [+ ]9 P1 i% e, I2 a    }
    + a1 h* ^, z9 R2 a0 P# \    else if(p-&gt;exp&lt;q-&gt;exp)
    , P1 R$ L  b7 Z5 V) z, x6 x- s    {* ]  @4 i  b7 k0 K1 u
          r-&gt;coef=-q-&gt;coef;+ w" |' J) M9 Y# p7 I, B
          r-&gt;exp=q-&gt;exp;
    : Z# b2 h8 w7 Y      q++;r++;* T2 R% c7 N0 M6 s, H
        }" l8 a8 @. z& X  W/ g2 f
        else: u, E0 K& P5 D" q
        {
    & P! G+ @2 x. ~3 s* z, I: {      if((p-&gt;coef-q-&gt;coef)!=0) //<FONT face=宋体>只有同次项相减不为零时才需要存入</FONT>P3<FONT face=宋体>中</FONT></FONT>
    + f/ L, i% U7 J2 j5 L# F<FONT size=3>      {# k) n% Y$ C9 ]/ L* f* l, n! l6 _
            r-&gt;coef=p-&gt;coef-q-&gt;coef;" {( a, u% o& I& J
            r-&gt;exp=p-&gt;exp;r++;
    / R: ?9 K/ X- P      }//if
    7 X- Z  Y. [- _. G      p++;q++;0 [  O4 p3 u4 h& f; m
        }//else2 I! [8 ^6 u$ c% s- n
      }//while
    ( j6 q8 a- p6 s  while(p-&gt;coef) //</FONT><FONT size=3><FONT face=宋体>处理</FONT>P1<FONT face=宋体>或</FONT>P2<FONT face=宋体>的剩余项</FONT></FONT>
    + p8 v. Y% K1 Y- M6 ^( e* ^3 D<FONT size=3>  {
      h7 M" U9 S# w: c    r-&gt;coef=p-&gt;coef;' B& I1 ?) ^3 x7 x2 R: }
        r-&gt;exp=p-&gt;exp;$ m6 e! z* S7 {& \3 g! n
        p++;r++;0 k6 \$ D- g% z
      }
    . R7 N8 w! `. X  while(q-&gt;coef)% Q! _/ o- S* ~
      {
    0 C9 _7 n( \4 ~. i# c    r-&gt;coef=-q-&gt;coef;0 r/ R. q  A% b% W$ D& B8 E
        r-&gt;exp=q-&gt;exp;
    + M: y& ^# x' u) {4 w    q++;r++;9 M1 N) t% \) v% i. h
      }0 W, O1 n+ e3 @' }/ l
    }//Subtract_SqPoly <p></p></FONT></P><P><FONT size=3>2.41 <p></p></FONT></P><P><FONT size=3>void QiuDao_LinkedPoly(LinkedPoly &amp;L)//<FONT face=宋体>对有头结点循环链表结构存储的稀疏多项式</FONT>L<FONT face=宋体>求导</FONT></FONT>9 @; k& E" J  n( K. w0 u
    <FONT size=3>{$ N2 a3 J2 v5 W" u5 ?3 ]
      p=L-&gt;next;* P! W% o5 L  X4 Y/ ?: d
      if(!p-&gt;data.exp)- C! m- c5 Q- \7 f. }
      {7 O4 ?/ J& Q7 H
        L-&gt;next=p-&gt;next;p=p-&gt;next; //</FONT><FONT face=宋体 size=3>跳过常数项</FONT>
    : d" b# ?! Z4 x6 q9 v<FONT size=3>  }; S# J% O- m" }4 O! |
      while(p!=L)% }$ k1 ^7 }' U- l7 ^8 R) `( G
      {  R+ y1 J) O( K. w4 f+ {
        p-&gt;data.coef*=p-&gt;data.exp--;//</FONT><FONT face=宋体 size=3>对每一项求导</FONT>0 a: Z, a/ p: y- K2 q0 X
    <FONT size=3>    p=p-&gt;next;& J6 L& N( {9 n7 f; }) t
      }
    " c5 y: P; ^, C2 D}//QiuDao_LinkedPoly <p></p></FONT></P><P><FONT size=3>2.42 <p></p></FONT></P><P><FONT size=3>void Divide_LinkedPoly(LinkedPoly &amp;L,&amp;A,&amp;B)//<FONT face=宋体>把循环链表存储的稀疏多项式</FONT>L<FONT face=宋体>拆成只含奇次项的</FONT>A<FONT face=宋体>和只含偶次项的</FONT></FONT><FONT size=3>B
    # H4 K8 b' p% p" H0 L{' s' _) a0 C, b  [" I
      p=L-&gt;next;+ X( n6 ^' `0 b8 z7 `. R( j
      A=(PolyNode*)malloc(sizeof(PolyNode));
    ; U% w/ K6 A& D( N0 H$ K  B=(PolyNode*)malloc(sizeof(PolyNode));
    2 J7 M4 @  k( A* Y! l' l' c3 ^( g  pa=A;pb=B;
    # T) }4 o+ a6 ~. ^7 s, c& A3 A  while(p!=L)
    , P* |+ Z" ]3 N+ R  {9 `# L/ B5 l  ?. k$ i6 W5 w
        if(p-&gt;data.exp!=2*(p-&gt;data.exp/2))
    . R* Y( f# ?1 _7 J    {8 d5 G4 e7 R: e5 r- d4 O& d2 v
          pa-&gt;next=p;pa=p;
    8 P3 }5 F" C: }2 E. f% _    }+ A6 p7 o3 ~$ m7 l0 s+ v; Q
        else1 W* h2 q/ }) _' `/ L: G. E7 g4 _
        {+ o6 o! }8 A3 m( [2 f# n  S9 k
          pb-&gt;next=p;pb=p;5 O6 _4 @" w( b3 z; I1 q" A
        }0 D' @  K' Z+ K( s# L- d- d
        p=p-&gt;next;% m+ ~8 h7 V9 d$ O: ~: r
      }//while
    ! w* E2 l5 e9 P" N' O  pa-&gt;next=A;pb-&gt;next=B;
    ! ~& g# z  M( w& k; m}//Divide_LinkedPoly<p></p></FONT></P>
    回复

    使用道具 举报

    布赖        

    4

    主题

    2

    听众

    134

    积分

    升级  17%

    该用户从未签到

    回复

    使用道具 举报

    铜豆子        

    0

    主题

    3

    听众

    22

    积分

    升级  17.89%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-3 13:16 , Processed in 0.467205 second(s), 69 queries .

    回顶部