QQ登录

只需要一步,快速开始

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

    回顶部