数学建模社区-数学中国

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

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