QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4762|回复: 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>  z5 N1 j; M. @' F' t' u
    <><FONT size=3>1. <FONT face=宋体>本文是对严蔚敏《数据结构</FONT>(c<FONT face=宋体>语言版</FONT>)<FONT face=宋体>习题集》一书中所有算法设计题目的解决方案<p></p></FONT></FONT></P>
    * e) T6 |$ d% f9 }* I' L, ~( t1 J<><FONT size=3>2. <FONT face=宋体>本解答中的所有算法均采用类</FONT>c<FONT face=宋体>语言描述</FONT>,<FONT face=宋体>设计原则为面向交流、面向阅读</FONT>,<FONT face=宋体>作者不保证程序能够上机正常运行</FONT>(<FONT face=宋体>这种保证实际上也没有任何意义</FONT>);<p></p></FONT></P>5 T& ^; _- V$ S, T1 a  b8 r0 {
    <><FONT size=3>3. <FONT face=宋体>本解答原则上只给出源代码以及必要的注释</FONT>,<FONT face=宋体>对于一些难度较高或思路特殊的题目将给出简要的分析说明</FONT>,<FONT face=宋体>对于作者无法解决的题目将给出必要的讨论</FONT>.<FONT face=宋体>目前尚未解决的题目有</FONT>: 5.20, 10.40;<p></p></FONT></P>+ k- I$ H0 P0 [5 Y1 B0 Y8 W, r
    <><FONT size=3>4. <FONT face=宋体>请读者在自己已经解决了某个题目或进行了充分的思考之后</FONT>,<FONT face=宋体>再参考本解答</FONT>,<FONT face=宋体>以保证复习效果</FONT>;<p></p></FONT></P>
    1 |2 g2 `9 |& ~/ |; W<><FONT size=3>5. <FONT face=宋体>由于作者水平所限</FONT>,<FONT face=宋体>本解答中一定存在不少这样或者那样的错误和不足</FONT>,<FONT face=宋体>希望读者们在阅读中多动脑、勤思考</FONT>,<FONT face=宋体>争取发现和纠正这些错误</FONT>,<FONT face=宋体>写出更好的算法来</FONT>.<p></p></FONT></P>/ d7 }  u8 p% [% p7 P4 v# o1 N
    < ><FONT face=宋体>第一章</FONT> <FONT face=宋体>绪论</FONT> <p></p></P>
    ( F+ e7 r+ |2 V0 c$ x/ b- U<><FONT size=3>1.16 <p></p></FONT></P>
    . D  e5 c1 g7 k5 d* y<><FONT size=3>void print_descending(int x,int y,int z)//<FONT face=宋体>按从大到小顺序输出三个数</FONT></FONT>& ?) t1 o' e! ?& r2 F, P
    <FONT size=3>{
      Z7 D5 f  ~2 n7 r/ u6 n  scanf("%d,%d,%d",&amp;x,&amp;y,&amp;z);
    9 Z& [. m$ H/ ?) z0 q6 R  if(x&lt;y) x&lt;-&gt;y; //&lt;-&gt;</FONT><FONT size=3><FONT face=宋体>为表示交换的双目运算符</FONT>,<FONT face=宋体>以下同</FONT></FONT>% i( h$ M2 P" h8 ]% B
    <FONT size=3>  if(y&lt;z) y&lt;-&gt;z;
    1 r, T7 _& @% W+ k# P7 {7 B4 d  if(x&lt;y) x&lt;-&gt;y; //</FONT><FONT face=宋体 size=3>冒泡排序</FONT># a) K3 f1 e; ?. s" f
    <FONT size=3>  printf("%d %d %d",x,y,z);
    5 g4 H! w! [" U6 y6 o}//print_descending <p></p></FONT></P>8 H! a7 z/ I/ _3 l! m
    <><FONT size=3>1.17 <p></p></FONT></P>
    $ D: ]" E% ~% `* h# x: M# E8 p<><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  [+ L; ~; `7 L4 _5 L: t
    {+ Q# C: k' R, m1 ~$ B2 k9 @
      int tempd;+ q3 ^2 I) G1 _" z4 g
      if(k&lt;2||m&lt;0) return ERROR;" I9 T4 h, W1 S4 v4 J- y2 z! @
      if(m&lt;k-1) f=0;6 L5 y7 Z8 f9 @: Y! o. w
      else if (m==k-1) f=1;
    1 N- ]; D5 U, N  else
    / S$ Y7 x" `8 v/ X+ d  {8 i1 e9 i4 W& w# h
        for(i=0;i&lt;=k-2;i++) temp=0;
    3 x& [9 ^. ?. \3 M" n2 ?  D" X    temp[k-1]=1; //<FONT face=宋体>初始化</FONT></FONT>
    5 r9 y3 j, p7 @: d( }% Q; Q<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>/ F+ ^$ ?0 h$ @1 E
    <FONT size=3>    {, K. L9 }3 X9 ]. ]4 R( l- n
          sum=0;
      c7 }* X% J% _, W+ F2 a      for(j=i-k;j&lt;i;j++) sum+=temp[j];
    3 u' ~& s, R0 ~: P6 W5 g4 l      temp=sum;
    6 d' Y$ u" [+ S1 i$ M% ?& ?  I    }
    4 j$ N. E+ Z/ p; F) r3 r    f=temp[m];
    6 A: R) R! }4 J8 j# d- s  }- }; u: w" h/ x+ V( x  D" Z
      return OK;+ U* p* j* P" P, L
    }//fib
    ' z+ f! s7 j7 U2 @, h</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>
    0 Q0 R0 b! ^: D. Z: S) C<><FONT size=3>1.18 <p></p></FONT></P>; A. Y* ~' E) Z2 l1 ]
    <><FONT size=3>typedef struct{3 R7 U$ H" A6 N4 b7 C& E; s
                        char *sport;0 s1 m/ ^' V0 [# e8 f
                        enum{male,female} gender;0 J  }: p* n  s& s
                        char schoolname; //<FONT face=宋体>校名为</FONT>'A','B','C','D'<FONT face=宋体>或</FONT></FONT><FONT size=3>'E'
    " u) S5 L  Z- a2 u# a                    char *result;
    4 D, A  e6 R& R) g. Z9 m% q                    int score;
    ' @- X' R( m0 k$ R' @7 a                  } resulttype; <p></p></FONT></P>8 P; w5 D9 |6 w3 @3 f$ `
    <><FONT size=3>typedef struct{7 s/ @. E; Y: O
                        int malescore;
    6 ?: F/ u) D: Z- s% [                    int femalescore;# g) \0 w) M$ {+ m! j2 b# F% p
                        int totalscore;
    4 T7 P. a0 P, ^% Z                  } scoretype; <p></p></FONT></P>' a8 w4 a  I3 D* B6 G
    <><FONT size=3>void summary(resulttype result[ ])//<FONT face=宋体>求各校的男女总分和团体总分</FONT>,<FONT face=宋体>假设结果已经储存在</FONT>result[ ]<FONT face=宋体>数组中</FONT></FONT>
    ) b& v; C! {9 x4 I<FONT size=3>{2 x! b6 l9 e9 G+ F! _- p
      scoretype score;4 G; t6 X# D0 q+ y' ~/ l3 l
      i=0;+ D" @* \% N! c4 H' i
      while(result.sport!=NULL)$ X" A4 B) b. g5 S* I
      {
    0 L2 t. B  R/ `    switch(result.schoolname)
    6 l$ C* `- N( x8 L% R    {
      ]5 U, [% ]) ~6 Q# j      case 'A':, V+ u" @, l' P2 q2 T$ j; s$ a
            score[ 0 ].totalscore+=result.score;
    3 w; d. v# ?& [. H: g4 B        if(result.gender==0) score[ 0 ].malescore+=result.score;: C0 e4 v* v0 c5 C+ R6 q9 u& r2 \
            else score[ 0 ].femalescore+=result.score;
    6 h; |  e, t" `5 j$ Y, p        break;
    5 h* r* b8 j. V3 P2 ^  {7 F      case 'B':
    ( G1 S: ^! l! G+ l/ Q6 F( f- B        score.totalscore+=result.score;+ o7 L( r: o( Y8 w" s: M
            if(result.gender==0) score.malescore+=result.score;. }8 {/ @& |$ U7 m7 j; s6 q
            else score.femalescore+=result.score;
      Y  L/ @2 c8 S0 [        break;
    / C; v2 C6 K% ]/ R+ K. t) c      </FONT><FONT size=3><FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT></FONT>
    % B3 y! s' V1 S2 F" G! J( }<FONT size=3>    }2 M) q4 ^9 m0 ?) C" }& v# O8 H
        i++</FONT><FONT face=宋体 size=3>;</FONT>% N. Q" Q* K3 z+ n) S1 T6 j# T! ?! c
    <FONT size=3>  }
    ; ^: n9 F6 k& \8 b# U& v  for(i=0;i&lt;5;i++)' o# C% B7 i- |0 U2 O1 c  @& e
      {
    " ]* _$ r  \0 Z2 C7 t# Y7 e    printf("School %d:\n",i);8 ^! |" Q, z6 }; N# {: \9 Q3 F
        printf("Total score of male:%d\n",score.malescore);9 g$ T* h. T) `; @; n
        printf("Total score of female:%d\n",score.femalescore);8 V9 |, ^5 t$ S+ z0 C1 G
        printf("Total score of all:%d\n\n",score.totalscore);
    6 d. Y3 p: \& k+ c/ H. w7 [& W" ]0 ?7 I  }. m1 }# v4 v  X* i/ [/ H  h
    }//summary <p></p></FONT></P>
    / W) ?% `2 U# [: m<><FONT size=3>1.19 <p></p></FONT></P>
    / u7 s+ b; {5 n. ~, l" H<><FONT size=3>Status algo119(int a[ARRSIZE])//<FONT face=宋体>求</FONT>i!*2^i<FONT face=宋体>序列的值且不超过</FONT></FONT><FONT size=3>maxint/ O/ u7 W6 K& n7 Y% {5 N
    {6 \6 P3 K% ]2 \; \/ {
      last=1;
    & T3 H1 E; `0 J5 a& l  for(i=1;i&lt;=ARRSIZE;i++)/ t: L9 Z& X3 g
      {+ A& b, V- }4 N+ W. R) S
      a[i-1]=last*2*i;0 w" ]- H' K- ~
       if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;, m; ~- `/ e& Q* T
       last=a[i-1];: M' W' L6 {# D1 K9 F' C
       return OK;7 I9 k; o* `8 U8 d0 O9 a5 v2 a
      }0 |* N5 V3 e* S* ?6 ?- B1 a
    }//algo119" r5 J; H  F+ L( C! W( m
    <FONT face=宋体>分析</FONT>:<FONT face=宋体>当某一项的结果超过了</FONT>maxint<FONT face=宋体>时</FONT>,<FONT face=宋体>它除以前面一项的商会发生异常</FONT>. <p></p></FONT></P>
    $ t2 x6 h; d1 G& T! l8 u<><FONT size=3>1.20 <p></p></FONT></P>1 t5 y3 Y* \: p0 _( P5 U/ s( ~1 A: Z
    <><FONT size=3>void polyvalue()
    - I1 ~' ~0 Y5 S3 {/ w{
    3 ]  f; Q+ W5 H+ i& y6 g  float ad;
    7 d5 g* z# w6 {0 I7 ^$ |; p5 ^  float *p=a;
    2 {0 u. q. t5 y) b* J  printf("Input number of terms:");9 ]* p) e7 n  O7 S3 D! U. q+ t: `2 h
      scanf("%d",&amp;n);  |7 T/ [; X, \& b! V1 M4 m. E
      printf("Input the %d coefficients from a0 to a%d:\n",n,n);$ d8 h8 o  s4 n
      for(i=0;i&lt;=n;i++) scanf("%f",p++);
    3 b% D  D  W9 j  printf("Input value of x:");, Q; t- m; w) l' l
      scanf("%f",&amp;x);. n9 P4 i2 e7 l% m9 v6 X7 f4 [
      p=a;xp=1;sum=0; //xp<FONT face=宋体>用于存放</FONT>x<FONT face=宋体>的</FONT>i<FONT face=宋体>次方</FONT></FONT>7 X7 o( X. ~+ o( l
    <FONT size=3>  for(i=0;i&lt;=n;i++)# {8 P1 P: V2 \+ W! h8 e6 E) d
      {
    ; v% v( x" y3 M* O$ n0 g* U    sum+=xp*(*p++);% V9 g7 |1 p; ]/ |* L; [
        xp*=x;4 W( @  g- R% d* R3 G0 [* Z
      }# U. z3 i, \+ p$ D$ v
      printf("Value is:%f",sum);: ]$ b% Q5 ?  q1 n2 j7 h, J
    }//polyvalue<p></p></FONT></P>1 L' @. _0 p5 Z7 E$ G# i
    < ><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>
    0 ]* Y& p0 }3 x" E2 k: g<FONT size=3>{; t5 [$ p5 T' Y
      if(i&lt;1||k&lt;0||i+k-1&gt;a.length) return INFEASIBLE;
    , C% a6 B  N' Y4 l  for(count=1;i+count-1&lt;=a.length-k;count++) //</FONT><FONT face=宋体 size=3>注意循环结束的条件</FONT>
    ( n' C: V  L% t+ |! j$ Y& W6 R$ \<FONT size=3>    a.elem[i+count-1]=a.elem[i+count+k-1];5 M  u( k" o- i' O8 u2 o8 n3 N
      a.length-=k;8 R6 p9 r0 y1 L- p) }
      return OK;
      j( b6 k5 J8 s! q  P7 {! ]}//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>
    ) W& r  M. H2 W8 a% A) X. s1 `<FONT size=3>{
    + H/ P1 U' Z9 G6 P" S  X8 ?* Q  if(va.length+1&gt;va.listsize) return ERROR;
    $ L. S* M: T4 c4 t% C% c* L" E( a  va.length++;; c6 Z% v0 X7 U7 z9 ]
      for(i=va.length-1;va.elem&gt;x&amp;&amp;i&gt;=0;i--)& P* p8 y7 \8 F7 Z% R7 J" |
        va.elem[i+1]=va.elem;' V( O' C& E# l' _" Z2 e5 R. P
      va.elem[i+1]=x;2 b, b2 Z8 Q% V; n2 Z( s
      return OK;
    ) d$ p: l: F4 X% }# p$ _) v) H) u}//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
    ( _" Q+ P; n- V( y9 u! B7 h{
    ! n! s$ g( }) v: [/ ?  for(i=1;A.elem||B.elem;i++), Y2 K5 S+ t* A, M% S  h
        if(A.elem!=B.elem) return A.elem-B.elem;
      d9 s: J: Y7 X0 P  return 0;' o2 ?9 y% a) V2 R
    }//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>! y" k5 T; J2 A6 t3 S
    <FONT size=3>{; c7 y% L0 W. v4 [
      for(p=l-&gt;next;p&amp;&amp;p-&gt;data!=x;p=p-&gt;next);/ |+ h, T2 L- Z- D$ n
      return p;: z/ b5 Z& i' l  [' D1 t4 Z
    }//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>5 [: I! J9 Q4 p  U+ Z# P
    <FONT size=3>{2 g/ Q; z$ h, _# a3 O
      for(k=0,p=L;p-&gt;next;p=p-&gt;next,k++);
    ' c" i. L7 }! s' ?" O  return k;
    + J% r. P0 X, C$ a1 C1 o: g& _}//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
    ; k# K+ _2 m& H5 Z5 V' e4 Z) K{
    1 }+ M; x: m* T& U  hc=ha;p=ha;
    * c. T' q( H0 l6 p2 [3 @% v  while(p-&gt;next) p=p-&gt;next;
    3 S$ s/ r# E4 M  p-&gt;next=hb;) q. A5 p4 J, S$ w( ^
    }//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>b3 P' G+ Q# z) P/ Y" c
    {
    4 Z" u* {/ S, [3 G% I1 `7 J  p=L;q=(LinkList*)malloc(sizeof(LNode));. I- V2 f. u  C4 c3 m; f# K5 L/ k: E
      q.data=b;
    # \% }8 w+ K0 Z/ {8 P6 ^0 R  if(i==1)
    ' w8 K" K! }8 ^7 a( R  {
    2 ^6 O  t( u! z    q.next=p;L=q; //<FONT face=宋体>插入在链表头部</FONT></FONT>" g; b* k% P# M8 i2 e$ g
    <FONT size=3>  }( w" q) J8 f& |% O% j/ |+ @+ x7 {
      else
    9 l7 f- o) {& k/ G, Q: @  {( F$ k0 L2 N& z& B- u- g2 |* @
        while(--i&gt;1) p=p-&gt;next;6 L6 _2 f( M7 `3 ^' U3 s6 G* y; `3 k
        q-&gt;next=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>插入在第</FONT>i<FONT face=宋体>个元素的位置</FONT></FONT>
    % j+ s. Z, S+ m, u, Z& \<FONT size=3>  }: e5 j" W. [1 m' u+ _
    }//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>1 u  I/ h8 Z: z& M1 J; _/ {! ]
    <FONT size=3>{7 ?7 t* D5 g! F, m5 x
      if(i==1) L=L-&gt;next; //</FONT><FONT face=宋体 size=3>删除第一个元素</FONT>. G3 V+ u* P5 Z6 L
    <FONT size=3>  else3 J" ]! U- P2 i7 O" v3 N2 |1 U
      {1 |& {9 i, P7 i: v- ^( K# x) @
        p=L;
    4 X0 ?( F9 f" M; c! c0 F0 ^    while(--i&gt;1) p=p-&gt;next;+ C" S0 M8 b2 y7 r7 |
        p-&gt;next=p-&gt;next-&gt;next; //</FONT><FONT size=3><FONT face=宋体>删除第</FONT>i<FONT face=宋体>个元素</FONT></FONT>9 j) P9 K( @- u
    <FONT size=3>  }/ Y8 v! _- s/ H- m5 D+ ^3 {
    }//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 z% x( D* o1 h+ C. E, h8 Z, i<FONT size=3>{! a+ ^' B/ [4 R  t5 {
      p=L;
    $ P- C/ J2 \& V. }( h  Q  V  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>
    % z4 h3 p7 ]4 `" z; B5 w<FONT size=3>  if(p-&gt;next)    //</FONT><FONT size=3><FONT face=宋体>如果还有比</FONT>mink<FONT face=宋体>更大的元素</FONT></FONT>
    . ~, Q# ?* ~. T% T<FONT size=3>  {
    , w8 U. o# }$ W$ B- Z    q=p-&gt;next;
    0 i2 C! u7 [$ g; j% O    while(q-&gt;data&lt;maxk) q=q-&gt;next; //q</FONT><FONT size=3><FONT face=宋体>是第一个不小于</FONT>maxk<FONT face=宋体>的元素</FONT></FONT>! W! P* a. c4 v+ ~5 Y
    <FONT size=3>    p-&gt;next=q;
    4 C. Y; v  c9 Z$ N/ B9 C7 C2 T' D, Q  }/ l( |5 u1 @2 d9 g' _" j5 t
    }//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>; _. w6 b' l, t/ L/ g8 w. T
    <FONT size=3>{
    ( ?5 U' V$ J& `" m" f  p=L-&gt;next;q=p-&gt;next; //p,q</FONT><FONT face=宋体 size=3>指向相邻两元素</FONT>
    $ r& }( n; V/ W4 E7 c<FONT size=3>  while(p-&gt;next)
    $ L2 g( X2 E# {. Z# V" n: `  {
    6 ~( Q6 ~- s3 m" k    if(p-&gt;data!=q-&gt;data)! j1 M) V- n: ?" U& d9 h' C
        {* E' y4 M) j8 t% ?
          p=p-&gt;next;q=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>当相邻两元素不相等时</FONT>,p,q<FONT face=宋体>都向后推一步</FONT></FONT>$ k( E' R$ T, m" L
    <FONT size=3>    }
      w; c7 j& h/ ^7 R9 l4 M    else) T: z5 Z1 S0 [0 d7 I+ P
        {8 P1 _% j0 [1 G- |8 r: K' h
          while(q-&gt;data==p-&gt;data) . [3 i" x  z5 k; ^
       {
    5 a6 p, w, t/ ~& w     free(q);
    : A2 m4 Y! u. G) q     q=q-&gt;next;
    ) y* |( |6 d' _# `: r# q   }
    . ?2 w) T" p8 }' E' y6 R      p-&gt;next=q;p=q;q=p-&gt;next; //</FONT><FONT face=宋体 size=3>当相邻元素相等时删除多余元素</FONT>) }! L. w2 O% f( N, _8 M; E
    <FONT size=3>    }//else
    * X! o. D: j8 h3 W4 q  }//while
    ! u% x5 P  i9 s$ b/ z) i: B1 c% h}//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>! N7 Q1 }1 u8 f9 C" M
    <FONT size=3>{
    / B8 i7 j  u2 f  for(i=1,j=A.length;i&lt;j;i++,j--)
    . ]% u# f& X2 C& Y; A    A.elem&lt;-&gt;A.elem[j];
    5 `9 z. C5 I: X) `; y/ C/ {2 M}//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
    7 H- r6 _, G8 k) \2 a8 p4 H{
    + c, U- n8 _$ e& [3 d  p=L-&gt;next;q=p-&gt;next;s=q-&gt;next;p-&gt;next=NULL;2 w+ O7 p9 ?+ ]* ?
      while(s-&gt;next)  ?+ C" b1 H3 r( D9 x
      {4 r* N& I* `- O4 V- ?
        q-&gt;next=p;p=q;; b8 F8 L" W" ^
        q=s;s=s-&gt;next; //<FONT face=宋体>把</FONT>L<FONT face=宋体>的元素逐个插入新表表头</FONT></FONT>
    4 t0 s- j2 {# Z, E0 z% \<FONT size=3>  }
    . ^2 s8 {! O7 M7 V8 v9 A  q-&gt;next=p;s-&gt;next=q;L-&gt;next=s;
    * P" q8 N! ^: R, L' i2 ~4 B" f4 v, t}//LinkList_reverse
    * G* A% p$ Z& I</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>( J- @4 j; _8 M. Q. q. o) T
    <FONT size=3>{. {$ w5 s. r& V! T. ]
      p=A-&gt;next;q=B-&gt;next;C=A;
    * S; Y& q- N! Y8 V3 c5 Z7 X$ T- s  while(p&amp;&amp;q)
    ! N- J2 E, b% h! l, b) |  {
    % l3 w3 k- F2 }+ u% m    s=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>B<FONT face=宋体>的元素插入</FONT></FONT>
    5 G9 y& g' N5 d' u3 O0 p<FONT size=3>    if(s)
    " w8 h9 _" w6 \% m. r    {
    ' }5 G, B( @# l& g      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>
    / {: e. k% i0 O" l6 v% n<FONT size=3>    }
    : _# {5 ?# ^# p  c    p=s;q=t;7 q6 J' @6 D: E
      }//while
    ! @* c8 K# W; H* x}//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>
    : {" `0 x; W& l9 Z5 f8 C. o<FONT size=3>{; I2 Z- p3 {' n
      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>* A1 Z+ Q9 X  U6 o
    <FONT size=3>  while(pa||pb)
    9 u7 K+ M2 V; s# z2 C) r' f/ s- _  {0 d7 f' H4 F3 D+ @. [9 ]
        if(pa-&gt;data&lt;pb-&gt;data||!pb)
    " B, a( D9 ]4 E  k) H) n; L: `, J    {
    $ C: ^3 ]+ a! S9 ]$ R. H- y/ b      pc=pa;q=pa-&gt;next;pa-&gt;next=pre;pa=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>A<FONT face=宋体>的元素插入新表</FONT></FONT>. m8 F6 v* p1 s8 _
    <FONT size=3>    }1 G, d* D3 n: p% A2 E* |) M
        else
    * H' v% [0 b# m0 M1 s    {
    ; E5 ^6 o* K9 r4 D4 E- `      pc=pb;q=pb-&gt;next;pb-&gt;next=pre;pb=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>B<FONT face=宋体>的元素插入新表</FONT></FONT>3 Q% A8 \% n/ ^4 y( _
    <FONT size=3>    }
    - }; k4 M# _# K3 s0 t( A    pre=pc;+ K, Z/ i. b' A+ {  t. E
      }% {1 H- k$ Y& v# H1 [* z7 y3 m8 L
      C=A;A-&gt;next=pc; //</FONT><FONT face=宋体 size=3>构造新表头</FONT>
    6 w$ s% r5 _/ }5 l2 Q. J<FONT size=3>}//reverse_merge6 e# @) X) h0 d8 Y5 `$ [. ^
    </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>
    0 x( {; |' i3 \( i1 [% V9 F<FONT size=3>{5 h4 S) |: ]1 _9 r7 S  [
      i=1;j=1;k=0;9 r( g, s8 o( X8 A
      while(A.elem&amp;&amp;B.elem[j])
    % c2 z' F4 `0 J$ V! N" d  {
    8 {8 F" r( A" P# [. y9 o. I+ j& R/ M    if(A.elem&lt;B.elem[j]) i++;
    8 z* O6 u3 j0 G: [+ i9 x% Q    if(A.elem&gt;B.elem[j]) j++;
    2 @( ~7 y6 P0 G! V2 j5 K0 q' z! A    if(A.elem==B.elem[j]). Y& Z. B: R9 L( T+ W6 w
        {1 S' H* C9 E% o' q. a0 P* Q* b
          C.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT><FONT size=3>,  I0 `, D+ \0 A2 f+ L2 z* C
          i++;j++; //<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>
    2 [  I/ D& t# Y* q<FONT size=3>    }
    , F( Y6 h- E" J. F% d  }//while
    " N/ N/ E# P$ t" O/ S}//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>
    / d1 g4 N  H- S4 n. d5 R  R* k; J9 W<FONT size=3>{* P. @& @) N7 _% i
      p=A-&gt;next;q=B-&gt;next;5 m% J4 m- T  c/ v  v8 H5 P7 J: ~
      pc=(LNode*)malloc(sizeof(LNode));1 Y" {9 w5 U2 z& w) i  b
      while(p&amp;&amp;q)
    : i* n# W1 a2 c2 m/ ~  {6 Y- Z/ V' h  P
        if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;9 S) Q5 J7 i, J+ a4 ~$ o0 _
        else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;
    2 ]  h+ m: I  j# `    else/ K6 D( h! X/ }
        {& B$ @# `1 m8 ?4 B
          s=(LNode*)malloc(sizeof(LNode));
    ( x# W$ {+ M* Z0 A' K$ q      s-&gt;data=p-&gt;data;
    : C& k  l% w4 c2 e7 y      pc-&gt;next=s;pc=s;
    $ }3 r3 f. c+ r" x4 v      p=p-&gt;next;q=q-&gt;next;* Z) h- O: j1 @; d0 J
        }
    7 D  _8 v+ J% B3 t5 g: G) a# r  }//while
    , l, ?* o2 W( Q  C=pc;
    7 U- z6 x& n, \; U2 P8 U6 r& ^  Z/ 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>, z' P2 C; K, h$ e
    <FONT size=3>{5 F) T% y: j2 x+ G, [$ d
      i=1;j=1;k=0;* H- Y6 ]- _/ ^9 `( t% ]0 Q
      while(A.elem&amp;&amp;B.elem[j])
    / o4 B2 F5 |9 F: T, B5 w: x/ C  {3 F$ g) Z% k6 @- @- v" i2 }* J+ X
        if(A.elem&lt;B.elem[j]) i++;8 z, d1 j- {. i, c$ k+ _: G
        else if(A.elem&gt;B.elem[j]) j++;  ^' {6 H7 F5 m+ [, j
        else if(A.elem!=A.elem[k])* D0 _. @) M. Z9 _
        {7 @1 X1 Q0 X& k  X/ h# l
          A.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT>7 u2 W' C1 e" @1 Y0 S
    <FONT size=3>      i++;j++; //</FONT><FONT size=3><FONT face=宋体>且</FONT>C<FONT face=宋体>中没有</FONT>,<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>5 |! f/ E* x3 H0 U" F7 c
    <FONT size=3>    }$ |; F2 |+ i- u% V" w+ ~* ^( o
      }//while
    7 C- c! Q: v1 Y$ `+ [6 O' |0 E  while(A.elem[k]) A.elem[k++]=0;
    7 |6 N$ B, p) K7 D- ]}//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>$ ~3 G5 h) X5 z
    <FONT size=3>{
    " S0 I; e) x  [+ F' H  p=A-&gt;next;q=B-&gt;next;pc=A;
    6 X* f+ ~3 }6 J4 d  while(p&amp;&amp;q)$ C5 h- O. \) Z& V+ x. h8 |* D6 n
      {
    ; z' q5 w- E$ l% S/ `3 u    if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;
    - t: C/ q! h( Z+ i7 R    else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;3 Z6 K* S) H& F
        else if(p-&gt;data!=pc-&gt;data)  H+ X' K! h# c! h  X
        {5 S, }# U" q' f+ Z% A# B0 [9 g& z1 ^8 r
          pc=pc-&gt;next;/ ?/ l1 ?' Z4 c- b/ C1 G
          pc-&gt;data=p-&gt;data;
    ! }4 n# n2 v0 z& v( C0 V9 ~2 J# C+ O8 Y" O      p=p-&gt;next;q=q-&gt;next;/ P# V& M2 n9 T; T
        }
    % j" [/ A" x% I% G# p/ }  }//while
    % \+ W- l$ T3 y' ]4 I: i# q  T}//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)
    8 X8 k/ s( r0 p+ t! u/ s{
    3 o3 R+ A( Q4 N% `+ i  i=0;j=0;k=0;m=0;    //i<FONT face=宋体>指示</FONT>A<FONT face=宋体>中元素原来的位置</FONT>,m<FONT face=宋体>为移动后的位置</FONT></FONT>
    3 U7 E8 f& d9 c) J<FONT size=3>  while(i&lt;A.length&amp;&amp;j&lt;B.length&amp;&amp; k&lt;C.length) & s. q" u+ C. m8 I
      {$ X, B3 n, z7 l$ F
        if(B.elem[j]&lt;C.elem[k]) j++;1 P% L9 |6 b" [( b5 U9 ?# x
        else if(B.elem[j]&gt;C.elem[k]) k++;
    2 t1 s( B/ m& W% ~" i# l    else
    6 T! Y6 F  X) d4 c1 e+ f! i    {
    3 M: C/ I( @3 N" F      same=B.elem[j];                   //</FONT><FONT face=宋体 size=3>找到了相同元素</FONT><FONT size=3>same
    . Y8 j* ]* L# U1 T7 `      while(B.elem[j]==same) j++;- n- Z: b& |& P2 k' X/ R
          while(C.elem[k]==same) k++;     //j,k<FONT face=宋体>后移到新的元素</FONT></FONT>& T" a- p+ ~3 n( S
    <FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem&lt;same) 0 t/ p1 H% G& M( j% g4 r
            A.elem[m++]=A.elem[i++];            //</FONT><FONT face=宋体 size=3>需保留的元素移动到新位置</FONT>9 {' S/ @% L; I; [- [1 h/ r
    <FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem==same) i++;       //</FONT><FONT face=宋体 size=3>跳过相同的元素</FONT>
    . u" m: x5 J8 h8 H$ U2 T+ k, p<FONT size=3>    }5 u5 {9 D2 @' k' ]3 h
      }//while
    # c3 I, o& ?. q+ i0 q  while(i&lt;A.length)
    ) ^- Z1 [0 c0 Z5 P, A5 t    A.elem[m++]=A.elem[i++];      //A</FONT><FONT face=宋体 size=3>的剩余元素重新存储。</FONT>& u0 P( W; J/ E1 w; G* U& p* G5 w
    <FONT size=3>  A.length=m;
    9 S& K3 t9 {% s7 Q5 F2 M" q}// SqList_Intersect_Delete
    9 G% D2 L, ^. o4 r2 d</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>
    4 }8 |' }, X) l* z8 t0 B<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>
    , Q- S6 B( @$ V2 @2 V1 ^<FONT size=3>{. l) f( W, ^5 u# Y: ]6 L5 H( l
      p=B-&gt;next;q=C-&gt;next;r=A-next;4 t% \# M: u5 T1 f8 [9 P, s
      while(p&amp;&amp;q&amp;&amp;r)
    9 E$ ]: R2 ^& L) E; Q  {
    ; I* Y9 a5 y8 {    if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;
    6 H0 U% W4 l. ?/ z    else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;( w( v9 c+ s, C5 m1 B% i* K
        else; h, @: T6 G1 g
        {
    # }7 l6 v# A6 Y% }      u=p-&gt;data; //</FONT><FONT face=宋体 size=3>确定待删除元素</FONT><FONT size=3>u  C. z* ^+ x2 |% 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& n! P2 n+ y: M4 a
          if(r-&gt;next-&gt;data==u)
    0 D# y+ ?5 A& E( m9 w      {
    $ s) h* d5 r# ^$ J1 |        s=r-&gt;next;2 U: O8 |. w, e1 F; X2 A* k
            while(s-&gt;data==u)
    ; u( Q% \$ o- O$ X3 X1 f        {& M  ^" ]8 A, p0 O9 \5 U
              t=s;s=s-&gt;next;free(t); //<FONT face=宋体>确定第一个大于</FONT>u<FONT face=宋体>的元素指针</FONT></FONT><FONT size=3>s2 @- B$ q9 i1 |" U7 s
            }//while! F  A" j+ P  ~( d
            r-&gt;next=s; //<FONT face=宋体>删除</FONT>r<FONT face=宋体>和</FONT>s<FONT face=宋体>之间的元素</FONT></FONT>
    1 i- {8 |7 |* S* B- K* v; T<FONT size=3>      }//if7 i- T  E7 w( R8 n8 G0 h
          while(p-&gt;data=u) p=p-&gt;next;0 F3 h# d" \. E6 o8 K, H
          while(q-&gt;data=u) q=q-&gt;next;
    3 L  j. Z( a, t% T    }//else1 P7 v+ _" O1 O: _
      }//while
    / A' A! I8 |9 g" ^4 T}//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>) a  R+ Z7 B9 d# H9 \
    <FONT size=3>{
    & ?( N6 S5 L5 ~6 P! f  Z$ C/ G  p=s;
    ' G* G! p4 Q4 N; a  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; s- Q- W% y7 W  {. a
      p-&gt;next=s;
    4 l0 b& K7 R2 p$ }9 C  return OK;
    . G1 u0 \( v6 _( i- L; o- ?" U}//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>1 r0 H- H6 `/ M! f. T
    <FONT size=3>{
    1 m4 u$ Z' {( H# d: A  j& P% [8 |9 [  for(p=L;!p-&gt;next-&gt;pre;p=p-&gt;next) p-&gt;next-&gt;pre=p;
    1 K7 k. k2 u# z  F. |! A  return OK;
    . t: @$ ^& d' w, j' m5 X' 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>.0 W8 q' s( s2 ~  z  k6 J
    {9 }6 ?* T1 c' P4 }, X
      s=L-&gt;next;9 a* c& u- @& D
      A=(CiList*)malloc(sizeof(CiLNode));p=A;
    ( Z7 B# N$ H  f; {) u  B=(CiList*)malloc(sizeof(CiLNode));q=B;  J) d* |; E" Y4 g0 m& m
      C=(CiList*)malloc(sizeof(CiLNode));r=C; //<FONT face=宋体>建立头结点</FONT></FONT>
    $ }. t' u- X0 D9 t" N' ]: p( ~) y<FONT size=3>  while(s)
    ) U2 V' K( j4 @. o' c6 E  {
    " O4 z& }# q$ a6 E    if(isalphabet(s-&gt;data))% S' U: p# Y5 m' w, B& B  U9 }
        {
    ( f  d+ l6 S& L% ?  g8 s1 f      p-&gt;next=s;p=s;
    . q9 s! L* }# n2 ^    }
    4 k8 O7 I- [4 b9 B    else if(isdigit(s-&gt;data))# P: B2 I! Y! [3 `+ l
        {
    0 k8 W' d. s# n1 m1 Q      q-&gt;next=s;q=s;
    & {% ?4 C% l0 G5 `    }
    4 s$ s8 d* O- J) c2 j) }    else
    / X" f( N8 G- O4 e1 {5 _    {6 ~2 `: ?8 Q) h8 c7 _* T
          r-&gt;next=s;r=s;$ L9 k" v2 I! \1 P4 s% l: b
        }% o. }" j! z2 V. {
      }//while
    ! v) G% S- e+ d* b* ~) M  p-&gt;next=A;q-&gt;next=B;r-&gt;next=C; //</FONT><FONT face=宋体 size=3>完成循环链表</FONT>
    - R* E' e  |3 j9 {<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>
    7 C; P1 o8 ?% [( M7 r<FONT size=3>{
    - U0 I  d3 \# Z5 h  p=L.left;pre=NULL;) B- [& ?  z$ T9 ^, U
      while(p)/ z& N7 |! A5 e, A$ ^, c+ p
      {
    $ ?9 P! l' H0 G+ g( K1 a) X: F    printf("%d",p-&gt;data);
    4 h- d: z5 e2 a% c7 ^( @6 x    q=XorP(p-&gt;LRPtr,pre);
    7 O% [. w8 |* ^6 [    pre=p;p=q; //</FONT><FONT size=3><FONT face=宋体>任何一个结点的</FONT>LRPtr<FONT face=宋体>域值与其左结点指针进行异或运算即得到其右结点指针</FONT></FONT>
    * Q& @, \+ d0 r3 ^( Y<FONT size=3>  }! {3 _0 }4 u2 g5 c$ o, }
    }//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
    1 P8 a0 F, M; c3 p- ?1 ~' t) t{( x. S; E# e# X6 J
      p=L.left;pre=NULL;
    0 O) o% z' Y% r$ `  r=(XorNode*)malloc(sizeof(XorNode));/ s# q5 f& t# H/ M6 @1 R
      r-&gt;data=x;
    8 S& }7 V2 n' a6 b7 ^  if(i==1) //<FONT face=宋体>当插入点在最左边的情况</FONT></FONT>
    - V2 W( j8 Q5 h( ^7 t: S3 ^5 ~<FONT size=3>  {5 S, d3 `$ v. L2 V) A4 m
        p-&gt;LRPtr=XorP(p.LRPtr,r);
    ! s4 Q# x; `$ z9 N. p( H/ e) L    r-&gt;LRPtr=p;
    & ]: G5 L7 m( e    L.left=r;( G  q. E: Z0 G$ M/ Q
        return OK;9 m1 j% u  u: e* y# T
      }
    + n% p  c; f! y- C$ A4 L  j=1;q=p-&gt;LRPtr; //</FONT><FONT face=宋体 size=3>当插入点在中间的情况</FONT>7 G, Y* c2 h8 c8 F. R
    <FONT size=3>  while(++j&lt;i&amp;&amp;q)7 W* K' e9 U) e$ t. E  r
      {
    1 L8 |" \+ h' u/ t. L    q=XorP(p-&gt;LRPtr,pre);
    6 T6 V; D# C' z8 O% m2 {    pre=p;p=q;( W1 K- l0 I1 a  K
      }//while //</FONT><FONT size=3><FONT face=宋体>在</FONT>p,q<FONT face=宋体>两结点之间插入</FONT></FONT>
    $ v* G6 p/ `) h+ I/ R' ]<FONT size=3>  if(!q) return INFEASIBLE; //i</FONT><FONT face=宋体 size=3>不可以超过表长</FONT>
    % s: Z2 K3 Q6 x9 ]& s<FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);: m3 y) F# d2 o. I
      q-&gt;LRPtr=XorP(XorP(q-&gt;LRPtr,p),r);$ j% w* D8 q5 \+ \
      r-&gt;LRPtr=XorP(p,q); //</FONT><FONT face=宋体 size=3>修改指针</FONT>* ~4 h/ K3 U0 U' A) z
    <FONT size=3>  return OK;7 L$ i% m6 M, A8 H0 ]* F  i* M
    }//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>) r4 _& C3 o' x( O
    <FONT size=3>{
    + V- Z' u4 ?5 G, T6 ?# r  p=L.left;pre=NULL;6 D7 H" R' D6 E" q1 M. v2 b. ?
      if(i==1) //</FONT><FONT face=宋体 size=3>删除最左结点的情况</FONT>7 f* l3 k* |2 G+ R( C3 q. m
    <FONT size=3>  {
    $ }3 c. M0 r9 w9 {" E# [8 m; L) v    q=p-&gt;LRPtr;, x% _. y2 Y8 n3 ]4 I' C
        q-&gt;LRPtr=XorP(q-&gt;LRPtr,p);
    " N5 {1 x! C. D+ o( b  k- p    L.left=q;free(p);
    , o# d( G1 ~( a  O    return OK;  U3 q3 ~/ m0 h
      }
    5 t3 u1 k' q6 [0 E. h8 u  q$ q  }  j=1;q=p-&gt;LRPtr;
    2 O2 w5 t$ e- s  B# t  while(++j&lt;i&amp;&amp;q)- \4 \1 T7 f1 ~6 M: }
      {
    0 |  i; s. W4 k. g  @: T    q=XorP(p-&gt;LRPtr,pre);% i0 Z0 M: k$ P/ l: H' G
        pre=p;p=q;
    ( r" U. m* e" d8 k) V  }//while //</FONT><FONT face=宋体 size=3>找到待删结点</FONT><FONT size=3>q
    9 F7 x% K: h3 ?/ J1 u$ h5 y% }! |  if(!q) return INFEASIBLE; //i<FONT face=宋体>不可以超过表长</FONT></FONT>
    8 G: a7 |# [1 j$ p( {<FONT size=3>  if(L.right==q) //q</FONT><FONT face=宋体 size=3>为最右结点的情况</FONT>
    3 |/ K7 o$ V5 M! s8 `, Y<FONT size=3>  {
    ) ?+ F: ]$ x, {  w% ?' \    p-&gt;LRPtr=XorP(p-&gt;LRPtr,q);
    0 H6 ~8 G! N4 ^# Z9 k    L.right=p;free(q);
    3 t2 F7 x. E1 i9 D    return OK;: A0 C5 c* N- D' W# Q) h
      }
    & Z  n" j6 _! [: N* m' T  r=XorP(q-&gt;LRPtr,p); //q</FONT><FONT size=3><FONT face=宋体>为中间结点的情况</FONT>,<FONT face=宋体>此时</FONT>p,r<FONT face=宋体>分别为其左右结点</FONT></FONT>
    5 I4 e- v  z, p6 ^% X<FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);
    ' I/ Z2 V7 I% r  r-&gt;LRPtr=XorP(XorP(r-&gt;LRPtr,q),p); //</FONT><FONT face=宋体 size=3>修改指针</FONT>
    / t9 j& r4 W; {4 s4 d9 @) j. I<FONT size=3>  free(q);
    / i* g/ K3 f+ b0 y" v  return OK;0 S' R0 T, @2 c: R  N2 `7 n. p" r
    }//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>
    , b  w% p, @2 h5 F! U1 W<FONT size=3>{
    ( k; v. W7 I1 a4 L! S, z  p=L.next;' i7 L  k) V$ Z# i  q8 o
      while(p-&gt;next!=L&amp;&amp;p-&gt;next-&gt;next!=L)- o# X2 l& ?; u: E
      {7 K. [1 C% [" _: |
        p-&gt;next=p-&gt;next-&gt;next;
    # {- J# w( S2 L, A3 [3 E; m" {    p=p-&gt;next;
    7 g' |; }( q% m& {  } //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个奇数结点</FONT></FONT>+ t* T; S" o; c# W4 j' R
    <FONT size=3>  if(p-&gt;next==L) p-&gt;next=L-&gt;pre-&gt;pre;
    9 j1 p  b8 @) T7 K' g  else p-&gt;next=l-&gt;pre;# Y: ~; O7 F4 {4 f. [1 z
      p=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个偶数结点</FONT></FONT>
    / D4 l3 R% q1 ]1 [* f+ ~; @<FONT size=3>  while(p-&gt;pre-&gt;pre!=L)
    0 k1 z- x# D6 {1 b2 H2 z6 ^& K  m  {! A3 }2 U5 O- q8 o# _& g
        p-&gt;next=p-&gt;pre-&gt;pre;
    , d4 i) l0 g# e( `+ p    p=p-&gt;next;
    # I8 p, G$ _( _+ x4 R, q  }& C& [9 }0 C3 C' l, B- h$ E6 Q( [
      p-&gt;next=L; //</FONT><FONT size=3><FONT face=宋体>按题目要求调整了</FONT>next<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>此时</FONT>pre<FONT face=宋体>链仍为原状</FONT></FONT>
    5 k) c, S7 j# K9 K5 p<FONT size=3>  for(p=L;p-&gt;next!=L;p=p-&gt;next) p-&gt;next-&gt;pre=p;) n0 T( h' I2 R0 K- F5 l
      L-&gt;pre=p; //</FONT><FONT size=3><FONT face=宋体>调整</FONT>pre<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>同</FONT>2.32<FONT face=宋体>方法</FONT></FONT>, x- z0 A, `+ `' @8 k' {& T# t
    <FONT size=3>}//OEReform
    5 J# l% I3 Q$ O" q</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>/ c4 Z2 w8 N1 J6 K6 J, P
    <FONT size=3>{) H4 K7 {8 O( P
      p=L.next;& A8 \' [6 e9 k1 l0 m
      while(p.data!=x&amp;&amp;p!=L) p=p-&gt;next;( a1 ?" X4 J( w
      if(p==L) return NULL; //</FONT><FONT face=宋体 size=3>没找到</FONT>* C& W, J  H& q% A# O& }* h8 _$ I
    <FONT size=3>  p-&gt;freq++;q=p-&gt;pre;, |/ W0 v8 b2 b' x# I7 H
      while(q-&gt;freq&lt;=p-&gt;freq) q=q-&gt;pre; //</FONT><FONT face=宋体 size=3>查找插入位置</FONT>- T; S' _+ V; u( d  {+ h
    <FONT size=3>  if(q!=p-&gt;pre)3 v* @' v! Q# B$ X7 _0 ~( b
      {$ `' J4 ?* E8 z& D9 d
        p-&gt;pre-&gt;next=p-&gt;next;p-&gt;next-&gt;pre=p-&gt;pre;
    * g; T! \$ _$ d& [    q-&gt;next-&gt;pre=p;p-&gt;next=q-&gt;next;: a' g" T  X! \. W' \7 u0 `
        q-&gt;next=p;p-&gt;pre=q; //</FONT><FONT face=宋体 size=3>调整位置</FONT>' O/ ?/ ^) x, M$ a  S9 L
    <FONT size=3>  }
    " z+ S6 M: x& n! j* [# r$ i3 u  return p;! Y, @7 F; N- _5 e. T: |5 G8 w
    }//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>6 f4 J- r7 Z& X" z. o3 X8 ?& |
    <FONT size=3>{
    " G  j7 Z! S% u' A9 f) r, T  PolyTerm *q;+ R( V. O4 V2 T1 u1 X: U
      xp=1;q=P.data;! ]- K- x  f7 L; t& j$ U* m$ E! Z0 i6 ^# e
      sum=0;ex=0;
    6 G5 N1 o) n1 k  S' @$ C- o  while(q-&gt;coef)! P* i  m, v# t) |# z0 _% c, v
      {  E8 ]2 N! B* U
        while(ex&lt;q-&gt;exp) xp*=x0;
    ; V1 f$ b# s; b- x6 j( \    sum+=q-&gt;coef*xp;
    ) g+ ?; K! v* L. B* c    q++;! p; [1 r* B- L: n% l, X
      }' z( F. d  e& f
      return sum;2 u# S- Z  a: g1 k3 e/ k1 |
    }//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
    8 a5 t; {3 j7 k5 V6 j{3 ^; `+ M! A/ g* q$ V! j, U
      PolyTerm *p,*q,*r;7 c" h, T* b# \+ l9 f" r2 ~% r
      Create_SqPoly(P3); //<FONT face=宋体>建立空多项式</FONT></FONT><FONT size=3>P3
    : p8 Q  a, ^4 S0 n. L/ L  L  o  p=P1.data;q=P2.data;r=P3.data;. w+ t( W6 s, I: @: d
      while(p-&gt;coef&amp;&amp;q-&gt;coef). p$ d' V1 f# d+ t9 u* |- L
      {- v! W) k" k) Y
        if(p-&gt;exp&lt;q-&gt;exp)9 R! b0 ^+ {/ g% M& _
        {
    6 r4 W5 j* d' k* N$ D      r-&gt;coef=p-&gt;coef;
    2 N" ~) F/ x/ c7 Q      r-&gt;exp=p-&gt;exp;
    : I/ f) q$ R- o2 p      p++;r++;: e, b( c! p7 i6 w9 b  Q2 m
        }5 ~6 ^* x) A3 e  p8 c
        else if(p-&gt;exp&lt;q-&gt;exp)
    1 y* Q% Y' O$ j, x6 c. ]    {/ z: ^8 h" z' `( i. J4 [5 J, D1 b
          r-&gt;coef=-q-&gt;coef;1 H/ |& f+ u/ @0 }+ G0 K" F" K
          r-&gt;exp=q-&gt;exp;
    ! Z! s4 g- y$ P1 w3 b4 F) U( d      q++;r++;
    ! m! L- l, u/ o5 e    }
    4 H% X' _# Q/ l    else
    , }6 Z9 A7 ^7 F  Y1 `7 F  ^    {) s+ {' z" |( a
          if((p-&gt;coef-q-&gt;coef)!=0) //<FONT face=宋体>只有同次项相减不为零时才需要存入</FONT>P3<FONT face=宋体>中</FONT></FONT>
    - X; `1 K  L# k4 y0 t2 h" r<FONT size=3>      {) \8 Q0 z/ E( T+ m4 h
            r-&gt;coef=p-&gt;coef-q-&gt;coef;
    . s1 d+ Q/ H5 o# a% N' e; D. M; X        r-&gt;exp=p-&gt;exp;r++;  ~' C9 b. _+ r: I  d
          }//if
    ) Q# k  @$ a# T; ^, U5 `      p++;q++;
    9 a5 g+ `# @; t' K- T    }//else
    8 e" S5 H( x4 |/ s5 @) _  }//while) [% T3 |) J0 p6 D* L7 r$ G
      while(p-&gt;coef) //</FONT><FONT size=3><FONT face=宋体>处理</FONT>P1<FONT face=宋体>或</FONT>P2<FONT face=宋体>的剩余项</FONT></FONT>
    / z7 ?8 t: v4 r+ }' s/ Q2 K<FONT size=3>  {
    + V9 y0 y7 e: ^( C$ ~' G    r-&gt;coef=p-&gt;coef;: k5 R! \3 V/ m1 s" X0 ?4 w! J
        r-&gt;exp=p-&gt;exp;/ ^# J" U, t  q' [1 P
        p++;r++;
    " Y: [/ a8 }& A$ P5 _, }! w3 f  }# F% D: W2 g5 T1 a$ M# G5 G
      while(q-&gt;coef)
    3 F6 ~+ W5 M. T1 v% v2 h  {
    ) A; E* h1 d, a! H    r-&gt;coef=-q-&gt;coef;$ _1 T. Z0 _$ x: v0 a
        r-&gt;exp=q-&gt;exp;0 z3 {8 E1 S0 l
        q++;r++;" y0 E3 |# B, d: r" U
      }/ q6 O: k. h" G. z
    }//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>
    + u6 g: @& Y4 l0 W8 [6 h<FONT size=3>{
      `( g4 a8 Q. j& o  p=L-&gt;next;
    % p$ N+ V6 ~8 n  r& j1 D9 U  if(!p-&gt;data.exp)" k' S. ^# d6 g) D5 C3 C2 _
      {/ ~; A& H+ J/ Q: r0 \6 d9 Q
        L-&gt;next=p-&gt;next;p=p-&gt;next; //</FONT><FONT face=宋体 size=3>跳过常数项</FONT>
    9 K- P! F( w, \' Y1 f<FONT size=3>  }1 j9 t/ v+ O+ K0 v4 ^
      while(p!=L)$ x$ F( }9 ?: j/ |9 ^
      {* _  [4 T5 R% W3 G1 h6 X5 F% }
        p-&gt;data.coef*=p-&gt;data.exp--;//</FONT><FONT face=宋体 size=3>对每一项求导</FONT>
    % K6 L2 q  A& A% M. z; h<FONT size=3>    p=p-&gt;next;) N, ?) q2 E/ z5 u2 t& U. z5 f& g
      }
    # S2 s- B, \8 E! H$ X& p5 K}//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>B9 M3 a, y- Z; C) J) D
    {( j7 v( X6 r( R! |/ v- }4 s8 h  @
      p=L-&gt;next;
    % X' v; o4 F7 p6 ^) a( Y  A=(PolyNode*)malloc(sizeof(PolyNode));, d2 S8 d% p1 x# u+ t! Q
      B=(PolyNode*)malloc(sizeof(PolyNode));
    2 ]7 m) i: T  o4 h  l1 v5 h' P  pa=A;pb=B;
    ' W( \1 q( H- h  g, r* ^" O  while(p!=L); o: y, |! |" Y
      {
    8 Q2 v% ^3 R9 g: {; H  D6 ~6 `    if(p-&gt;data.exp!=2*(p-&gt;data.exp/2))
    3 N) t" J) S; J+ P+ o# `- ?- L    {
    $ Q0 i/ P, y; q, a      pa-&gt;next=p;pa=p;9 I7 u9 ], j( P' i3 J
        }" J* v) P6 X) H, j) P) V
        else
    ' o& u8 I1 B( C, \% [; R    {
    4 C' i+ O5 a3 P! w4 o2 O: T      pb-&gt;next=p;pb=p;
    * k/ |, J" H, l+ F) Q    }! V: ]+ Z3 ~9 J
        p=p-&gt;next;
    2 v3 W) i: u/ ~: d% @* C  }//while: B7 j6 c% m! ~* I  d
      pa-&gt;next=A;pb-&gt;next=B;
    : N6 }: ?1 H4 P4 [) R}//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, 2025-7-30 02:08 , Processed in 0.437771 second(s), 68 queries .

    回顶部