QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4940|回复: 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- U0 q; n# l( H
    <><FONT size=3>1. <FONT face=宋体>本文是对严蔚敏《数据结构</FONT>(c<FONT face=宋体>语言版</FONT>)<FONT face=宋体>习题集》一书中所有算法设计题目的解决方案<p></p></FONT></FONT></P># y7 e4 a7 H# K: t
    <><FONT size=3>2. <FONT face=宋体>本解答中的所有算法均采用类</FONT>c<FONT face=宋体>语言描述</FONT>,<FONT face=宋体>设计原则为面向交流、面向阅读</FONT>,<FONT face=宋体>作者不保证程序能够上机正常运行</FONT>(<FONT face=宋体>这种保证实际上也没有任何意义</FONT>);<p></p></FONT></P>
    " `# H1 ^" X# }! K/ _<><FONT size=3>3. <FONT face=宋体>本解答原则上只给出源代码以及必要的注释</FONT>,<FONT face=宋体>对于一些难度较高或思路特殊的题目将给出简要的分析说明</FONT>,<FONT face=宋体>对于作者无法解决的题目将给出必要的讨论</FONT>.<FONT face=宋体>目前尚未解决的题目有</FONT>: 5.20, 10.40;<p></p></FONT></P>
    + w8 d6 G4 Z4 X3 m<><FONT size=3>4. <FONT face=宋体>请读者在自己已经解决了某个题目或进行了充分的思考之后</FONT>,<FONT face=宋体>再参考本解答</FONT>,<FONT face=宋体>以保证复习效果</FONT>;<p></p></FONT></P>
    / I" K# Q: A2 a) a<><FONT size=3>5. <FONT face=宋体>由于作者水平所限</FONT>,<FONT face=宋体>本解答中一定存在不少这样或者那样的错误和不足</FONT>,<FONT face=宋体>希望读者们在阅读中多动脑、勤思考</FONT>,<FONT face=宋体>争取发现和纠正这些错误</FONT>,<FONT face=宋体>写出更好的算法来</FONT>.<p></p></FONT></P>
      ]4 z7 k0 ?& H( k3 N< ><FONT face=宋体>第一章</FONT> <FONT face=宋体>绪论</FONT> <p></p></P>
    . b: Y- R6 N& [7 C<><FONT size=3>1.16 <p></p></FONT></P>$ T- D/ \6 a) e- l" G
    <><FONT size=3>void print_descending(int x,int y,int z)//<FONT face=宋体>按从大到小顺序输出三个数</FONT></FONT>
    : d+ j- a: H% ^/ m9 |' Q<FONT size=3>{
    + N+ w8 M) V* c, l2 L  scanf("%d,%d,%d",&amp;x,&amp;y,&amp;z);4 b1 B  U/ b$ b5 s9 A( O, M
      if(x&lt;y) x&lt;-&gt;y; //&lt;-&gt;</FONT><FONT size=3><FONT face=宋体>为表示交换的双目运算符</FONT>,<FONT face=宋体>以下同</FONT></FONT>
    1 ]/ n1 s/ h4 m6 v, Q, A! B4 `8 v% G0 c<FONT size=3>  if(y&lt;z) y&lt;-&gt;z;
    ) S# \1 X; V$ \0 W) u: {  if(x&lt;y) x&lt;-&gt;y; //</FONT><FONT face=宋体 size=3>冒泡排序</FONT># N7 b* M4 ^8 L) l
    <FONT size=3>  printf("%d %d %d",x,y,z);) _: ~$ F  K( O1 e
    }//print_descending <p></p></FONT></P>
    ! W# ?& h9 S3 u) X$ t7 T; L<><FONT size=3>1.17 <p></p></FONT></P>
    , _; ?- h$ k7 a: }- H/ ?( V<><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
    ) \" A8 E9 f7 s; a% Y( o& Y{
    $ o) _! m+ F% }  int tempd;+ s! g* [- X2 Y0 u' m
      if(k&lt;2||m&lt;0) return ERROR;: M9 N7 v9 Y( I6 h% O
      if(m&lt;k-1) f=0;
    2 G  Z6 W, M5 u% V: _( ]  else if (m==k-1) f=1;) g4 Q& T6 U# q! g' `' e" i
      else
    # |  T5 H" I' r' R8 k8 D  {! r) T# w$ i4 q# |) Q# `1 W
        for(i=0;i&lt;=k-2;i++) temp=0;
    ! T) ?( R7 n0 F% _5 ~: Q8 H! K" R5 S    temp[k-1]=1; //<FONT face=宋体>初始化</FONT></FONT>
    ) Y: M6 s0 G; y8 T$ a<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># T; }" P2 p' _$ L7 q. C! B2 ~! N
    <FONT size=3>    {
    - i0 v) K' m' W1 a6 [/ \! q      sum=0;( x. @$ Z' [+ `& O$ M. M1 {; W
          for(j=i-k;j&lt;i;j++) sum+=temp[j];
    7 l6 J$ N6 T7 X- ~: q8 |      temp=sum;
    ( [3 r$ t! q* `    }
    / g9 o, V) V. b# ]    f=temp[m];
    ' Y2 i0 Y; {; N0 U  Q  }; k2 C$ p! X' r4 \, n/ W9 C
      return OK;
    + R$ Z9 a& g. G8 M4 e/ b}//fib
    ) @% U+ {2 [9 m+ b3 O</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>
    8 x/ m& I2 E& N9 Y6 Z2 x7 v<><FONT size=3>1.18 <p></p></FONT></P>
    * F9 a6 E) q5 J: T<><FONT size=3>typedef struct{
    3 o( X2 U) z; `9 M8 L# D                    char *sport;( E, Z4 U: Z* S* P
                        enum{male,female} gender;* m$ S! F6 f/ p) n0 g/ O6 N2 p
                        char schoolname; //<FONT face=宋体>校名为</FONT>'A','B','C','D'<FONT face=宋体>或</FONT></FONT><FONT size=3>'E'! @2 R1 C$ N, _5 d) M
                        char *result;5 ~6 E' S9 r9 j* A4 e
                        int score;
    + v/ f9 K9 o8 f. @                  } resulttype; <p></p></FONT></P>. _% `5 H. R+ C$ L$ b
    <><FONT size=3>typedef struct{  h6 ~) Q( u' K" t/ d
                        int malescore;
    * B/ T: Z' q' M, s0 I                    int femalescore;
    9 y+ r* a6 o2 u8 _                    int totalscore;
    5 U6 t4 i% G1 [* m1 L                  } scoretype; <p></p></FONT></P>9 c- [0 |$ S7 `7 }
    <><FONT size=3>void summary(resulttype result[ ])//<FONT face=宋体>求各校的男女总分和团体总分</FONT>,<FONT face=宋体>假设结果已经储存在</FONT>result[ ]<FONT face=宋体>数组中</FONT></FONT>' J9 s( ^: X0 i& e  \+ G
    <FONT size=3>{* O; ]# _- X  R( U: h; h$ w
      scoretype score;
    0 _4 [2 T: Z, j3 O8 {7 h  i=0;0 s9 \9 S2 x( L6 b) d+ X
      while(result.sport!=NULL)
    ! s4 v: ^2 `. B' H) K: i  {
    * e9 N. i) o" ~* M1 y6 K    switch(result.schoolname)8 x" c0 N+ M% Q+ u( Q# ?2 G
        {
    + w: X; Y3 K/ B: a: _( e      case 'A':0 q' F( w9 ~* M# L
            score[ 0 ].totalscore+=result.score;
    : N9 i3 T; v) E) U5 p) }        if(result.gender==0) score[ 0 ].malescore+=result.score;
    $ V0 Y$ G- g2 Q0 n+ s2 e0 i$ F        else score[ 0 ].femalescore+=result.score;
    ; Z( d! ^" O8 q0 F        break;$ P+ K5 ^1 U5 j2 W/ F; @2 U2 ~
          case 'B':
    ; U9 f( j9 q/ u7 L! E        score.totalscore+=result.score;
    4 Z' d4 g+ E7 w7 g        if(result.gender==0) score.malescore+=result.score;
    . ^* j! T: `: }5 B        else score.femalescore+=result.score;; p( q* S! K# Q' x
            break;+ k! J2 n# O+ r: g' |
          </FONT><FONT size=3><FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT>    <FONT face=宋体>……</FONT></FONT>
    ) ~/ J3 w$ B- A% L<FONT size=3>    }
    ( s) G/ o- ~, Y4 L, u0 {# \# z, b    i++</FONT><FONT face=宋体 size=3>;</FONT>, S, v- e  s7 c/ C9 t
    <FONT size=3>  }( w$ X; ]5 Y8 D
      for(i=0;i&lt;5;i++)
    5 R0 C1 h6 e- D; }  {2 J. F$ t1 a6 Q$ G2 \/ X9 k
        printf("School %d:\n",i);' A( O) o) p1 @, V. V- V
        printf("Total score of male:%d\n",score.malescore);
    9 Y  p/ _4 L1 V  F2 Q5 ?" K* V    printf("Total score of female:%d\n",score.femalescore);  a. X2 V4 J. R
        printf("Total score of all:%d\n\n",score.totalscore);
    , ?/ p; e; [5 ?  }
    ; H8 S+ p6 c0 p6 @5 v}//summary <p></p></FONT></P>
    ! V% t: N/ i/ z* F1 P<><FONT size=3>1.19 <p></p></FONT></P>& ^! z& l2 i' o9 w4 J
    <><FONT size=3>Status algo119(int a[ARRSIZE])//<FONT face=宋体>求</FONT>i!*2^i<FONT face=宋体>序列的值且不超过</FONT></FONT><FONT size=3>maxint
    ) d0 U/ U! `& l% L{& C- o' Q5 J* K- S+ c( U
      last=1;
      m4 G+ c2 i" p: \  for(i=1;i&lt;=ARRSIZE;i++)
    0 a6 g3 V2 Z& Z  {
      c8 S# e' v5 V& u$ {' J0 T0 j  a[i-1]=last*2*i;
    . F0 r6 _3 X# u0 a4 T: i# |2 f! x' g4 {   if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;
    " U1 V" e: S* ~) Z! ~( O* j   last=a[i-1];
    % J8 E# \) x9 y6 D7 i   return OK;
    * g( o( j' V# ]% N) }4 f% e  }
    % L; f. W) U( J}//algo119
    - E" v8 z- f5 m<FONT face=宋体>分析</FONT>:<FONT face=宋体>当某一项的结果超过了</FONT>maxint<FONT face=宋体>时</FONT>,<FONT face=宋体>它除以前面一项的商会发生异常</FONT>. <p></p></FONT></P>: {, ?$ U) K" h, X0 r, E
    <><FONT size=3>1.20 <p></p></FONT></P>
    7 }0 X  {: _" ~# h# Y<><FONT size=3>void polyvalue()
    $ c0 a4 Z$ }6 K1 M3 E) t9 k8 e{
    ' @9 U, |& ~+ T9 ~7 W( D  float ad;
    2 z! S: r; W. e) R% w5 [6 h9 C, n, T  float *p=a;
    % F9 j) {% ]( d2 j# i% p0 @  printf("Input number of terms:");
    7 _) K- ]5 D# y3 \/ B$ l5 y9 B+ N  scanf("%d",&amp;n);
    0 T$ _% n: c4 \. V8 U. D) [  printf("Input the %d coefficients from a0 to a%d:\n",n,n);
    ) w0 Q" p% Q$ K$ k. U2 J5 A  for(i=0;i&lt;=n;i++) scanf("%f",p++);
    0 t% _6 @& f+ |( c* m  printf("Input value of x:");& N; x- |9 r4 g) b. j  n: I! l
      scanf("%f",&amp;x);
    * R# Q, n0 W* Q- u3 l  p=a;xp=1;sum=0; //xp<FONT face=宋体>用于存放</FONT>x<FONT face=宋体>的</FONT>i<FONT face=宋体>次方</FONT></FONT>
    # k7 n2 M. F8 @5 T  ^7 |( h, q<FONT size=3>  for(i=0;i&lt;=n;i++)
      C5 d" N8 ]0 Z. Z* S$ I  {
    5 B, V; a2 _5 _/ ?  D6 K+ P- p( J) J    sum+=xp*(*p++);
    * ^+ P2 N* B$ i  [9 Y5 h: l; y, N    xp*=x;
    . [) Y! C9 L3 v' A  ?4 z  }8 F% c9 C; c* I0 k. Q1 X
      printf("Value is:%f",sum);
    1 }5 B6 ]6 {' E& C$ F# s9 T}//polyvalue<p></p></FONT></P>2 j/ T- _# C# h2 \  A6 i+ R* S
    < ><p><FONT face="Times New Roman"> </FONT></p></P>
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    铜豆子        

    0

    主题

    3

    听众

    22

    积分

    升级  17.89%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    布赖        

    4

    主题

    2

    听众

    134

    积分

    升级  17%

    该用户从未签到

    回复

    使用道具 举报

    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>9 b" ~; M5 [2 U
    <FONT size=3>{" w6 }  r' P3 L5 G. a& L/ X( p
      if(i&lt;1||k&lt;0||i+k-1&gt;a.length) return INFEASIBLE;
    # n( N9 L% X3 y2 L8 F  for(count=1;i+count-1&lt;=a.length-k;count++) //</FONT><FONT face=宋体 size=3>注意循环结束的条件</FONT>
    7 ]% H6 E$ e4 n* T! H+ Z- Y<FONT size=3>    a.elem[i+count-1]=a.elem[i+count+k-1];
    ; }( u1 E* O" T: C/ U7 Z' n  a.length-=k;6 N( e/ s% a4 t% a
      return OK;
    - C6 d3 H1 T5 B' x1 M$ o# Q, k3 k% p/ P}//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>+ G% ~' W0 P0 i: S) a# u3 n
    <FONT size=3>{3 W( t  f: L) |' \, m9 I# f$ L
      if(va.length+1&gt;va.listsize) return ERROR;
    ) r/ j8 |, [  {; N: g6 _$ F- i0 x  va.length++;5 L: |8 l2 {; i
      for(i=va.length-1;va.elem&gt;x&amp;&amp;i&gt;=0;i--)
    + r: m4 S' T3 i5 S) z4 |    va.elem[i+1]=va.elem;
    # g( R: y9 }$ i0 {  va.elem[i+1]=x;6 A# l5 |' H# y+ ^8 w8 N8 U5 D
      return OK;9 |- S% g3 H1 E* g. B# i, r
    }//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
    + T* G. s: I" E1 n* i{( |" y3 k- |! N9 z5 c# j; `1 F
      for(i=1;A.elem||B.elem;i++)
    $ |( f3 r. C% P/ |. o    if(A.elem!=B.elem) return A.elem-B.elem;
    + V0 T+ `0 M: A1 _  return 0;
    2 R# K' S6 G3 p" K/ c}//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>
    9 r4 U3 m# B0 o! H& c<FONT size=3>{7 i  H- L3 j+ T  B& _
      for(p=l-&gt;next;p&amp;&amp;p-&gt;data!=x;p=p-&gt;next);+ T  T  `( G; ?. a
      return p;$ E( ]% [5 f' 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>
    8 D0 w0 l0 M3 Z" M, y* J<FONT size=3>{
    $ v- }2 e5 {' K5 C  for(k=0,p=L;p-&gt;next;p=p-&gt;next,k++);
    , x9 M# j  n; s: s+ B2 c  return k;
    9 U( L, O: g; ?% _, \! I4 A6 ^- k}//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>hc3 I+ G5 {- ?) Z8 R: S  _7 |
    {6 C* }+ U3 o% m3 q5 P% p: z& k! d
      hc=ha;p=ha;
    # {% C; Q  Y! X5 `& Y! t  while(p-&gt;next) p=p-&gt;next;
    1 P5 T  T6 t  i  p-&gt;next=hb;
    0 N7 w7 l. l" g4 I* e# ?}//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>b6 \1 h' r- [# U) h! i
    {! S$ B2 j) E6 ?4 Z9 O% e' i
      p=L;q=(LinkList*)malloc(sizeof(LNode));
    ) c, H! q" z; x0 [7 J  q.data=b;
    1 _$ t0 ^# k! G& ^+ y  if(i==1)
    % S7 N" |, b& H1 d1 h  {- @, }3 g$ R" `2 U- \7 y. z& s
        q.next=p;L=q; //<FONT face=宋体>插入在链表头部</FONT></FONT>' L8 u4 e# f6 e
    <FONT size=3>  }! X& V6 P" K2 o' x
      else
    ' `( k+ p& `# v7 \* l3 Q  {
    + r  l3 Y- V: X% c! X* P. N% G    while(--i&gt;1) p=p-&gt;next;% p* k+ {+ Z% s9 @# N3 m
        q-&gt;next=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>插入在第</FONT>i<FONT face=宋体>个元素的位置</FONT></FONT>
    , I& ~6 l. }8 a# ?7 I<FONT size=3>  }
    % y, K6 _. L6 A}//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>! g$ [, g8 M, I% |; H- F" Q8 S
    <FONT size=3>{
    + v; T9 w) ]6 C/ x  if(i==1) L=L-&gt;next; //</FONT><FONT face=宋体 size=3>删除第一个元素</FONT>
    " z  ]7 f* F/ x2 ]3 e& ?  x- B8 o<FONT size=3>  else
    9 _( i# O6 r1 M9 F. i  {
    5 P( ]" Z/ o( I$ _& T- D3 N    p=L;
    3 W8 D; G/ _3 g    while(--i&gt;1) p=p-&gt;next;
    3 a/ Q, @) {5 k, ~0 X$ Q3 o    p-&gt;next=p-&gt;next-&gt;next; //</FONT><FONT size=3><FONT face=宋体>删除第</FONT>i<FONT face=宋体>个元素</FONT></FONT>
    8 f7 R5 B4 F8 q* h, q9 `) }* Q. k<FONT size=3>  }0 H. Q0 C# J7 k9 |# m" ^5 C
    }//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>
      l7 t/ s: p0 ]: C$ M<FONT size=3>{
    6 x6 I. h* l5 ^) |  p=L;
    7 @4 Z' ~6 L& t/ v8 M7 j; x& K9 `  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>
    5 Q! ?7 o( t. y9 f<FONT size=3>  if(p-&gt;next)    //</FONT><FONT size=3><FONT face=宋体>如果还有比</FONT>mink<FONT face=宋体>更大的元素</FONT></FONT>
    . g6 c9 {1 N) X7 R<FONT size=3>  {- Q( E( @  U( Y; `" E: q$ h. A3 p
        q=p-&gt;next;" T6 j2 r  p  |  g* Q: h/ V7 s" g. W
        while(q-&gt;data&lt;maxk) q=q-&gt;next; //q</FONT><FONT size=3><FONT face=宋体>是第一个不小于</FONT>maxk<FONT face=宋体>的元素</FONT></FONT>
    3 b! d8 W- ~1 f<FONT size=3>    p-&gt;next=q;9 n" d1 F, ~8 I. r( c" d# V8 U
      }4 X% k' O8 f) {; @$ j! R
    }//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>: [! ^5 J3 I; n  o& k$ K) e
    <FONT size=3>{
    * F( I+ E" j, c3 j: R  p=L-&gt;next;q=p-&gt;next; //p,q</FONT><FONT face=宋体 size=3>指向相邻两元素</FONT>
    ( V5 V3 k) F, s* @2 N<FONT size=3>  while(p-&gt;next)
    " }$ \' M1 I  v; w- C  {- z0 q% g- i* Z# O
        if(p-&gt;data!=q-&gt;data)
      l& J. V2 F9 x# b: e6 Q( h% f7 R3 S    {* R, b! K# ^6 K, Y/ x/ a$ L2 l
          p=p-&gt;next;q=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>当相邻两元素不相等时</FONT>,p,q<FONT face=宋体>都向后推一步</FONT></FONT>
    8 O  @0 B  ^0 {# R& F6 i6 G<FONT size=3>    }# W, L+ l7 o6 Y* f- J
        else
    ) D( H( |! A% Q$ ~    {
    5 [- G. p) f! a8 n      while(q-&gt;data==p-&gt;data)
    & \2 s8 ^* q4 l9 v! s   {8 |( u3 r2 i! o' @/ g5 w# `
         free(q);
    " `8 t9 k- |, }; Y, f     q=q-&gt;next;
    * [9 [8 u5 T) W! u; |, A5 N6 G   }
    # q! D2 f1 ]! i4 U1 u2 i- h      p-&gt;next=q;p=q;q=p-&gt;next; //</FONT><FONT face=宋体 size=3>当相邻元素相等时删除多余元素</FONT>
    5 N+ @7 {7 l, v8 H3 c* Y<FONT size=3>    }//else
    3 m7 z% ~, H/ [- t  }//while6 m$ A4 q7 ]/ ~5 L% Q# S
    }//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>3 ]3 d/ T, O" T) Z$ R# u: Z
    <FONT size=3>{
    5 F$ _0 b: k% G+ c* p4 \! r3 l  for(i=1,j=A.length;i&lt;j;i++,j--)4 K7 z) \8 e6 M1 G
        A.elem&lt;-&gt;A.elem[j];
    ! E  x& o% J' f  B- C3 b2 p}//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
    6 t+ G+ a+ ^+ R7 T* J+ D* w1 ^{
    " l2 H. H% J- d+ E% ~  p=L-&gt;next;q=p-&gt;next;s=q-&gt;next;p-&gt;next=NULL;" \1 b; y( |- F/ A7 |, Q9 e$ S
      while(s-&gt;next): ~0 ~! z; p+ J0 e5 h
      {
    $ w2 x) r: T  ?) _0 @$ n    q-&gt;next=p;p=q;
    * ]& K9 N2 `  ~3 P; f- i( b    q=s;s=s-&gt;next; //<FONT face=宋体>把</FONT>L<FONT face=宋体>的元素逐个插入新表表头</FONT></FONT>
    2 P) F+ R. i0 T4 k<FONT size=3>  }
    - g4 L) A( g. F, i  q-&gt;next=p;s-&gt;next=q;L-&gt;next=s;
    ; r2 L/ k. B1 X! J}//LinkList_reverse1 |0 b/ a6 m1 e( O3 V8 z: f0 e
    </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>5 E& Y" I+ [1 s
    <FONT size=3>{1 t& G2 `: v0 S1 K( ^
      p=A-&gt;next;q=B-&gt;next;C=A;1 s% o! L7 k: A6 k# Z/ q# _, Q" E) I
      while(p&amp;&amp;q)
    0 }9 ?  Q* Y( r( o7 G4 }: s7 C  {1 v3 X% t- I3 [  C
        s=p-&gt;next;p-&gt;next=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>B<FONT face=宋体>的元素插入</FONT></FONT>6 U1 y; r  O$ e  ?
    <FONT size=3>    if(s)* ?  o5 E4 d) u! R6 \
        {/ n& i3 G  J# j7 k
          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>
    ( L( }0 [% N( [<FONT size=3>    }. ]0 N5 M4 ^  u- [# Z) e
        p=s;q=t;) n/ n% [% f$ [
      }//while) I, l' n% K# u) F! w) T0 J* s* q
    }//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>3 _. A. e* i' \4 M) X+ k
    <FONT size=3>{! M  E+ j, p0 ^0 }( U0 Z6 g
      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>% |# R" Z/ R) z* z
    <FONT size=3>  while(pa||pb)( M" A4 E, W6 t, t& p+ v
      {
    " d$ [6 s, z# c# Z: Y  B    if(pa-&gt;data&lt;pb-&gt;data||!pb)0 j& b( E8 g8 C0 J& n# o! N
        {7 W: Q! v; b# Y; Z3 D5 G5 e: R
          pc=pa;q=pa-&gt;next;pa-&gt;next=pre;pa=q; //</FONT><FONT size=3><FONT face=宋体>将</FONT>A<FONT face=宋体>的元素插入新表</FONT></FONT>
    " {. p, e5 N$ ^% X4 M' s<FONT size=3>    }' C& C: g  o) `- j7 o* N
        else6 o3 ?: Q1 N' k( i( X# i
        {
    ) W: A% |( u: Q  y  b' c! O      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 z/ ~& y$ s  P6 }
    <FONT size=3>    }
    7 q( V/ @. q" Z* w    pre=pc;' u% E/ }) |) _  {) S
      }
    ! Y, }' Q. l1 N2 G* D* J" l  C=A;A-&gt;next=pc; //</FONT><FONT face=宋体 size=3>构造新表头</FONT>
      s/ V# _6 c& p% s) b<FONT size=3>}//reverse_merge
    * k( ^* c9 k+ G! R" L; Q5 ^& E3 C</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>
    : W. c7 X/ R0 K  i; \9 o<FONT size=3>{# i3 N4 X' U# l9 V  P* e
      i=1;j=1;k=0;
    # w0 U! w1 y0 ?0 H+ L# I* E  while(A.elem&amp;&amp;B.elem[j])2 r- \# F2 x" L& T
      {
    - }* v8 T! B: _2 n    if(A.elem&lt;B.elem[j]) i++;, W- N+ l7 F( m% r/ Y' w# J
        if(A.elem&gt;B.elem[j]) j++;' M# R5 [3 @6 l0 }  o
        if(A.elem==B.elem[j])/ v, X* x) M' j* X& q$ G$ B
        {
    4 n/ k, X8 Z: x# X1 m2 H0 H      C.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT><FONT size=3>,! F0 T% r4 t1 |2 D3 E
          i++;j++; //<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>2 T% ?% D+ c; s- I& R- i5 g! t6 E+ ^! }
    <FONT size=3>    }
    3 V2 K& L! O( }4 E7 {  }//while: n3 e6 k+ I7 p
    }//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>, p4 x7 H$ R5 f5 D+ A. B. b
    <FONT size=3>{+ ^) v9 A. `( V! i. t$ Z% m
      p=A-&gt;next;q=B-&gt;next;. }) W8 o  f9 D7 v
      pc=(LNode*)malloc(sizeof(LNode));" F7 R! c9 H) X7 e: a6 B+ o* _' x3 [
      while(p&amp;&amp;q)
    2 z: u' v! s" q* X- [& F( Z( F  {% T, a1 w" C; j3 [9 h
        if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;: Z- D- d) ~0 I' M. `8 v1 i- a: f- k
        else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;# P' m: h$ m; |# K2 L+ U
        else
    ! y% J5 r) f+ O3 {% N6 p) V    {6 W! H( o- \' m: b1 k; U4 Z3 k
          s=(LNode*)malloc(sizeof(LNode));1 p& H- G: p  `/ m$ A0 k3 u3 E
          s-&gt;data=p-&gt;data;
    % c, Z* @0 V. ^0 ~      pc-&gt;next=s;pc=s;) k/ d, ]% j) E8 B/ e! t8 }
          p=p-&gt;next;q=q-&gt;next;
    5 q/ ^8 ]& e. j6 P    }5 F3 J6 @4 @6 c: H+ ], B
      }//while
    & s' g; S- b$ N0 }, r  C=pc;0 B. Y2 e' J( ~- W4 D) O9 n
    }//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>+ S) R5 w$ L( x5 {' k: [% G: Y
    <FONT size=3>{' ?/ p+ H% H- x: O3 R$ F8 I" N% h
      i=1;j=1;k=0;
    : Q2 q# J( d4 s, S" ^  while(A.elem&amp;&amp;B.elem[j])
    9 J9 D( x) x* U9 M/ G1 k- _  {
    7 T. G1 a  B- l, i    if(A.elem&lt;B.elem[j]) i++;9 D* I4 r6 y+ p6 c' `6 [
        else if(A.elem&gt;B.elem[j]) j++;
    / x( U: Z3 q0 ]& \    else if(A.elem!=A.elem[k])
    5 {$ |2 h: A8 u) _9 P* Q6 F2 e    {' \' {/ d8 q1 E/ _8 t) x6 ~
          A.elem[++k]=A.elem; //</FONT><FONT size=3><FONT face=宋体>当发现了一个在</FONT>A,B<FONT face=宋体>中都存在的元素</FONT></FONT>
    7 Z# R5 e4 P, w7 q$ W9 [3 w<FONT size=3>      i++;j++; //</FONT><FONT size=3><FONT face=宋体>且</FONT>C<FONT face=宋体>中没有</FONT>,<FONT face=宋体>就添加到</FONT>C<FONT face=宋体>中</FONT></FONT>9 Y: z! t9 y6 `1 s* h5 b
    <FONT size=3>    }% O1 y) z: v5 z" @3 k7 g$ c. c
      }//while
    ) q: B1 i: E& c+ ^# d2 O  while(A.elem[k]) A.elem[k++]=0;
    0 n* s* N& Q# O# {+ j( ^}//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 h# o0 i8 ~* n4 {7 f! e<FONT size=3>{7 i) Q9 n/ k& K
      p=A-&gt;next;q=B-&gt;next;pc=A;
      B; b- K, U# E2 |, I+ z; Y  while(p&amp;&amp;q)
    : r( a5 h* ^) g; s  {
    9 o1 c+ e4 u7 {; s; y/ w    if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;" R- R0 f; c4 i$ u  o, S
        else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;9 H8 Y5 E; m# q' b: H8 k: R3 i
        else if(p-&gt;data!=pc-&gt;data)! j' |# v" e& ~) Y3 Z% O
        {
    4 l+ \) H$ M8 c7 [2 K: X- ~) S      pc=pc-&gt;next;
    5 m) B$ x7 T6 K/ e      pc-&gt;data=p-&gt;data;
    4 L3 B# h6 ^4 m6 F# Y      p=p-&gt;next;q=q-&gt;next;! c& U1 ^. B, T' ?
        }" k& H7 n8 \7 e8 K$ ]
      }//while1 H  a3 R9 d$ d, V
    }//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)
    + P5 a8 ^# M0 E* m{. E! Y0 O: Q( t; l$ B; C+ T6 ]2 f, {
      i=0;j=0;k=0;m=0;    //i<FONT face=宋体>指示</FONT>A<FONT face=宋体>中元素原来的位置</FONT>,m<FONT face=宋体>为移动后的位置</FONT></FONT>1 P: m* ~$ C4 \3 E
    <FONT size=3>  while(i&lt;A.length&amp;&amp;j&lt;B.length&amp;&amp; k&lt;C.length)
    " [1 x0 |  O+ w; r9 ?  {8 ?8 Y% P+ n6 |2 }$ M; l
        if(B.elem[j]&lt;C.elem[k]) j++;
    9 b' _) p3 @5 W) ]    else if(B.elem[j]&gt;C.elem[k]) k++;
    3 k/ M' Q5 H7 |, C    else# R- |% \6 w$ ?$ U$ O
        {
    6 V' `+ ]) Z& ~/ |. @& m, W      same=B.elem[j];                   //</FONT><FONT face=宋体 size=3>找到了相同元素</FONT><FONT size=3>same& B9 L" \- v  `$ r/ z% j6 ^* k
          while(B.elem[j]==same) j++;( I, a2 D" w3 J+ ~
          while(C.elem[k]==same) k++;     //j,k<FONT face=宋体>后移到新的元素</FONT></FONT>
    3 a. R# k; |6 m! R( o% D/ K( N<FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem&lt;same)
    ( M5 S  _! r/ F8 u* I% u, \5 [5 n2 x- A        A.elem[m++]=A.elem[i++];            //</FONT><FONT face=宋体 size=3>需保留的元素移动到新位置</FONT>: B. Q9 F+ S8 K$ Q( j9 T- Q3 m- I
    <FONT size=3>      while(i&lt;A.length&amp;&amp;A.elem==same) i++;       //</FONT><FONT face=宋体 size=3>跳过相同的元素</FONT>; c% N  X& x& a4 @5 T% {
    <FONT size=3>    }
    9 f  T0 k8 J& ?' K' i' ?+ i  }//while) E! g5 o! d- F; N0 ]! j! G6 Q8 M' `/ N
      while(i&lt;A.length)
    % @1 x4 D' d1 Y! C- X8 ]    A.elem[m++]=A.elem[i++];      //A</FONT><FONT face=宋体 size=3>的剩余元素重新存储。</FONT>! ~* b4 {0 J4 i. \. _
    <FONT size=3>  A.length=m; 4 t7 s6 _* S; r! d9 K
    }// SqList_Intersect_Delete
    ! ~" y( R( \* D+ B</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>0 o: T( R8 ]4 Z7 m' Q8 t) X" |
    <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>
    0 z8 N/ K+ x1 g  y<FONT size=3>{
    # F; B; O- B! ]  p=B-&gt;next;q=C-&gt;next;r=A-next;
    9 q9 i: Q: C3 V  while(p&amp;&amp;q&amp;&amp;r)
    9 j7 _$ [, ]* I2 k9 d  F, ]4 ^8 b2 r  {
    9 ?$ ~2 P7 Z. }; t8 a" d7 u/ o    if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;( k0 r5 H; r- y2 u* B: M, l
        else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;8 b" p+ \5 h  r3 E' \8 E+ Y
        else
    / X; E& H8 f0 ~8 v2 q    {
    , L" `/ a, x8 [4 C3 O      u=p-&gt;data; //</FONT><FONT face=宋体 size=3>确定待删除元素</FONT><FONT size=3>u
    2 e9 `: Z" _& O" Z      while(r-&gt;next-&gt;data&lt;u) r=r-&gt;next; //<FONT face=宋体>确定最后一个小于</FONT>u<FONT face=宋体>的元素指针</FONT></FONT><FONT size=3>r7 k- l2 o) a  ^0 f& S
          if(r-&gt;next-&gt;data==u)5 `) o8 L! _; a" G$ |7 _9 t
          {
    2 c4 @' H; L+ l0 j$ |6 o        s=r-&gt;next;& O) N! t: F0 k! T" Y1 U5 @
            while(s-&gt;data==u)
    " c; [- z/ U: H6 v/ l        {
      h8 _0 l) T( m' G6 Q% E          t=s;s=s-&gt;next;free(t); //<FONT face=宋体>确定第一个大于</FONT>u<FONT face=宋体>的元素指针</FONT></FONT><FONT size=3>s, X# o4 @# |# Z4 _
            }//while
    7 [0 Z/ i/ i  d- T! ~  f        r-&gt;next=s; //<FONT face=宋体>删除</FONT>r<FONT face=宋体>和</FONT>s<FONT face=宋体>之间的元素</FONT></FONT>+ C" d: R5 x2 y/ F! k
    <FONT size=3>      }//if+ u2 a$ A9 G  C7 ], y/ x. N) t% O
          while(p-&gt;data=u) p=p-&gt;next;
    * y( p/ x( N% M% m      while(q-&gt;data=u) q=q-&gt;next;
    6 U! _; q2 l- d8 y( j6 k    }//else4 S+ C2 j* I  d
      }//while
    3 l# O5 g% i# a/ n! [}//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>
    $ p" v( W2 K0 C' U: I<FONT size=3>{) w: v* k5 |5 ~: L: L8 I1 J
      p=s;
    * O7 L: v: n' w# n. |; a* o' ?  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>p0 T: N( |  z+ B( ~) ?% N
      p-&gt;next=s;
    4 L$ y) p  t# X: ]* O% Y& p  return OK;+ O# _2 |( ?4 U) {+ q0 f
    }//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>' N7 R- F% x2 f" P$ M4 v5 h
    <FONT size=3>{
    5 t; C" _. P: D) K  for(p=L;!p-&gt;next-&gt;pre;p=p-&gt;next) p-&gt;next-&gt;pre=p;4 P9 Y5 d. U! I& a
      return OK;
    1 \4 R4 X; K7 o: ], i}//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>.3 H9 s7 G, Q- j
    {  w+ c" Z7 i+ z+ W' E
      s=L-&gt;next;9 z5 D5 t  |' ]! y. u' [  `
      A=(CiList*)malloc(sizeof(CiLNode));p=A;1 k* P- ~1 P8 m7 f
      B=(CiList*)malloc(sizeof(CiLNode));q=B;5 z3 Q6 F$ A* e$ c6 p0 }* x2 x$ t
      C=(CiList*)malloc(sizeof(CiLNode));r=C; //<FONT face=宋体>建立头结点</FONT></FONT>
    / F. B) x4 J9 q  E/ t/ Y& N<FONT size=3>  while(s)# A$ `" Y0 y; u% ?/ _4 u* d
      {
    ) j4 G0 R5 `+ m8 V    if(isalphabet(s-&gt;data))
    6 R' [0 y6 B  c; W: g) e4 U" u    {9 Z, C& i7 J$ N* T$ U; G
          p-&gt;next=s;p=s;
    ( `8 r% F+ Z- ~$ F, O+ e    }
    % Z7 J$ q) C* _/ i5 R8 J    else if(isdigit(s-&gt;data))
    , l) b2 A# n# G7 O* I5 f' T    {% Y* Z4 `6 \# P# m  I
          q-&gt;next=s;q=s;
    ( C4 _8 S0 ?' }9 d  I2 @    }
    ; j$ ^* M3 r) M5 R+ _+ m- V    else1 C# L7 L  j2 E3 |7 s1 Q$ ~( Z. z
        {  }" B5 y: H% H( p9 \6 b
          r-&gt;next=s;r=s;
    , F' [7 f# C6 A2 @! k    }/ W5 T/ g, z8 U9 R: @
      }//while+ L7 V+ w. I, J! z8 G
      p-&gt;next=A;q-&gt;next=B;r-&gt;next=C; //</FONT><FONT face=宋体 size=3>完成循环链表</FONT>/ B1 D% z$ d! M" h' O3 |7 G
    <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># q& O+ v- L. |* I" t
    <FONT size=3>{
    2 L8 b" }1 M# O9 U  p=L.left;pre=NULL;1 \% T4 x) W: p% ]/ {
      while(p)" ?" D3 J/ \, d. k8 c" Z5 D8 K
      {+ c" J* Y" x) U: x3 s9 {2 g
        printf("%d",p-&gt;data);, G4 z. ^9 f' u: X
        q=XorP(p-&gt;LRPtr,pre);: M8 B, s; s$ N+ {
        pre=p;p=q; //</FONT><FONT size=3><FONT face=宋体>任何一个结点的</FONT>LRPtr<FONT face=宋体>域值与其左结点指针进行异或运算即得到其右结点指针</FONT></FONT>
    ; Q2 w! p7 h/ Q. ]5 z; {$ {( F$ j: y<FONT size=3>  }
    : |$ J7 B, c; r- o, i& W}//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
    # Z: X* r* C& V7 @% r{6 {! L0 O' e, D/ w
      p=L.left;pre=NULL;/ m& z8 W, ^9 S8 Z9 `# ~
      r=(XorNode*)malloc(sizeof(XorNode));
    9 F, ]" n  |; n7 _2 M  r-&gt;data=x;- F* O, @+ t# C% B& u, `
      if(i==1) //<FONT face=宋体>当插入点在最左边的情况</FONT></FONT>
    % ]7 C7 }. p' Q& \4 T# U( X# C* ?<FONT size=3>  {- [; k3 E" {! r8 W, H
        p-&gt;LRPtr=XorP(p.LRPtr,r);
    ! B4 L& l# ~6 r    r-&gt;LRPtr=p;
    9 I4 p5 ?' B/ B! R2 a( {( D; B    L.left=r;7 D3 K) `, x  p$ v1 P
        return OK;
    2 x! x9 f( C7 I: \' p  }9 J( H! K4 y- e" [
      j=1;q=p-&gt;LRPtr; //</FONT><FONT face=宋体 size=3>当插入点在中间的情况</FONT>, A3 C. |1 ]4 ^
    <FONT size=3>  while(++j&lt;i&amp;&amp;q)% V9 K/ y) N+ r/ ?/ a; \
      {( M1 {; Q; C0 j
        q=XorP(p-&gt;LRPtr,pre);/ ]# G, w- Y% j* N+ Q1 P
        pre=p;p=q;; n, M  U2 Z- }/ ?0 H6 y# Z' `
      }//while //</FONT><FONT size=3><FONT face=宋体>在</FONT>p,q<FONT face=宋体>两结点之间插入</FONT></FONT>9 U4 k* f2 E! {* D' ^
    <FONT size=3>  if(!q) return INFEASIBLE; //i</FONT><FONT face=宋体 size=3>不可以超过表长</FONT>
      k: f+ }) h- I; _" N0 ]7 |0 Q<FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);/ R2 l2 L  h# ^4 F. W
      q-&gt;LRPtr=XorP(XorP(q-&gt;LRPtr,p),r);
    # Q. B$ L% C% ~( t$ l+ d5 H  r-&gt;LRPtr=XorP(p,q); //</FONT><FONT face=宋体 size=3>修改指针</FONT>
    ' ~- Q6 Z0 h* W/ z' c8 q<FONT size=3>  return OK;6 `0 `0 e5 y* 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>+ t4 S6 `: U2 x8 l2 W* c4 M
    <FONT size=3>{
    1 M$ a: n; [, w9 F  p=L.left;pre=NULL;
    4 d" T$ v- [4 a. ?: P6 R  ?4 ~! }  if(i==1) //</FONT><FONT face=宋体 size=3>删除最左结点的情况</FONT>2 ]* B; j; o" F5 W
    <FONT size=3>  {
    ! P! U; \4 K; u, i    q=p-&gt;LRPtr;7 l7 t6 c: {) o% K6 k# W# W
        q-&gt;LRPtr=XorP(q-&gt;LRPtr,p);
    1 m7 K( z+ F7 S9 C8 o- B    L.left=q;free(p);& F# o! k( c9 @8 L7 J; G
        return OK;
    # W- K8 j! p" V6 E! O; ?  }4 m' y, @/ y6 u( ]
      j=1;q=p-&gt;LRPtr;0 y- R$ g4 X8 u: f) H- J6 A
      while(++j&lt;i&amp;&amp;q)
    9 ^, l- N" u6 y1 l2 S7 t9 U. |# P  {
    6 J& [$ m$ J  B& D- _8 I7 U. R    q=XorP(p-&gt;LRPtr,pre);; B8 O" F$ [! M: n3 L
        pre=p;p=q;
    4 x6 R3 o# u! i6 L3 g6 c# D  }//while //</FONT><FONT face=宋体 size=3>找到待删结点</FONT><FONT size=3>q" h# ~3 W/ E5 k9 a$ R' d  ~/ g7 l% Q
      if(!q) return INFEASIBLE; //i<FONT face=宋体>不可以超过表长</FONT></FONT>' ~/ X. ?3 ]) b# S) D# Y% _$ y4 I
    <FONT size=3>  if(L.right==q) //q</FONT><FONT face=宋体 size=3>为最右结点的情况</FONT>
    ( k" N2 U: k& L: k6 u$ U: F: c<FONT size=3>  {! u" \) d) P, {  h& j" P8 ?
        p-&gt;LRPtr=XorP(p-&gt;LRPtr,q);
    $ n+ h2 J2 K' v5 n& P$ k1 e    L.right=p;free(q);
    4 }9 {5 h5 b7 M$ \% w    return OK;
    ( s# o- U6 [( J, Q  }
    " z" J" I! l' h9 m  r=XorP(q-&gt;LRPtr,p); //q</FONT><FONT size=3><FONT face=宋体>为中间结点的情况</FONT>,<FONT face=宋体>此时</FONT>p,r<FONT face=宋体>分别为其左右结点</FONT></FONT>; P" n* L3 e& {
    <FONT size=3>  p-&gt;LRPtr=XorP(XorP(p-&gt;LRPtr,q),r);
    3 Q4 T+ g; B7 D( b6 c, o( P  r-&gt;LRPtr=XorP(XorP(r-&gt;LRPtr,q),p); //</FONT><FONT face=宋体 size=3>修改指针</FONT>
    0 n- ?7 `& h  d<FONT size=3>  free(q);
    , J8 W3 I% {2 U& r4 c  return OK;% a$ C1 H! n3 O  Z4 G' j" s3 f
    }//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>
    , x( G& t* r  |0 f<FONT size=3>{
    % r( y$ R, R8 h/ d2 N  p=L.next;
    2 U8 K& \+ d+ I, ?  while(p-&gt;next!=L&amp;&amp;p-&gt;next-&gt;next!=L)  u1 X$ ~& a1 i  `0 W. W* n
      {; y' m. ~8 T; E1 V$ o
        p-&gt;next=p-&gt;next-&gt;next;0 h9 k4 J0 G4 [3 a
        p=p-&gt;next;/ [! P5 K! v" I3 s, @0 a* l+ U
      } //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个奇数结点</FONT></FONT>) r4 a% p, x5 E
    <FONT size=3>  if(p-&gt;next==L) p-&gt;next=L-&gt;pre-&gt;pre;
    ' O  S3 i" I# f9 ^2 V  else p-&gt;next=l-&gt;pre;& _5 N5 V$ m1 M, o* O7 [
      p=p-&gt;next; //</FONT><FONT size=3><FONT face=宋体>此时</FONT>p<FONT face=宋体>指向最后一个偶数结点</FONT></FONT>; j4 m) [6 B2 C* J
    <FONT size=3>  while(p-&gt;pre-&gt;pre!=L)( G/ d" Q! x  y9 a
      {- f) f: i2 h- H$ j' y4 i
        p-&gt;next=p-&gt;pre-&gt;pre;
    - t) a8 X( v4 S/ U2 D  l7 Q    p=p-&gt;next;$ U9 r$ C0 X2 J! `! f% M" p
      }! e) N3 G! O( e- R' B
      p-&gt;next=L; //</FONT><FONT size=3><FONT face=宋体>按题目要求调整了</FONT>next<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>此时</FONT>pre<FONT face=宋体>链仍为原状</FONT></FONT>
    9 K' [9 m- K0 s4 p7 F<FONT size=3>  for(p=L;p-&gt;next!=L;p=p-&gt;next) p-&gt;next-&gt;pre=p;
    : k2 p% N6 @: \! \$ S  L-&gt;pre=p; //</FONT><FONT size=3><FONT face=宋体>调整</FONT>pre<FONT face=宋体>链的结构</FONT>,<FONT face=宋体>同</FONT>2.32<FONT face=宋体>方法</FONT></FONT>
    ) @9 s9 H2 S$ B; [- _1 W/ d<FONT size=3>}//OEReform2 T0 p. N6 [' I0 {) `/ d
    </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>  ~4 R9 E+ U5 z* _+ R  K
    <FONT size=3>{' q  x# C0 R  t2 F) |
      p=L.next;
    - D8 n4 d; a) h" ?7 x  while(p.data!=x&amp;&amp;p!=L) p=p-&gt;next;9 J: \# k& b* H/ m2 ?1 A
      if(p==L) return NULL; //</FONT><FONT face=宋体 size=3>没找到</FONT>3 q) y/ q" S/ G% c2 C0 X: y
    <FONT size=3>  p-&gt;freq++;q=p-&gt;pre;
    " l+ [6 n( g7 ~. x- K  while(q-&gt;freq&lt;=p-&gt;freq) q=q-&gt;pre; //</FONT><FONT face=宋体 size=3>查找插入位置</FONT>
    2 H9 l+ y; H1 n# C/ F<FONT size=3>  if(q!=p-&gt;pre)4 {& l, w5 J0 f0 b9 M
      {
    5 N- _; O7 Z* ^! _    p-&gt;pre-&gt;next=p-&gt;next;p-&gt;next-&gt;pre=p-&gt;pre;8 O0 p2 F/ ?9 T: y
        q-&gt;next-&gt;pre=p;p-&gt;next=q-&gt;next;
    : i" {9 e% G, X" ^    q-&gt;next=p;p-&gt;pre=q; //</FONT><FONT face=宋体 size=3>调整位置</FONT>
    4 M% S) v; E: I( l& F0 {9 Q<FONT size=3>  }! m, J- T# @2 D
      return p;
    5 N7 q; l6 C! r0 F, e' J}//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>
    3 \4 R9 G; M2 l0 G<FONT size=3>{
    - t" q& |& @' b, H  g  PolyTerm *q;+ ?0 d7 O+ {5 O2 B( q
      xp=1;q=P.data;7 c/ u/ \/ }% H& z. e( a% h! w1 _7 A
      sum=0;ex=0;
    ' |* Q& o5 X' m" c1 N1 T5 a  while(q-&gt;coef)
    ; ]0 O2 b) D/ U* E( u7 ?- @  {
      A8 l$ R: E' j$ u    while(ex&lt;q-&gt;exp) xp*=x0;  Q3 C& }5 f0 X9 d- W
        sum+=q-&gt;coef*xp;
    ) C" C, E9 e  f    q++;* E$ T1 }. ]$ s7 G! [' W6 T
      }
    - _6 T, D- Q+ U! ~5 @/ _; r# {4 {. J9 @  return sum;5 I5 U5 h3 n, C. V+ M
    }//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
    : `/ k: V5 [2 C7 W! |5 {{" \& x) P9 F0 D& l
      PolyTerm *p,*q,*r;
    : n! q0 [" l7 [1 \6 P  Create_SqPoly(P3); //<FONT face=宋体>建立空多项式</FONT></FONT><FONT size=3>P38 N' |. \/ \, e9 ?$ u4 ^" r
      p=P1.data;q=P2.data;r=P3.data;, P" p( ^$ R8 ]3 d/ o3 q; v, s& G
      while(p-&gt;coef&amp;&amp;q-&gt;coef)
    ( {& x' o0 u7 c+ y! v' X7 `  {
    1 g: N$ b& I2 E/ Z+ O9 L* ]. Q    if(p-&gt;exp&lt;q-&gt;exp)
    9 Y- g5 f: j. e4 I$ b9 P4 J* a    {
      Z8 r. b/ W% ]2 s      r-&gt;coef=p-&gt;coef;" h: C( H& R" z
          r-&gt;exp=p-&gt;exp;' H6 j; q6 v9 r
          p++;r++;" c$ I, z+ D% [* v  S4 b! F) i4 |* e
        }$ I1 L& O3 G$ S" N. t" S
        else if(p-&gt;exp&lt;q-&gt;exp)
    9 m! h! q0 U& ?4 W' U    {
    + u- {) I1 G& O! u      r-&gt;coef=-q-&gt;coef;
    6 W( \9 y; d. K9 S4 N      r-&gt;exp=q-&gt;exp;
    : W5 n3 p0 F) W5 o      q++;r++;
      k/ N. s7 n- I6 t  j3 \! n/ B    }; w. F0 F8 m0 P7 E% Y: _0 R
        else% T) }1 }8 W8 h. R( D
        {7 Z' M& y" k$ K; P6 c& s6 m
          if((p-&gt;coef-q-&gt;coef)!=0) //<FONT face=宋体>只有同次项相减不为零时才需要存入</FONT>P3<FONT face=宋体>中</FONT></FONT>
    - N* }# m! |7 W: [1 l- G& ]) W# u: X<FONT size=3>      {! b/ R. O- C1 C. _% u. j
            r-&gt;coef=p-&gt;coef-q-&gt;coef;4 n  M0 a, A: O% h( V" T$ ?
            r-&gt;exp=p-&gt;exp;r++;/ a. n1 U7 v4 Y6 K% x+ g) I
          }//if
    ) `+ T0 h3 ~. o# t# i  ]& r6 h9 d      p++;q++;2 \8 Q- ?/ p3 X: K9 R+ r8 y
        }//else
    # U* [% i0 I9 F: q; ~( S  }//while# C% n# l7 _% ?1 J
      while(p-&gt;coef) //</FONT><FONT size=3><FONT face=宋体>处理</FONT>P1<FONT face=宋体>或</FONT>P2<FONT face=宋体>的剩余项</FONT></FONT>& g, M' Y, r$ v
    <FONT size=3>  {. P  J1 i1 A9 P4 D) t
        r-&gt;coef=p-&gt;coef;
    6 |* ^: m  `0 k$ T    r-&gt;exp=p-&gt;exp;
    ( X9 O( ^# Y, U7 Y- K    p++;r++;
    . ^- e8 ~! m+ l8 ?" p  o  }- [. m$ R3 n9 L- s- P' U3 k
      while(q-&gt;coef)
    ( I& l& h& D5 {" H1 L! s  _$ f  {
    + U. p6 c: s2 K    r-&gt;coef=-q-&gt;coef;, W3 A' O, J. e
        r-&gt;exp=q-&gt;exp;2 {# u0 A4 e# ~
        q++;r++;
    , C! o. I7 A2 i7 a' u  }
    9 U* Z0 I# ^' V}//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>+ K! A" n* i4 z
    <FONT size=3>{7 a' \  q" p2 ]+ r+ K
      p=L-&gt;next;
    ! `4 a* K* F- H) a  if(!p-&gt;data.exp)" W3 E- b  L- Z+ G
      {
    . I* ~5 b) W0 m' c5 _( q    L-&gt;next=p-&gt;next;p=p-&gt;next; //</FONT><FONT face=宋体 size=3>跳过常数项</FONT>  t' a: N% x" x1 q6 B" g$ q. W- Q
    <FONT size=3>  }
    ; r8 o7 X; a0 }8 G0 ?3 F/ h6 l, M  while(p!=L), V. V! Q* h# p2 X, L2 c
      {
    % [- M  w- N% @* U$ W    p-&gt;data.coef*=p-&gt;data.exp--;//</FONT><FONT face=宋体 size=3>对每一项求导</FONT>; N$ d6 L* ^$ x) n! _8 U
    <FONT size=3>    p=p-&gt;next;- N9 g+ I8 R! B6 h, I3 z
      }9 R9 z2 w5 s/ o3 t2 B3 Y) `
    }//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
    6 Q! e3 d' l. [2 u1 D1 t{
    # ~# g5 c- e, s& ~  p=L-&gt;next;% R" ]; A8 e2 Z+ k* r
      A=(PolyNode*)malloc(sizeof(PolyNode));
    * R( N; j; C. @  B=(PolyNode*)malloc(sizeof(PolyNode));
    + y9 M" k1 P. |# |  pa=A;pb=B;
    % [3 H, }& M" J) x  while(p!=L)( j8 y8 b4 ~  U
      {5 l0 H$ U6 \! \: ]3 i
        if(p-&gt;data.exp!=2*(p-&gt;data.exp/2))% K* m9 k2 N) L* Q9 q+ o! S
        {& ]# j/ o4 T* i' y. w
          pa-&gt;next=p;pa=p;  }0 n* O& `6 q
        }  T. G/ }$ R! t/ h+ `
        else: h* p" o2 L/ s8 e2 W) o, p
        {
    / D$ w1 ~( w% z2 u0 Q' {. q$ j      pb-&gt;next=p;pb=p;
    ) d9 L7 h& a3 U" g: M# D% H- d5 W    }2 T/ G0 N* C. g, A& ?
        p=p-&gt;next;
    3 U# m2 `4 W7 D; X+ a! o  }//while
    # n% C& ?: Q/ a/ ^( A$ u6 T6 |  pa-&gt;next=A;pb-&gt;next=B; 5 s; Z( H' ^3 A
    }//Divide_LinkedPoly<p></p></FONT></P>
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-18 14:43 , Processed in 0.475681 second(s), 69 queries .

    回顶部