数学建模社区-数学中国

标题: 《数据结构(c语言版)习题集》算法设计解决方案 [打印本页]

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




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5