QQ登录

只需要一步,快速开始

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

    回顶部