数学建模社区-数学中国

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

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