当前位置:首页 >> 数学 >>

数据结构习题答案

第一章 绪论
1.16 g(int x,int y,int z)// { ("%d,%d,%d",&x,&y,&z); if(x<y) x<->y; //<-> ? if(y<z) y<->z; if(x<y) x<->y; //冒泡排 f("%d %d %d",x,y,z); g 1.17 s fib(int k,int m,int &f)//求 k { ; ; if(m<k-1) f=0; else if (m==k-1) f=1; else { for(i=0;i<=k-2;i++) temp[i]=0; temp[k-1]=1; //初始化 for(i=k;i<=m;i++) //求 第? k至第 m 个元素 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } n OK; }//fib 分析: ? ? 结果, ? ?归 编程( 数 ? ? 归 ), 1.18 t{ ; ; //校名 t; ; ; r; 'A','B','C','D'或'E' ? ? 第m ?f ?符 ,以下同 ? ?个 数

? O(m^2). 果 ? 将高达 O ? (k^m).

t{ int m type; t[ ])//求 在r ? { ; i=0; t[i].spor !=NULL) { ) { case 'A': ; ; t[i].sc ; case 'B': ; ; ; ; …… } i++; …… …… ; [ ]数组中 校 ? 分 ? 体 分, 结果 ? 储 core; e; ;

} for(i=0;i<5;i++) { l %d:\n",i); core); e); [i].tot } ry 1.19 ZE])//求 i!*2^i { last=1; ZE;i++) { a[i-1]=last*2*i; last=a[i-1]; n OK; LOW; 且不超 m ? );

} 19 分析:当某一 1.20 void polyv ? alue() { float ? ad; float ? *p=a; print ? f("Input ? numbe ? r of terms ? :"); scanf ? ("%d",&n); print ? f("Input ? the %d coeff ? icien ? ts from a0 to a%d:\n",n,n); for(i=0;i<=n;i++) scanf ? ("%f",p++); print ? f("Input ? value ? of x:"); scanf ? ("%f",&x); p=a;xp=1;sum=0; //xp ? 放x i ? for(i=0;i<=n;i++) { sum+=xp*(*p++); xp*=x; } print ? f("Value ? is:%f",sum); }//polyv ? alue 结果超 ? ? t , 以 一 ? ?发 生 异常.

第二章 线性
2.10 t &a,int i,int k)// { h-=k; n OK; eK 2.11 t &va,int x)//把 x { ; h++; h-1;va.elem[i]>x&&i>=0;i--) va.elem[i+1]=va.elem[i]; va.elem[i+1]=x; ?增 有 ? a中 v ++) // +k-1]; ; 结? 束 条件 线性 ? a 中第 i 个元素起 k ? 个 元素

n OK; ist 2.12 t B)// A<B; 零, 符 ? A B, A=B ? 结果, 正,

A>B; {

负,

for(i=1;A.elem[i]||B.elem[i];i++) n A.elem[i]-B.elem[i]; n 0; omp 2.13 ist L,int x)// { for(p=l->next;p&&p->data!=x;p=p->next); n p; e 2.14 ist L)//求 { for(k=0,p=L;p->next;p=p->next,k++); n k; h 2.15 ist &hc)//把 ?h c { hc=ha;p=ha; (p->next) p=p->next; p->next=hb; 2.16 ?. 2.17 ist &L,int i,int b)//在 ?b { )); 结 ? L 第? i个元素之 元素 hb ? 接在 ha ? ? 元? 素 查找, 指针

q.data=b; if(i==1) { q.next=p;L=q; // 在 ? 部 } else { (--i>1) p=p->next; q->next=p->next;p->next=q; // 在第 i ?个元素 } t 2.18 ist &L,int i)//在 { if(i==1) L=L->next; // 第一个? 元 素 else { p=L; (--i>1) p=p->next; p->next=p->next->next; // 第 i 个? 元 素 } e 2.19 ist &L,int mink,int maxk)// ma ? xk 所有元素 结 ? L中

?置

? 第 i 个元? 素

元素

增排 ?

?

L

中 ? mink ? 且 { p=L; (p->next->data<=mink) p=p->next; //p 是最 一个不 if(p->next) // 果 有 ? m ink 更 元素 { q=p->next; (q->data<maxk) q=q->next; //q 是第一个不 ma ? xk p->next=q; } ween 2.20 ist &L)// 素 { p=L->next;q=p->next; //p,q 指向 (p->next) { 元素 增排 ? ?

m ? ink

元素

元素

L中所有?



元?

邻两元素

if(p->data!=q->data) { p=p->next;q=p->next; //当 邻两元? 素不 } else { (q->data==p->data) { free(q); q=q->next; } p->next=q;p=q;q=p->next; //当 邻元素? }//else }//w al 2.21 t &A)// { h;i<j;i++,j--) A.elem[i]<->A.elem[j]; se 2.22 ist &L)// { p=L->next;q=p->next;s=q->next;p->next=NULL; (s->next) { q->next=p;p=q; q=s;s=s->next; //把 L 元素? 个 ? } q->next=p;s->next=q;L->next=s; e 分析: ? 是, 个地把 L ? 当 元素? q 2.23 ?地 逆置

?,p,q



推一步

? 余元素

地? 逆置;



?,

?

2

部,p

.

ist &C)//把 B 元素 排 ?, 且 ?储 空 { p=A->next;q=B->next;C=A; (p&&q) { s=p->next;p->next=q; //将 B 元素? if(s) {

A

? B合

,A

t=q->next;q->next=s; // } p=s;q=t; 1 2.24

A 非空,将 A

元素?

?A {

B合

ist &A C,且 C 中元素? 减排 ,

ist &C)//把元素 空 ?

增? 排

pa=A->next;pb=B->next;pre=NULL; //pa 分别指向 A ? ,B 当 元素 (pa||pb) { if(pa->data<pb->data||!pb) { pc=pa;q=pa->next;pa->next=pre;pa=q; //将 A 元素? } else { pc=pb;q=pb->next;pb->next=pre;pb=q; //将 B 元素? } pre=pc; } C=A;A->next=pc; // ? rge 分析: ? 是, ? ? 把A B ? 元素 ? ? c 处,最 处理 A p ? 或B 余? 元 素. 2.25 t &C)//求元素 B { i=1;j=1;k=0; (A.elem[i]&&B.elem[j]) { if(A.elem[i]<B.elem[j]) i++; if(A.elem[i]>B.elem[j]) j++; if(A.elem[i]==B.elem[j]) { C.elem[++k]=A.elem[i]; //当发 i++;j++; // 添加 C ? 中 } t 2.26 元素 ? ? C 中? 增? 排 线性?



A

一? 个 在 A,B 中



元素,

ist &C)//在 ? { p=A->next;q=B->next; )); (p&&q) { if(p->data<q->data) p=p->next; else if(p->data>q->data) q=q->next; else { )); s->data=p->data; pc->next=s;pc=s; p=p->next;q=q->next; } C=pc; ect 2.27 e(Sq A 中? t B)//求元素 增? 排



?

线性?

A

B

元素 ? {

?

i=1;j=1;k=0; (A.elem[i]&&B.elem[j]) { if(A.elem[i]<B.elem[j]) i++; else if(A.elem[i]>B.elem[j]) j++; else if(A.elem[i]!=A.elem[k]) { A.elem[++k]=A.elem[i]; //当发 i++;j++; //且 C 中 有?, 添加 } (A.elem[k]) A.elem[k++]=0; e 2.28

一? 个 在 A,B 中 C ? 中



元素

ist B)//在 { p=A->next;q=B->next;pc=A; (p&&q) { if(p->data<q->data) p=p->next; else if(p->data>q->data) q=q->next; else if(p->data!=pc->data)



?

?

{ pc=pc->next; pc->data=p->data; p=p->next;q=q->next; } rue 2.29 t C) { i=0;j=0;k=0;m=0; //i 指 { if(B.elem[j]<C.elem[k]) j++; else if(B.elem[j]>C.elem[k]) k++; else { same=B.elem[j]; //找 同? 元 素 sam ? e (B.elem[j]==same) j++; (C.elem[k]==same) k++; //j,k 移 元素 h&&A.elem[i]<same) A.elem[m++]=A.elem[i++]; // 元? 素移动 h&&A.elem[i]==same) i++; // 同 ?元 素 } h) A.elem[m++]=A.elem[i++]; //A 余元素 储? 。 h=m; ete 分析: B C ? 中找 有? 元 素,记 sam ? e,再在 A 中 ? 当 sa ? me 元素 ?( ?置 ), sam ? e , sa ? me ame. 2.30 ist C)//在 ? { p=B->next;q=C->next;r=A-next; (p&&q&&r) { if(p->data<q->data) p=p->next; else if(p->data>q->data) q=q->next; else { 结 ? A 中元素 ? 置,m h) 移动 置

? 置



始, 凡 ?

再找下一个 s ?

u=p->data; // ?元 素u (r->next->data<u) r=r->next; // if(r->next->data==u) { s=r->next; (s->data==u) { t=s;s=s->next;free(t); // 第一个? r->next=s; // r s ?之 }//if (p->data=u) p=p->next; (q->data=u) q=q->next; }//else 元素?



一? 个

u

?元 素指针 r ?

u

元? 素 指针 s

2.31 de *s)// { p=s; (p->next->next!=s) p=p->next; //找 p->next=s; n OK; 2.32 &L)// { for(p=L;!p->next->pre;p=p->next) p->next->pre=p; n OK; e 2.33 t &C)//把 ? . L ? 向 ? 结 ? pre ? s ?驱 驱p ? ? 中结 ? s 直接 驱

元素 { s=L->next;

? 分

个?

t





de));p=A; de));q=B; de));r=C; // (s) { (s->data)) { p->next=s;p=s;



?

} it(s->data)) { q->next=s;q=s; } else { r->next=s;r=s; } p->next=A;q->next=B;r->next=C; // }//Link 2.34 ist L)// { p=L.left;pre=NULL; (p) { f("%d",p->data); ,pre); pre=p;p=q; // 一个结? 结 指? 针 } List 2.35 ist &L,int x,int i)//在异或 素 ?元 素x { p=L.left;pre=NULL; de)); r->data=x; if(i==1) //当 在? 最 ?况 { =XorP(p.LRPt ,r); =p; L.left=r; n OK; } ; //当 在? 中 况? (++j<i&&q) { ,pre); pre=p;p=q; //在 p,q 两结 之 ; //i 不可以超 ? L 第 i 个元 向 ? 异或 ? 元素 ?

LRP ? tr





指? 针

异或?

?

-

=XorP(XorP(p->LRPt ,q),r); ,p),r); =XorP(p,q); //修改指针 n OK;

2.36 ist &L,int i)// { p=L.left;pre=NULL; if(i==1) // 最 结? 况 { ; ,p); L.left=q;free(p); n OK; } ; (++j<i&&q) { ,pre); pre=p;p=q; //找 结? q ; //i 不可以超 ==q) //q 最 结 况 { ,q); =p;free(q); n OK; } ,p); //q 中 结 况, p,r 分别 ,q),r); ,q),p); //修改指针 free(q); n OK; 2.37 st &L)// 1,3,5,...4,2 排 向 ? L中 异或 ? L 第i ? 个元素



?所 有结 { p=L.next; (p->next!=L&&p->next->next!=L) { p->next=p->next->next; p=p->next; } // p 指向? 最 一个 ? 数 结

if(p->next==L) p->next=L->pre->pre; else p->next=l->pre; p=p->next; // p 指向? 最 一个 ? 数 结 (p->pre->pre!=L) { p->next=p->pre->pre; p=p->next; } p->next=L; // 求? 调 整 ne ? xt 结 , for(p=L;p->next!=L;p=p->next) p->next->pre=p; L->pre=p; //调整 pre ? 结 ,同 2.32 orm 分析:next pre ? 调整 ?分 . 同 数? 结 指针?, 将 ? 结 ?, 结 2.38

pre ?

?

?调 整 话, ?失 .

?

st &L,int x)//带 freq ? 查找 { p=L.next; (p.data!=x&&p!=L) p=p->next; n NULL; // 找 p->freq++;q=p->pre; (q->freq<=p->freq) q=q->pre; //查找 if(q!=p->pre) { p->pre->next=p->next;p->next->pre=p->pre; q->next->pre=p;p->next=q->next; q->next=p;p->pre=q; //调整 置 } n p; ist 2.39 y P,int x0)//求 { erm *q; xp=1;q=P.data; sum=0;ex=0; (q->coef) { (ex<q->exp) xp*=x0; sum+=q->coef*xp; q++; } n sum; ? 储 ?



?

?

?置

?

2.40 a 差 { 3 y &P3)//求 ? P 1减P ? 2

erm *p,*q,*r; oly(P3); // 空 ? P3 p=P1.data;q=P2.data;r=P3.data; (p->coef&&q->coef) { if(p->exp<q->exp) { r->coef=p->coef; r->exp=p->exp; p++;r++; } else if(p->exp<q->exp) { r->coef=-q->coef; r->exp=q->exp; q++;r++; } else { if((p->coef-q->coef)!=0) // 有同 ? 减不 { r->coef=p->coef-q->coef; r->exp=p->exp;r++; }//if p++;q++; }//else (p->coef) //处理 P1 或? P 2 { r->coef=p->coef; r->exp=p->exp; p++;r++; } (q->coef) { r->coef=-q->coef; r->exp=q->exp; q++;r++; } 2.41 余

零?

?

P3 中

&L)// L ? 求导 { p=L->next; if(!p->data.exp) { L->next=p->next;p=p->next; // } (p!=L) { p->data.coef*=p->data.exp--;// p=p->next; } ly 2.42





?

结?



?

常数

?



求? 导

void Divid ? e_Lin ? kedPo ? ly(Linke ? dPoly ? &L,&A,&B)//把 L ? ? A ? ?B { p=L->next; A=(PolyN ? ode*)mallo ? c(sizeo ? f(PolyN ? ode)); B=(PolyN ? ode*)mallo ? c(sizeo ? f(PolyN ? ode)); pa=A;pb=B; while ? (p!=L) { if(p->data.exp!=2*(p->data.exp/2)) { pa->next=p;pa=p; } else { pb->next=p;pb=p; } p=p->next; }//while ? pa->next=A;pb->next=B; }//Divid ? e_Lin ? kedPo ? ly

? 储

?


3.15 t{ ype *base[2];



与队

ype *top[2]; e; // 向

? m ? 向 tw ? s

e &tws,int m)//初始化一个? { ype)); tws.base[1]=tws.base[0]+m; tws.top[0]=tws.base[0]; tws.top[1]=tws.base[1]; n OK; ype x)//x 端 { LOW; // if(i==0) *tws.top[0]++=x; else if(i==1) *tws.top[1]--=x; ; n OK; }//push ype &x)//x 高端 { if(i==0) { LOW; x=*--tws.top[0]; } else if(i==1) { LOW; x=*++tws.top[1]; } ; n OK; }//pop 3.16 )// 软席 { ; tack(s); (*p) { if(*p=='H') push(s,*p); //把'H' 中 符? 串trai ?n ,i=0 ,i=0

低端

,i=1



? 满条件

低端 ,i=1

火车,'H'

硬席,'S'

else *(q++)=*p; //把'S'调 p++; } (s)) { pop(s,c); *(q++)=c; //把'H'接在 } nge 3.17 erse()// ? 0 { tack(s); ar())!='&') push(s,e); ar())!='@') { n 0; pop(s,c); n 0; } n 0; n 1; erse 3.18 st(char *str)// { =0; for(p=str;*p;p++) { ++; --; ; } ; // n OK; st 3.19 部



? 符串中'&'

'&'

部分是

? 逆串,是

? , 1





中 ?

是? 匹配

不? 匹配



? 况

t(char *str)// { tack(s); for(p=str;*p;p++)





中 ?

? 是 匹配

{ if(*p=='('||*p=='['||*p=='{') push(s,*p); else if(*p==')'||*p==']'||*p=='}') { ; pop(s,c); if(*p==')'&&c! ; ; ; // } }//for ; n OK; t 3.20 t{ . int x; int y; ; )//把 { old=g[i][j]; ueue(Q); ue(Q,{I,j}); (Q)) { ue(Q,a); x=a.x;y=a.y; if(x>1) if(g[x-1][y]==old) { ; ue(Q,{x-1,y}); //修改 } if(y>1) if(g[x][y-1]==old) { ; ue(Q,{x,y-1}); //修改 } if(x<m) if(g[x+1][y]==old) { ; (i,j) 邻 ? 置 ?

与当

?

匹? 配

邻 ?

邻 ?

ue(Q,{x+1,y}); //修改 邻 } if(y<n) if(g[x][y+1]==old) { ; ue(Q,{x,y+1}); //修改下邻 } lor 分析: ? 3.21 ? ?. 归 ? ?

?

?

? ?写 呢?

?, 两个队

?

邻同?

an(char *str,char *new)//把中 { p=str;q=new; // 起 ?, str ? 两端 tack(s); //s 符 (*p) { if(*p 是 母)) *q++=*p; //直接 else { p(s); if(*p c 高) push(s,*p); else { p(s) 不 ?* p 低) { pop(s,c);*(q++)=c; push(s,*p); // }//else }//else p++; an // 3.22 n(char *str)// { tack(s); //s (*p) { if(*p 是数) push(s,*p); else 操作数 逆 编 符在 ? ?

达? str 加 ?

?

逆 最? 低

? new 符?

? 高

?

?理 教材

?求

{ pop(s,a);pop(s,b); te(b,*p,a); // push(s,r); }//else p++; n r; n 3.23 &new)//把逆 ? { tack(s); //s 元素 wh (*p) { if(*p 母) push(s,*p); else { ; pop(s,a); ; pop(s,b); c=link(link(*p,b),a); push(s,c); }//else p++; pop(s,new); ; n OK; n 分析: 数? 据 3.24 s g(int m,int n,int &s)//求 { if(m==0&&n>=0) s=0; else if(m>0&&n>=0) s=n+g(m-1,2*n); ; n OK; }//g 3.25 归 数? g s ? st ? 释. ype, 中 不? 可以 ? 串 体操作 ? ? , 将 接操作?:c=link(a,b). 作? 一 new ? 达 str ? com ? pute ? 程

e(int n,int &s)// { ; if(n==0) s=n+1; else { urve(n/2,r); s=n*r; } n OK; e s { ; if(n==0) s=n+1; else { tack(s); //s (n!=0) { a=n;b=n/2; push(s,{a,b}); n=b; s=1; (s)) { pop(s,t); s*=t.a; } n OK; sive 3.26



sive(int n,int s)//非



?

元素

str ? uct {int a;int b;}

e)//求 { ve e)//求 { (abs(p^2-A)>=e) p=(p+A/p)/2; n p; ve n p; ve(A,(p+A/p)/2,e);

? 归

非 ?



?

3.27 一 所? 有 ?细 写 . 3.28 i { de)); Q->next=Q; e ue &Q,int x)//把元素 x ? 队尾元素,Q->next 指向 结 ,Q->next->next 指向队 { de)); p->data=x; p->next=Q->next; //直接把 p 加? 在Q ? Q->next=p; Q=p; //修改尾指针? } ue &Q,int x)// { p=Q->next->next; x=p->data; Q->next->next=p->next; free(p); n OK; ueue 3.29 ue &Q,int x)//带 tag { ==Q.rear&&Q.tag==1) //tag LOW; Q.base[Q.rear]=x; ZE; ==Q.rear) Q.tag=1; //队 满 ueue ue &Q,int &x)//带 tag { ; ZE; 0 ?" 空",1 "满" ? 队 ? 队 ; //队 空 ? ? 元素? 队 ? Q,Q 指向 ue &Q)//初始化 ? ?队 Q 以 ? 化 ?程 请 《数据结 l 版)》,作 不再



?Q 部

元素 x

?



? 队

]; ==Q.rear) Q.tag=1; //队 空 n OK; ueue 分析:当 队 ? 队 中 个? ? 元素 ? 储? 空 , 有价 . 3.30 ue &Q,int x)//带 leng ? t h { LOW; ZE; Q.base[Q.rear]=x; h++; re n OK; ueue ue &Q,int &x)//带 leng ? th { x=Q.base[head]; h--; ueue 3.31 ()// { ueue(Q); ar()!='@') { ue(Q,c); //同 } (S)) { ue(Q,b)); ; } n OK; } 3.32 ueue(int k,int n)//求 k { e(Q); // MAXS ? IZE for(i=0;i<k-1;i++) Q.base[i]=0; 置 k ? ? 队 两 别 ? 符串是 ; ZE; //

空?

,

? 可以



队?



队?

?释

? 文

,是

? , 1

? 0

?结

?

n+1

Q.base[k-1]=1; //给

k ?初 f("%d",Q.base[i]);

for(i=k;i<=n;i++) { m=i%k;sum=0; for(j=0;j<k;j++) sum+=Q.base[(m+j)%k]; Q.base[m]=sum; //求第 i ? 队 ? 中 f("%d",sum); } ueue 3.33 e &Q,int x)// { if(x>=avr) // 据 x { Q.base[Q.rear]=x; } // else { 在队尾? ]=x; ? ZE; ? ZE;

?

第一?

? 端队

? 队操作 满

n LOW; //队 ])/2; 在? 队 是队? 尾

} // 在队 re n OK; eue

e &Q,int &x)// { ; //队 空 ]; ZE; n OK; eue 3.34 void Train ? _Rear ? range ? (char *train ? )// 硬座,'H' 硬卧,'S' 软卧,最终 PS ? H { r=train ? ; InitD ? Queue ? (Q); while ? (*r) { if(*r=='P')

? 端队

? 队操作

符? 串trai ? n 排?

火车? , 'P'

{ print ? f("E"); print ? f("D"); // } else if(*r=='S') { print ? f("E"); EnDQu ? eue(Q,*r,0); //0 } else { print ? f("A"); EnDQu ? eue(Q,*r,1); //1 } }//while ? while ? (!DQueu ? eEmpt ? y(Q)) { print ? f("D"); DeDQu ? eue(Q); }//while ? // 端 队? 车厢 }//Train ? _Rear ? range ? ?不 队 ,直接 ? 车 P 厢

把S ? 车厢

端? 队

把H ? 车厢

尾端? 队

?然 是

S

?H

第四章 串
4.10 &r)//求 s { sign(r,''); //初始化 r n(s);i;i--) { ring(s,i,1)); t(r,c)); //把 s } erse 4.11 &r)//求所有 ? t中 有 { sign(r,''); n(s);i++) { ring(s,i,1)); ring(s,j,1));j++); // s 当? 符 c 是? 第 符 ? 串r ? 在串 s 中 符? 添? 加 r 中 ?空 串 逆串? r

一 ? if(i==j) { ring(t,k,1));k++); // ? 在t 中 t(r,c)); } }//for 4.12 ce( 置 V);//将串 S 中所? 有 子 串T ? 数 ? 当 符是 ?

V, {

n(T)+1;i++) // i ? 范围 n(T)),T)) //找 与T ? 匹配 子串? { //分别把 T ? 部分 ? ?h ead tail ring(S,1,i-1)); -n(T)+1)); t(head,V)); t(S,tail)); //把 head ? ,V,tail 接 串 n(V); //当 指针 ? 串以? n++; }//if n n; ce 分析 n(V); 一 是 ? , 是 ?略 . 一? , 在某 下, 起不 ? 望 果, 然在 数 况下 ? 有 ? 影响.请 : ', T='ace', V='face', n(V); ? 结果? ? 4.13 t)// 串 s 中 ? 数 { { ring(S,1,i-1)); -t(head,tail)); //把 head ? ,tail 接 n++; }//if n n, g 4.14 n(t)+1)); 串 n(t)+1;i++) n(t)),t)) ? 所有与 t ? 同

?况

子串?,

&new)//把 ?n ew { tack(s); //s for(i { if(r else { 元素 n(str);i++)

达? str

?

ring(str,i,1); 母) push(s,r); ;

pop(s,a); ; pop(s,b); t(r,b)); t(t,a)); //把 push(s,c); } }//for pop(s,new); ; n OK; n 分析: 程 . 4.15 void ? { sign 4.16 t)//串 ,s<t { for(i=1;i<=s[0]&&i<=t[0]&&s[i]==t[i];i++); n 0; n -t[i]; n s[i]; n s[i]-t[i]; 4.17 负数 ,s>t 正数,s=t &#;)// ? [i]; 符数组? 给串 T ? 释3 ? .23.请 ? 程 作? ? 3.23 给 符 r,子 达? a,b 接 子 达? c

V);//将串 S 中所? 有 子串 T ? { for(n=0,i=1;i<=S[0]-T[0]+1;i++) { for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++); if(k>T[0]) //找 与T ? 匹配 子串?: 分 况? 处 理 { if(T[0]==V[0]) for(l=1;l<=T[0];l++) // 子串 与 子串 ? 同 :直接 ? S[i+l-1]=V[l]; else if(T[0]<V[0]) // 子串 ? 子串? : 将 部 ? 移 { for(l=S[0];l>=i+T[0];l--) S[l+V[0]-T[0]]=S[l]; for(l=1;l<=V[0];l++) S[i+l-1]=V[l]; } else // 子串 ? 子串? : 将 部 ? 移 { for(l=i+V[0];l<=S[0]+V[0]-T[0];l++) S[l]=S[l-V[0]+T[0]]; for(l=1;l<=V[0];l++) S[i+l-1]=V[l]; } S[0]=S[0]-T[0]+V[0]; i+=V[0];n++; }//if }//for n n; lace 4.18 t{ char ch; int num; e; S)//统 { ZE]; // 结 数组? T 储统 结果 for(i=1;i<=S[0];i++) { c=S[i];j=0; (T[j].ch&&T[j].ch!=c) j++; //查找当 ? 符c是 if(T[j].ch) T[j].num++; else T[j]={c,1}; }//for for(j=0;T[j].ch;j++) 串 S 中? 符 ? 个数 V, 置 ? 数

?记 录

f("%c: %d\n",T[j].ch,T[j].num); 4.19 &r)//求所有 ? t中 有 { r[0]=0; for(i=1;i<=s[0];i++) { c=s[i]; for(j=1;j<i&&s[j]!=c;j++); // s 当? 符 c 是? 第一 ? if(i==j) { for(k=1;k<=t[0]&&t[k]!=c;k++); // 当 ? 是 符 ? 在t 中 if(k>t[0]) r[++r[0]]=c; } }//for 4.20 t)// 串 s 中 ? 数 { for(n=0,i=1;i<=s[0]-t[0]+1;i++) { for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++); if(j>m) //找 与t ?匹配 子串? { for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]]; // s[0]-=t[0];n++; } }//for n n; g 4.21 t{ char ch; ode *next; ng; // 串结 ng t)//把串 t { f( ode)); for(q=s,p=t->next;p;p=p->next) { ?给 串s ? 所有与 t ? 同 子串?, 符 ? 串r ? 在串 s 中



ode)); r->ch=p->ch; q->next=r;q=r; } q->next=NULL; gn ng t)//把串 t ,串 s { for(p=s->next,q=t->next;p&&q;p=p->next,q=q->next) { p->ch=q->ch;pre=p; } (q) { ode)); p->ch=q->ch; pre->next=p;pre=p; } p->next=NULL; ng 负数 { for(p=s->next,q=t->next;p&&q&&p->ch==q->ch;p=p->next,q=q->next); n 0; n -(q->ch); n p->ch; n p->ch-q->ch; are int S ng s)//求串 s ? (元素个数) { for(i=0,p=s->next;p;p=p->next,i++); n i; gLen ng t)// { ode)); for(q=p,r=s->next;r;r=r->next) { q->next=(LS q=q->next; q->ch=r->ch; }//for // 串s for(r=t->next;r;r=r->next) 接串 s ? 串t ?串 , 指针? ng t)//串 ,s>t 正数,s=t ,s<t ?在 . ? 串 s.与 一个程? 别在?

ode));

{ q=q->next; q->ch=r->ch; }//for // 串t q->next=NULL; n p; }//Conc t ode));

,int len)// 置起 { len ? 子串

一个串?,

串? s

rt

ode));q=p; --,r=r->next); //找 for(i=1;i<=len;i++,r=r->next) { ode*)m q=q->next; q->ch=r->ch; } // 串t q->next=NULL; n p; 4.22

sta ? rt 所 应 ode));



指针? r

ng &s,char c)// 串t ? 符c 之 { p=t.head; Char(p,c))) p=p->next; //查找 if(!p) // 找 { t.tail->next=s.head; t.tail=s.tail; //把 s 接在? t } else { q=p->next; 符c ?

储? 结 ,把串 s

?

)); //将 符? c 分 两个? for(j=0;j<i;j++) r->ch[j]='#'; // 结 p ? c 以? 部分 for(j=i;j<CHUN SIZE;j++) // 结 r ? c以 ?部 分 { r->ch[j]=p->ch[j]; p->ch[j]='#'; //p 半部分 r ? 半部分 符改 ? ? 符'#' } p->next=s.head; s.tail->next=r;

r->next=q; //把串 s ? 结 }//else n; //修改串 n=0; ncat

p

? r之

个 {

符,



*p,char c)//在某个 ? 0

中? 查 找

符c ?, 找

?

置是第? 几

SIZE&&p->ch[i]!=c;i++); n 0; n i+1; Char

4.23 ng L)// 是 { ? , 1 ? 0 以 结 ? 储 ? 串L是 ? 文 ,

tack(S); p=S.head;i=0;k=1; //i 指 元素在 中 下? ,k 指 元素在整个 中 ? 1 始) n;k++) { n/2) Push(S,p->ch[i]); //将 半 ? 符 串 n+1)/2) { Pop(S,c); //将 半 ? 符与 中? 元素 匹? 配 n 0; //失配 } SIZE) // 下一个? 元 素,当 中最? 一个元素? , ? { p=p->next; i=0; } }//for n 1; // 功匹配 ome 4.24 ng 接? { 串t ng &t)//将 结 ?

(

下一

串 s1 ?

s2

if(t.ch) free(t.ch); f(char)); h;i++) t.ch[i-1]=s1.ch[i-1]; h;j++,i++) t.ch[i-1]=s2.ch[j-1]; h+s2.leng h; ncat 4.25 ng V)// 置 { { h) //找 { h) h;l++) // 子串 S.ch[i+l-1]=V.ch[l-1]; h) // 子串 { S. S[i+l]=V[l]; } else // 子串 { h;l++) S[i+l]=V[l]; } h;n++; }//if }//for n n; 4.26 ng T)//把 T 第p ? os 个 符之 { ; h+1;//当 置? 串 f(char)); ?, 作添加在? 串 尾 结 ? ? 串S h; h;l++) ? h;l--) h]=S.ch[l]; 与 ? ? 子串 ? 同 :直接 部 ? 移 h&&S.ch[j]==T.ch[k];j++,k++); 与T ? 匹配 子串?:分 况? 处 理 h;i++) ?数 结 串 ? 置 操作?,

子串? : 将

子串? : 将 h];



?移 h;l++)

h-1;i>=pos-1;i--) h]=S.ch[i]; // 移 for(i=0;i<T h;i++) S.ch[pos+i-1]=T.ch[pos]; // 串T h; n OK; sert 4.27

? 符串

? 置

t)//改 {

?

i=1;j=1; (i<=s[0]&&j<=t[0]) { if((j!=1&&s[i]==t[j])||(j==1&&s[i]==t[j]&&s[i+t[0]-1]==t[t[0]])) { //当 j==1 匹配模 串 第一? 个 符 , 同 匹配? 最 一个? i=i+j-2; j=1; } else { i++;j++; } n i-t[0]; _New 4.28 ng &T)// { p=T->succ;p->next=T;q=T; (p->succ) { if(q==T||p->data==q->data) { p=p->succ;q=q->succ; p->next=q; } else q=q->next; next 4.29 ode *pos)// , { 匹? 配 子串 ?指 针 串 K ? MP 匹配 串 ? g xt

p=pos;q=T->succ; (p&&q) { { p=p->succ; q=q->succ; } else q=q->next; if(!q) {

-

a)

n(T);i++) p=p->next; n p; } //发 匹配 ?, n NULL; 4.30 S)//求 S { n=0,i=1;i<S[0];i++)//串 S2 向 { for(k=0,j=1;j<=S[0]-i;j++)//j 串 当 指针?, 串 S1 ? 当 指针? i+j,两 指针同步? 移 动 { if(S[j]==S[j+i]) k++; // k 记录 ? 同 ?符 数 else k=0; //失配 k 归? 零 n) //发 以? 发 更? 子? 串 { n=k; //作记录 } }//for }//for n) { h:%d\n n); ion 2:%d\n",lrs1,lrs2); } !\n"); b 分析:i "错 ". ? 是, 把串 S ? 一个 ?S 2向 错 移1 格?,2 格,3 格,...与自身 S1 ? 匹配, 果 在最? 子串?, 然 在? 程中 ? 发 . lr ? s1,lrs2,maxl n 记录 发 最 ? 子串第? 一 ?置 第二 , ? 置 ?. 中 ?明 " 子串"是 有? 叠部分, ? ? 移i格 最 ? 子串 ? 置 ? 找子? 串

.

不 O ?

, 在第二? 个for n(S)^2).

?

条? 件中加

k ? <=i

可.

?

4.31 void Get_L ? PubSu ? b(Strin ? gtype ? S,Strin ? gtype ? T)//求串 S 串? T 最 ? 子 串 置? { if(S[0]>=T[0]) { StrAs ? sign(A,S);StrAs ? sign(B,T); } else { StrAs ? sign(A,T);StrAs ? sign(B,S); } // 化 ?, 令S T 中? 个? A, 个? B for(maxle ? n=0,i=1-B[0];i<A[0];i++) { if(i<0) //i B ? A 错 ? ,向 负, 端 0,向 ? 正 { jmin=1;jmax=i+B[0]; }//B 有一部分? 在A 端 ? else if(i>A[0]-B[0]) { jmin=i;jmax=A[0]; }//B 有一部分? 在A 端 ? else { jmin=i;jmax=i+B[0]; }//B 在 A ?两 端之 . //以 是 据? A B 不同? 置? A ? 匹配 ? (与 B 合 ? ) 端 :jmin,jmax. for(k=0,j=jmin;j<=jmax;j++) { if(A[j]==B[j-i]) k++; else k=0; if(k>maxle ? n) { lps1=j-k+1;lps2=j-i-k+1;maxle ? n=k; } }//for }//for if(maxle ? n) { if(S[0]>=T[0])

{ lpsS=lps1;lpsT=lps2; } else { lpsS=lps2;lpsT=lps1; } //将 A,B 置? 映 射 S,T 置? print ? f("Longe ? st Publi ? c Subst ? ring lengt ? h:%d\n",maxle ? n ); print ? f("Posit ? ion in S:%d Posit ? ion in T:%d\n",lpsS,lpsT); }//if else print ? f("No Repea ? ting Subst ? ring found ? !\n"); }//Get_L ? PubSu ? b 分析: ? 与 同? . 唯一 别? 是 , 由 A,B 不 同? , 因 B不 ? 向 错 ?, 且 向? 错 ,以 不 ? 一 况? . 当B ?A 置不? 同 , 匹配 ? ? 不? 同,请 自 ? 以 ?理 解 . ? 是? o (strlr ? n(s)*strle ? n(t))。

第五章 数组
5.18

?

void RSh(int A[n],int k)//把数组 A ? 元素 移k , ? 一个 ? 储空 ? { for(i=1;i<=k;i++) if(n%i==0&&k%i==0) p=i;//求 n k ? 最 数? p for(i=0;i<p;i++) { j=i;l=(i+k)%n;temp=A[i]; (l!=i) { A[j]=temp; temp=A[l]; A[l]=A[j]; j=l;l=(j+k)%n; }// 移一? 步 A[i]=temp; }//for }//RSh 分析: 把 A 元? 素 移? k , A[0]移至 A[k],A[k]移至 A[2k]......直 最终 ? A[0].然 有 部解 ? 问 ,因 有可 ? ? 有 元素在? 程中始? 终 有 ?问 , 是 ? 去.分析可知,当 n k ? 最 数? p , 分别以? A[0],A[1],...A[p-1] 起 ? 述 , 可以 ? 一个元素? 且 ? 移 一 , 满 ? 求. 是 ,A 所有元素分别处在? p个" " .举例 下: n=15,k=6, p=3. 第一条 :A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].

第二条 :A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1]. 第 条 :A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2]. 所有? 元素 移? 一 . 然 数? 学 明, 作 ? 述 应? 是正 ?. 5.19 (int A[m][n])//求矩阵 A 中? 马 鞍 { for(i=0;i<m;i++) { for(min=A[i][0],j=0;j<n;j++) if(A[i][j]<min) min=A[i][j]; //求一 中 ? 最 for(j=0;j<n;j++) if(A[i][j]==min) // 个( )最 是 ? 鞍 { for(flag=1,k=0;k<m;k++) if(min<A[k][j]) flag=0; if(flag) nt!\nA[%d][%d]=%d",i,j,A[i][j]); } }//for 5.20 ? , 况下, 高 ? 始, 避免 . 5.21 rix &C)// 阵? 加 { C.mu=A.mu;C.nu=A.nu;C.tu=0; pa=1;pb=1;pc=1; for(x=1;x<=A.mu;x++) // 矩阵 一 ? 加? { (A.data[pa].i<x) pa++; (B.data[pb].i<x) pb++; (A.data[pa].i==x&&B.data[pb].i==x)// { if(A.data[pa].j==B.data[pb].j) { ce=A.data[pa].e+B.data[pb].e; if(ce) // 不 0 { 元组 ? 矩 ? 一? 下 . 一 ? 在 ,在 ? .可以 ? 一元 ? 数? 减 一, 一个队 ?. ? 元数 m 知? ? ? , 最 问 ? 志visi ? ted 以

?

元素

C.data[pc].i=x; C.data[pc].j=A.data[pa].j; C.data[pc].e=ce; pa++;pb++;pc++; } }//if else if(A.data[pa].j>B.data[pb].j) { C.data[pc].i=x; C.data[pc].j=B.data[pb].j; C.data[pc].e=B.data[pb].e; pb++;pc++; } else { C.data[pc].i=x; C.data[pc].j=A.data[pa].j; C.data[pc].e=A.data[pa].e pa++;pc++; } (A.data[pa]==x) // { C.data[pc].i=x; C.data[pc].j=A.data[pa].j; C.data[pc].e=A.data[pa].e pa++;pc++; } (B.data[pb]==x) // { C.data[pc].i=x; C.data[pc].j=B.data[pb].j; C.data[pc].e=B.data[pb].e; pb++;pc++; } }//for C.tu=pc; dd 5.22 rix &A, { for(i=1;i<=A.tu;i++) ZE-A.tu+i]=A.data[i];/把 A ZE-A.tu+1;pb=1;pc=1; for(x=1;x<=A.mu;x++) // 矩阵 一 ? { (A.data[pa].i<x) pa++; 所有? 元素 加? 移 ? 尾部以 ? 置 rix B)//将 元组矩? 阵B 加 A ? B中 ? 余 元素(第 x ) A中 ? 余 元素(第 x )

(B.data[pb].i<x) pb++; (A.data[pa].i==x&&B.data[pb].i==x)// { if(A.data[pa].j==B.data[pb].j) { ne=A.data[pa].e+B.data[pb].e; if(ne) // 不 0 { A.data[pc].i=x; A.data[pc].j=A.data[pa].j; A.data[pc].e=ne; pa++;pb++;pc++; } }//if else if(A.data[pa].j>B.data[pb].j) { A.data[pc].i=x; A.data[pc].j=B.data[pb].j; A.data[pc].e=B.data[pb].e; pb++;pc++; } else { A.data[pc].i=x; A.data[pc].j=A.data[pa].j; A.data[pc].e=A.data[pa].e pa++;pc++; } (A.data[pa]==x) // { A.data[pc].i=x; A.data[pc].j=A.data[pa].j; A.data[pc].e=A.data[pa].e pa++;pc++; } (B.data[pb]==x) // { A.data[pc].i=x; A.data[pc].j=B.data[pb].j; A.data[pc].e=B.data[pb].e; pb++;pc++; } }//for A.tu=pc; ZE;i++) A.data[i]={0,0,0}; // ddto 5.23 B中 ? 余 元素(第 x ) A中 ? 余 元素(第 x )

?

元素

? A中记录

t{ int j; int e; m; t{ ZE]; W];// 个向 int mu,nu,tu; rix; //二元组矩阵? rix A,int i,int j,int &e)//求二元组矩? 阵 元素 A ? [i][j] e { for(s=cpot[i];s<cpot[i+1]&&A.data[s].j!=j;s++);// 查找范? 围 if(A.data[s].i==i&&A.data[s].j==j) //找 元素? A [i][j] { e=A.data[s]; n OK; } ; 5.24 t{ int seq; // 元素在以? int e; ; ef str t{ ZE]; int mu,nu,tu; ix; // 下 二元? 组矩阵 ? 下 二? 元组矩阵 ?元 素 排? ? 储 ? 一 在? 二元组中 ?起 始 置

ix A,int i,int j,int &e)//求 A[i][j] e { s=i*A.nu+j+1;p=1; (A.data[p].seq<s) p++; // 元素? seq if(A.data[p].seq==s) //找 元素? A [i][j] { e=A.data[p].e; n OK; } ; cate



?

5.25 ef enum{0,1} bool; t{ int mu,nu; int ZE]; bool map[mu][nu]; rix; // ? 矩阵

? rix &C)// 矩阵 ?加

{ C.mu=A.mu;C.nu=A.nu; pa=1;pb=1;pc=1; for(i=0;i<A.mu;i++) // 一 ?加 for(j=0;j<A.nu;j++) // 一个元素? 加 { if(A.map[i][j]&&B.map[i][j]&&(A.elem[pa]+B.elem[pb]))//结果不 { C.elem[pc]=A.elem[pa]+B.elem[pb]; C.map[i][j]=1; pa++;pb++;pc++; } else if(A.map[i][j]&&!B.map[i][j]) { C.elem[pc]=A.elem[pa]; C.map[i][j]=1; pa++;pc++; } else if(!A.map[i][j]&&B.map[i][j]) { C.elem[pc]=B.elem[pb]; C.map[i][j]=1; pb++;pc++; } } dd 5.26 t { for(i=0;i<A.mu;i++) { [i]) ) // f("%d %d %d\n",i,p->j,p->e; } trix 一个 ? ? rix A)//以 元组格? ? ? 矩阵

? 0

5.27 rix B)//把 { [j]; //向 指针? for(i=1;i<=A.mu;i++) { [i];pre=NULL; (pb) { if(pa==NULL||pa->j>pb->j) // { 一个? 结 cp 储 ? 一 当? 最 一个? 元素 ? 矩阵? B加 A

e)); [i]=p; =p; =pa;pre=p; p->i=i;p->j=pb->j;p->e=pb->e; // ?中 [p->j]) { [p->j]=p; p->down=NULL; } else { (cp[p->j]->down) cp[p->j]=cp[p->j]->down; p->down=cp[p->j]->down; cp[p->j]->down=p; } cp[p->j]=p; // ?中 }//if else if(pa->j<pb->j) { pre=pa; ; } //pa 移一步 else if(pa->e+pb->e) { pa->e+=pb->e; ; ; } //直接 加 else { ; else ; ; // 中? [p->j]==p)

[p->j]=cp[p->j]=p->down; else cp[p->j]->down=p->down; // free (p); }//else }//for 分析: 5.28 t &L)// ?偏 导 { dd 体? 在 中有 ? 细

中?

?解 释 明.

储结 ?

元 ?

求? 第一



for(p=L->hp->tp;p&&p->exp;pre=p,p=p->tp) { if(p->tag) Mul(p->hp,p->exp); else p->coef*=p->exp; //把指数 在? 结 或 p->exp--; } pre->tp=NULL; if(p) free (p); // 可 在 常数 ? ? nDao t &L,int x)// { for(p=L;p;p=p->tp) { if(!p->tag) p->coef*=x; else Mul(p->hp,x); } }//Mul 5.29 归 , 元

下 ?



?

?

L

以x ?

t &C)// ?归 { if(!A->tag&&!B->tag) // 子 { C->coef=A->coef+B->coef; if(!C->coef) { free(C); C=NULL; } }//if else if(A->tag&&B->tag) //两个 de)); ,可直接 加?

储? 结

?



? 加

{ p=A;q=B;pre=NULL; (p&&q) { if(p->exp==q->exp) { de)); C->exp=p->exp; (A->hp,B->hp,C->hp); pre->tp=C;pre=C; p=p->tp;q=q->tp; } else if(p->exp>q->exp) { de)); C->exp=p->exp; C->hp=A->hp; pre->tp=C;pre=C; p=p->tp; } else { de)); C->exp=q->exp; C->hp=B->hp; pre->tp=C;pre=C; q=q->tp; } (p) { de)); C->exp=p->exp; C->hp=p->hp; pre->tp=C;pre=C; p=p->tp; } (q) { de)); C->exp=q->exp; C->hp=q->hp; pre->tp=C;pre=C; q=q->tp; } //将 同 分别 加 ? ? }//else if else if(A->tag&&!B->tag) // { x=B->coef; for(p=A;p->tp->tp;p=p->tp);

? , 理 常? 数 加

第二? 章

? 加一

if(p->tp->exp==0) p->tp->coef+=x; //当 if(!p->tp->coef) { free(p->tp); p->tp=NULL; } else { de)); q->coef=x;q->exp=0; q->tag=0;q->tp=NULL; p->tp=q; } // 常? 数 ,下同 }//else if else { x=A->coef; for(p=B;p->tp->tp;p=p->tp); if(p->tp->exp==0) p->tp->coef+=x; if(!p->tp->coef) { free(p->tp); p->tp=NULL; } else { de)); q->coef=x;q->exp=0; q->tag=0;q->tp=NULL; p->tp=q; } }//else 5.30 L)//求 { n 0; // 子 ?0 n 1; //空 ?1 eph(L->ptr.hp)+1; eph(L->ptr.tp); n m>n?m:n; eph 5.31 &B)// { ?

中? 有常数

? , 加

常数

?



?

?



?

if(!A->tag) //当结 ? 子 ,直接 { B->tag=0; B->atom=A->atom; } else //当结 子? { B->tag=1; if(A->ptr.hp) { e)); (A->ptr.hp,B->ptr.hp); } // if(A->ptr.tp) { e)); (A->ptr.tp,B->ptr.tp); } // 尾 }//else 5.32 B)// ? 0 { // 可分 ? ?况 : n 1; //空 是 if(A->tag&&B->tag) l(A->ptr n 1; // 尾 ? n 0; l ?A B是 ,是 1 ? ,

? n 1;// 子 ?

l(A->ptr.tp,B->ptr.tp))

5.33 )// 当 { n; else { } +1); ); // 尾 与? 是同一? f("%d %d\n",A->atom ); ? 归 ? 子? 所在 ?

5.34 A)// { if(A->tag&&A->ptr.tp) //当 A 不 子且 尾非? ? 空 { D=C->ptr.hp; A->ptr.tp->ptr.hp=A->ptr.hp;A->ptr.hp=D; // rse(A->ptr.hp); rse(A->ptr.tp); //逆 ? 尾 } rse 5.35 &L)// { ("%c",&ch); if(ch==' ') { L=NULL; ("%c",&ch); ; n OK; } e)); L->tag=1; (ch)) // { e)); // p->tag=0;p->atom=ch; L->ptr.hp=p; } st(L->ptr.hp); // ; ("%c",&ch); if(ch==')') L->ptr.tp=NULL; st(L->ptr.tp); // ; n OK; e st 分析: ? 解 . 5.36 A)// { f("()"); //空 ? ? 尾 子 ? 子 ? 是 母? 据 ? L ? , 指针? 逆? 归逆 ? A

? 尾

else { f("(");

f("%d",A->atom);//



(A->ptr.hp); if(A->ptr.tp) { f(","); 有当 f(")"); }//else 5.37 &A,int x)// { lem(A->ptr.hp,x); else if(!A->ptr.hp->tag&&A->ptr.hp->atom==x) { q=A; A=A->ptr.tp; // 去元素 ? x ? free(q); lem(A,x); } lem(A->ptr.tp,x); lem 5.39 A)// { ueue(Q); (Q)) { ue(Q,r); else er 分析: 同 把? 下一 ? 问 ,一 ? 子 是 ? 队 队? 尾 . 是 ? ? , 队 ? . ? 一个元? 素 ue(Q,r); f("%d",r->atom); ue(Q,p); ? A 中? 所有元素? A ?中 所有? x ?子 } // (A->ptr.tp); 尾? 非空 ? ?

第六章



?

6.33 (int u,int v)//在 1, ? { else { if(L[v]) ant(u,L[v])) if(R[v]) n 1; // 是个 } n 0; 6.34 (int u,int v)//在 1, ? ? 0 { for(p=u;p!=v&&p;p=T[p]); n 1; els n 0; 6.35 一 6.36 e B2)// { n 1; d)) n 1; n 0; 6.37 e T)// { tack(S); Push(S,T); // 指针 ? (S)) 二? 非 ?归 d,B2两 是 ? ? 归 不 ? 写 ? , 释?: 两个整数 ? 是 ?. 储? 结 ? u是 v 子孙,是 归? n 1; ? 0 n 1; 子 储? 结 ? u是 v 子孙,是

{ p(S,p)&&p) { (p->data); d); } //向 ? pop(S,p); (S)) { pop(S,p); d); //向 } e 6.38 t{ e* ptr; enum {0,1,2} mark; e; //有 mark ? 结 e T)// { e a; tack(S); //S 元素 e Push (S,{T,0}); // 结 ? (S)) { Pop(S,a); h(a.mark) { case 0: Push(S,{a.ptr,1}); //修改 mar ?k ; case 1: Push(S,{a.ptr,2}); //修改 mar ?k d) Push(S,{a.ptr-> ; case 2: (a.ptr); // 问结 , } 分析: 刚刚 问 . 指? 针 二? 非 ?归 ,

一步

d,0}); //





?

d,0}); //





?

分两? 不? 同处理 ?, 在 中增? 加 一个 ma ? rk ,mark=0 结 ?,mark=1 子 处理结束? ,mark=2 子 处理结束? 据 ? 元 素 m ? ark ?动 作.

6.39 t{ int data; d; d; t; enum {0,1,2} mark; ee; //有 mark ? ee T)// { p=T; (p) h(p->mark) { case 0: p->mark=1; d; // 问 子 ? ; case 1: p->mark=2; d; // 问 子 ? ; case 2: (p); p->mark=0; //恢 mar ?k t; // 结? } ve 分析: 是 ?在 6.40 t{ int data; d; d; t; ee; //有 与? 一 中,所以 问 ? 同, 不 结 ? mark ? 是储 在? 结 中 , ?毕 将m ? ark 恢 0,以 下一 ? . 不

指? 针 二?

二 非

? 结 ?归 ,不

?

指针? 非

二 归 ?

?结 有 ? 指针 二?

ee T)//不 { p=T; (p) { (p); d; //向 ?

{ } else { } //当自 ?

d) // d;

找中

?继 : 当有



?

d) p=p-> -

d; // -



是在? 子 t; //当自

中向? 是 ?

? 子? 继 是?

t; t; 是 ? 子? 继 是? 向 直? t; 自 ? 是在 子? 中

6.41 int c,k; // 把k ? 数器 c 作? e T)//求 { if(T) { c++; // if(c==k) { exit (1); } else { } }//if main() { ... ("%d",&k); c=0; //在 数中? 调 (T,k); ... }//main d); //在 子 中? 查 找 d); //在 子 中? 查 找 问一个? 子 ? ? 数器加? 1 ? k ?处 理 结 ?

is %d\n",T->data);

,



数器? 初

0

6.42 e T)//求二 { n 0; //空 子 ? 子? 数 e 6.43 e T)// { 6.44 ub { if(T->data==x) { epth(T)); //找 exit 1; } else { } pth e T)//求子 { n 0; else { d); d); n (m>n?m:n)+1; } epth 6.45 ? 归 ? ?x 结 ,求 e T,int x)//求二 中? 以 x 结 ? ? 子 d; // 子? d); d); // 子 再? 分别 ? 自 子? 所有结? 子? 有 ?子 n 1; // 子结 d);// 子 子数加 ? 中? 子结 ?数

-

d,x); d,x); //在



中继 ?

找?

e T,int x)// { else { }//else ub_x e T)// { free(T); ub 6.46 d); d); 子 T ? ub(T); // -

所有以? 元 素x 子 ? d,x); d,x); //在

? 子



中继 ?

查找?

e &U)//非 { push(S1,T); // tack(S2); 指针 ? e)); U->data=T->data; q=U;push(S2,U); (S)) { p(S1,p)&&p) { d;q->data=p->data; d); push(S2,q); } //向 ? pop(S1,p); pop(S2,q); (S1)) { pop(S1,p);pop(S2,q); d;q->data=p->data; d); //向 一步 push(S2,q); } 分析: y_No sive ? 系 6.37 改写 . e));



?二

e));

6.47 e T)// { ueue(Q); // ue(Q,T); { ue(Q,p); (p); d) En } 6.48 ; e q)//求二 最近 同 { [ 100 ] // ,0); =FAL ; ,0); //求 [--i]; nt e path[ ],int i)//求 { if(T==p) { =TRUE; n; //找 } path[i]=T; //当 结 ? 径 d,p,path,i+1); //在 子 中? 继 找 d,p,path,i+1); //在 子 中? 继 ) path[i]=NULL; // 溯 ath 6.49 e T)// { ueue(Q); 二 是 ? 二? ,是 ? , 1 ? 0 T ? p 径 归? p ,q ? 径放在 path ? p [i];i++); //查找两条 ? 径 hq 中 最 一? 个 同结 ? 两个 ? 数组 ? p,q 径 T ? 中结 p ?q d); d); 作队? (Q)) 二?



flag=0; ue(Q,T); // (Q)) { ue(Q,p); if(!p) flag=1; n 0; else { } n 1; ree 分析: 问 可以? 结? 是 有 ? 子, ? 不 空? 指针 6.50 s Cre {

作队?

d); d); //不

子是?

空,



? 队 . ?.反之,

? 解 .与 6.47 ,作 当 ? 二 ? , 中 ? 有空指针?.

一个修? 改 不 当 , 是一个 ?

e &T)// ; e));

元组?



?

ar(); // 去 ueue(Q); ue(Q,T); {

ar(); 余 ? 符 ar())) ue(Q,e); ; // ?

Head(Q); e)); e } n OK; 6.51 e T)// { if(T->data 是 母 f("%c",T->data); ? 以二 ? 储 ?达 ; ue(Q,q); d=q; d=q; ; //格 不正 ?

else if(T->data 是操作符) { d->data 是操作符 { f("("); f(")"); } // 在 ? 况下 加? d->data 是操作符 { f("("); f(")"); } } ; //非 符 n OK; n 6.52 t{ e node; ; cord; // e T)//求一 { 数组 放 ueue(Q); //Q 元素 ue(Q,{T,0}); (Q)) { 一 ? 结 二 ?

-

; //格 错误 d->data ;



T ? ->data)

; d->data ; ; 低 T ? ->data)

所? 在 "繁茂 " 结 cord ?数

记? 录

ue(Q,r); ]++; +1}); +1}); } // ? 统 ? 结 数? ; //最 一个队? 元素所在? 是 ? 高 [i];i++) [i]; //求 最 结? 数 n h*maxn; o 分析: 果不 ? 数? 组 , 在 ? 同 求? ? 一 , 写 ?吗 ?



结? 数,

6.53 int maxh; e T)//求 { ; if(maxh<2) h(T,1); n OK; epth 数 6.44 ; // 符合条件? 结 ? 高 减一? 最 ?结

e T,int h)// { path[h]=T; if(h==maxh-1) {



?m axh-1



f("%c",path[i]->data); exit; // } else { } path[h]=NULL; // h 6.54 t sa)// { e ptr[sa.last+1]; // 数组储 if(!sa.last) { T=NULL; //空 n; } ptr[1]->data=sa.elem[1]; // T=ptr[1]; for(i=2;i<=sa.last;i++) { ; // ptr[i]->data=sa.elem[i]; j=i/2; //找 结 i ? 错误 e)); ? 与sa 中 结 ? 应 ? 指针 据 储结 ? ? 二 溯 d,h+1); d,h+1); ?径

e));

j

} n OK;

-

d=ptr[i]; //i 是 j d=ptr[i]; //i 是 j List

子 子

6.55 u { n -1; um=d; n d; um 分析: ? 子孙? 数 ,所以当 T 6.56 e *p)//在 继, { 分析: 6.57 e p)//在 指针? { d; //p 有 继线 n NULL; //p 是 结 t; //p 是 t->tag) t; //p 是 子且 有? 子 else //p 是 子且 有 ? 子 { d; (!q->ltag||!q->rtag) { d; d; } // p ? 子向? 下 底 n q; 继? 线 二 中查找结 ? ?p 继, ext 不 ? d; d; .是不是 ?理 解 错 ? 指针? 继? 线 二 ? 中查找结 ?p O ? (n),n 结 ?空 指针 , 数. : -1 不是 . 一? 个统一 ? d)+2); // e T)//求 结 T ? 子孙 数? 填 Des ? cNum 中, 数?



}//else Next 6.58 T 二 { T ? 结 p下 ? 子 x ; // p p 子 驱 Tree &x)//在中 线 ?

if(p->ltag) //x 作 { d; //s p->ltag=Link; d=x; q=x; d=s; //找 q=x; d=p; //找 } else //x 作 p { d; //s p->rtag=Link; d=x; q=x; d) d=s; //找 q=x; d=p; //找 } n OK; e 6.59

d; 子 中? 最 子 子 p 继 d; 中? 最



?, 修改

?驱 指向 s



?, 修改

?驱 指向 p

子 子

d; 中? 最 d; 中? 最



?, 修改

?驱 指向 s



?, 修改

?驱 指向 p

e T)// { for { } ee 6.60 );

子 ->data);

? ib)

?

T

?

e T)//求 { else { =0; ; // 子 } e 6.61 e T)//求 { else { e=0; { e(p); e=d; // 子结 } e; }//else e 6.62 e T)//求 { n 0; //空 else { n maxd+1; } 6.63 A)//求 { pth(A.r); Tree 子 n 0; //空 ); ?子 数之 n 1; // 子结



?

?

T

子? 数

-

ib)



?

?

T

e++;// ib) ? 最



?

?



?

?

T

?

ib) (p))>maxd) maxd=d; //子



?

?

A ?

pth(int T)//求子 { n sd+1; pth 6.64

T

?

n 1; ;p;p=p->next) ))>sd) sd=d;

T)//求 { p=0; for(i=0;i<T.n;i++) { dep=0;

?

T

?

[j t) dep++; //求 p=dep; } p; Tree 6.65 char Pred,Ind; // ? 中 ?

一个结?

分别? 储

在数组? P re d)//由子

n中 ?

中 { -

?

二? e)); // tart]; ->data;i++); //在中 art; d-i; // 子? en-1); 中查找子 ? ?

en) { } // { } // , ; // _Sub 子 ; 数 子 ? ? d); 子 , len) ; 数 ?

main() { ... _Sub(1,n,1,n); //初始调 ... } 分析: ? 一个? 性 质, 一 子 ? 在 中? 是 .因 , 可以 起? 始下 终? 下 ? 一 子 ? art 分别指 子? 在 子? 终 下 , 在中 子? 起始 ? 终 下? . 6.66 t{ e *ptr; hild; sg; //结 指针? T)//由 { sg ; for(i=0;i<T.n;i++) { e)); Tree[i].ptr->data=T.node[i].data; // 结 t>=0) //不是 { t; // 求? 是 ? ?储 hild)) // 当 ? 有 子 =Tree[i].ptr; // 第一个 子? ? else // 有? 子 ib=Tree[i].ptr; // 最? 一个 子? 下一个 hild=Tree[i].ptr; // ? 最 一个 ? 子 }//if }//for _CS ree 6.67 t{ char data; e *ptr; hild; nfo; //结 数据,结 指针 e &T)// { ; 最 ? 一个 二元组? ? 子 指针 ? 子 ? 最 T 一? 个 ? 子 指? 针 ? 子 ? 中所? 置 ? ?数 ,n 结 数

起? 始 下 ,

?

n=1;k=0; ; // ar())=='^') T=NULL; //空 Tree[0].data=c; Tree[0].ptr->data=c; ar())!='^') { e)); Tree[n].data=c; Tree[n].ptr->data=c; for(k=0;Tree[k].data!=p;k++); //查找当 ? 结 ; // 找 : r=Tree[k].ptr; ) r-> =Tree[n].ptr; ib=Tree[n].ptr; hild=Tree[n].ptr; // 一 ?同 一 n++; n OK; plet 6.68 e[ ])//由结 ? { e * ptrd; // 结 i=0;k=1; //i 当 结 (node[i]) { ptr[i]->data=node[i]; e[i]; if(d) { =ptr[k]; // for(j=2;j<=d;j++) { - }//for }//if i++; gree 指针? ,k 当 储? e)); 子 子? ? 结 ? 格 ? e));

? ?

e)); //k 当 i 与第? 一 个 子k ?之 e)); 1

子 系?

ib=ptr[k]; //当结

?

,



?

?

6.69 e T,int i)// ,初 { d,i+1); f(" "); // i 个空? 格以 f("%c\n",T->data); // T 元素?, d,i+1); ee 分析: 归 ? 是带? ?中 ? . 6.70 e &T)//由 { ar(); if(c=='#') T=NULL; //空子 else { e)); T->data=c; ; ; } n OK; ist 6.71 e T,int i)// 在 { ,初 调 ?i=0 ? ? ? 元素,i 结 所 d=pl; ; n ERR d=pr; ; // 是? ? 符合 A(B,C) 格 ; ? ? 二 ? ? 调 ?i=0 ? 二 ? 元素,i 结 所在

,



?

求,

f(" "); // i 个空? 格以 f("%c\n",T->data); // 元素, ib) ee(p,i+1); // 子 ee 6.72

e(int e,int i)// {

?

? ?

元素,i

结 所在

ee main() { ...

f(" "); // i 个空? 格以 [e].data); // 元素, ;p;p=p->next) ,i+1); // 子

e(T.r,0); //初 ... }//main 6.73 char c; // ,指 当



?i=0

?符 e &T)//由 ? ? 子 ?

{ ar(); e)); T->data=c; ar())=='(') //非 { ; // 第一个 =fc; ib=NULL; ; // } hild=NULL; // 子结 n OK; ist 分析: 给 两个 接 ? 归 ? . 一? 个改 之处? 在 加 6.74 e T)// { f("%c",T->data); ) //非 结 { f("("); ;p;p=p-> ib) ? 子? ? 不配 ? ib=nc,p=nc) // ; ?子 结

, ?

合 ? 一个 格 是 ? 合

在? ?

可 .

?更 一

{ } f(")"); }//if ee 6.75 char c; int pos=0; //pos 是 ,指 分? 配 &T,int &i)//由 { ar(); [pos].data=c; i=pos++; //i 是 部 ,指 当 ar())=='(') //非 结 { st(); =p; =pos; // 子 ? for(;c==',';p=p->next) // 子 { st(T,j); // j =j; } p->next=NULL; }//if hild=NULL; // n OK; ist 分析: 中,pos 起着"分配"结 在 中? 向下? 分 配,因 T ? .r 一 0, 最终 ? po s 6.76 void Print ? GList ? _CTre ? e(CTree ? T,int i)// { print ? f("%c",T.nodes ? [i].data); if(T.nodes ? [i].first ? child ? ) //非 结 { print ? f("("); ? 子? ? 置 作? , 是 是结 数 T.n. ? 子结 ? 分? 配 )); ; // 不配 ? 子? 置 正? 在处理 子? 个? 结 ? ? 子 ? ee(p); f(","); //最 一个 ? 子 不 ? 加

));

for(p=T->first ? child ? ;p;p=p->nexts ? ib) { Print ? Glist ? _CSTr ? ee(T,p->child ? ); if(p->nexts ? ib) print ? f(","); //最 } print ? f(")"); }//if }//Print ? Glist ? _CTre ? e

一个

子 ?



? 加

第七章
7.14 ph &G)// ? 邻接 { h(G); ("%d",&v); ; // m=v; ("%d",&a); ; // m=a; for(m=0;m<v;m++) ar(); // for(m=1;m<=a;m++) { ar(); //t ? 符 数不 ?负 数不 ? 负 有向 ? 数, 数, ?

弧尾,h

弧 ; ; // 找 de)); arc=p; rc);

?

else { } n OK; ist 7.15 // { 中 ?G 有向 权 , 余 况 ? 由 写 h &G, char v)//在邻接矩阵? ? G ? ?v rc=NULL; rc=p;

; m]=v; n OK; h &G,char v,char w)//在邻接矩阵? (v,w) { ; ; ; if(!G.arcs[i][j].adj) { G.arcs[i][j].adj=1; m++; } n OK; h &G,char v)//在邻接矩阵? { m; ; G.vexs[m]<->G.vexs[n]; //将 for(i=0;i<n;i++) { G.arcs[i][m]=G.arcs[i][n]; G.arcs[m][i]=G.arcs[n][i]; //将 } G.arcs[m][m].adj=0; m--; n OK; 分析: 果不把 ? 着 ? 元素 移? 动 , ? ? 最 ? 最? 一个 ? G ? ?v G ?

系? 随 之

一? 个 增? 加 .

话?,



?

,



h &G,char v,char w)//在邻接矩阵? (v,w) { ; ; if(G.arcs[i][j].adj) { G.arcs[i][j].adj=0; m--; } n OK;

G ?

7.16 // ?, 给 ? . 余 请? 自 写 . ? G ? (v,w)

ph &G,char v,char w)//在邻接 { ; ; de)); else { } m++; n OK; 7.17 // ?, 给 ? ? ? . rc=p; ; // 在? rc) ces[i rc=NULL; arc=p;



请? 自 写 G ?

. ?v

ph &G,char v)//在 { ; m; for(i=0;i<n;i++) // { { in; m--; } else // { if(p) { p-> ; ; m--; ; 所有以? v ex==m) // 果 ?



?

第一个? 结

-

);

} }//else }//for for(i=0;i<n;i++) //

所有以? v 尾

{ { out; m--; } else // { if(p) { ; ; m--; ); ; ex==m) // 果 ? 是尾 ? 第一个? 结

} }//else }//for for(i=m;i<n;i++) // 结 ? m之 { [i+1]; //修改 向? ) ex--; ) ex--; //修改 中? } m--; n OK; 7.18 // ?, 给 ?

一? 个

?

.



请? 自 写 . ? ?G

aph &G,char v,char w)////在邻接 (v,w) { ; ; if(G.adj else { ; // } //在 i 中? ; edge->ivex==i) ; 找 edge->jvex==j) ;

);

else { ; // free(q); } //在 i 中? m--; n OK; 7.19 aph &G)// ? 邻接 { ph(G); ("%d",&v); ; // m=v; (%d",&a); ; // m=a; for(m=0;m<v;m++) ar(); // for(m=1;m<=a;m++) { ar(); //t 弧尾,h eVex(G,t))<0) re f(EBox)); p->ivex=i;p->jvex=j; else { edge; (q) { r=q; } }//else // =p;// =p; // 可 i ?尾 部 i 在 ? 结 可 ? 在? 结 ?jvex 中 edge=p; ? vex i 中, ; ; =NULL; // 结 初? edge=p; ? 符 数不 ?负 数不 ? 负 ? 有向 ? 数, 数, ? ; ; 找 );

弧 ; ; //



?

else { edge; (q) { r=q; else q=q->ilnk; } if(r->jvex =p; }//else // j }//for n OK; ist 7.20 h G)// 是 { ? , 1 ? 0 m;x++) m;y++) if(G.arcs[x][y]) { m;z++) n 0;// 不可 }//if n 1; h 分析: 7.21 ph G)// 是 { { { }//for }//for ph x; n 0; x; rc) ? , 1 ? 0 m;x++) rc) 一个邻? 接 储 ?有 向 是不? 是可 ?, ? ?概 是 O(n^2*d). ? 条 件 一个邻? 接矩阵 储? 有向 是? 不是可 ? , =p; ?尾 部 ;

ph G,int m,int n)// ? 0 { n 0; j 7.22 int ZE]; //指 n 1;

有向

?G 中是



(m,n),是

? , 1

rc)

是? 在当

? 径 ? 有向 G ? 中 i ? j

是 ? 有 径,是 { n 1; //i else { ed[i]=1; { k=p-> }//for }//else _DFS 7.23 x;

ph G,int i,int j)// ?, 1 ? 0 是j

-

rc) n 1;//i 下游 j有 ?径

是 ? 有 径,是 { ueue(Q); ue(Q,i);

ph G,int i,int j)// ?, 1 ? 0 ZE]; (Q))

? 有向

G ? 中

i

?

j

{ ue(Q,u); ed[u]=1; { }//for r n 0; _BFS x; n 1; ue(Q,k); rc)

7.24 G)//非 { ZE]; tack(S); x(S,1)); //将第一个 (1); ed=1; (S)) { p(S,i)&&i) { x(G,i); ed[j]) { (j); ed[j]=1; Push(S,j); //向 } (S)) { Pop(S,j); p(S,i); (G,i,j); //向 ed[k]) { (k); ed[k]=1; Push(S,k); } }//if 分析: 是强 ? 7.25 解 ?. 7.26 ph G)// { ZE]; //储 m; ree); 结 ? ? 求 排? 有向 中 ? ve ? 与二? ,所以 第一? 个结 ? 发? 一 非 归? 同,请 问 所有结? . ? 6.37.由 一步? ? ? 归 ?强 G ?

tack(S); m;i++) ree[i]) Push(S,i); //零 coun =0; (S)) { Pop(S,i); new[i]=n--; //记录结 ++; { -}//for x; ree[k])) Push(S,k); ; // 中 在 ? f("Old No:%d New No:%d\n",i,new[i]) n OK; o 分析: 7.27 ZE]; ph G,int i,int j,int k)// ? k ? 径 n 1; //找 else if(k>0) { ed[i]=1; { x; ed[l]) }//for ed[i]=0; // }//else n 0; // 找 _len 7.28 ZE]; // 程中 ? 径? ? n 1; // 问 余 径 ? 减一 在 ? 一条 ?径 中 rc) 一条? 径,且 邻接 ? 储 ?有 向 G ? 逆 ? ? 编 , 可以 邻? 接矩阵 ? 下 矩阵?. ? 逆 ? rc) 结 ?

i {

?是 j



符合? 求

? 结

有 径?,k { path[k]=u; //加 ed[u]=1; if(u==v) //找 {

当 当 一条?

ph G,int u,int v,int k)//求有向 径 ?径 中 径

G ? 中

u

v之 ?



one path!\n"); f("%d",path[i]); // } else { } ed[u]=0; path[k]=0; // 溯 ath main() { ... ath(G,u,v,0); //在 ... }//main 7.29 ph G,int i,int j,int len)//求邻接 ? en l 径条数 n 1; //找 else if(len>0) { sum=0; //sum ed[i]=1; { l=p->adj x; ed[l]) _Len(G,l,j,len-1)// }//for ed[i]=0; // }//else n sum; _Len ? 问 余 径 ? 减一 在 ? 一条 ?径 中 一条? 径,且 ? 储 有? 向 G 数中? 初 调 ,k 应 x; ath(G,l,v,k+1); //继 找 rc)

? {

i

j 之?

符合? 求



? -

径数 rc)

? 结

7.30 ZE]; ZE]; // int cycl nt=0; // ?径 ZE]; //储 发 ? 所 ZE]; //储 当 发? 一个 ? 发 ? 个数 ph G)//求有向 { ed[v]=0; m;v++) ed[v]) DFS(G,v,0); // e ph G,int v,int k)//k { ed[v]=1; path[k]=v; //记录当 { x; ed[w]) DFS(G,w,k+1); else //发 一条? { for(i=0;path[i]!=w;i++); //找 ?起 ycle[j]=path[i+j];//把 ?下 ycle;// 果 ? 加 记? 录 中 ycle[i]=0; // 空 ? 数组 }//else }//for path[k]=0; ed[k]=0; // 有当? 径 ? 结 vis ? ited 真.因 一 结 vi ? 真, 发 ? 一条 ? }//DFS e()// 在 { ZE]; nt;i++) // 是,所有结 ? ycle&#0;; //例 th ? le 第一个结 s[i][k]) //有与之 有 ? 与 th ? le 是 同 ? 同 7 142 是 同 s[i][k]!=0;k++);//在 cycl ? es 一个 向 元素? 同? 一个元素? thi ? e 数组中记录 在? s ?径 rc) ? 中? 所有 ? 当

? 结

当 结



径?

记录? , 添

? 中发

当?

记录中是

?

{ //



?找

{ s[i][k+m];m++) s[i][k+m]; for(n=0;n<k;n++,m++) s[i][n]; //调整 cyc ? les 中 当 记录 ? ? 放 tem ? p数 组中 ycle)) //与 this ? n 1; // m;m++) temp[m]=0; // 空 个数? 组 } }//for n 0; //所有 ? 不与 t ? cle e 分析: 个 ? 是,在 中 ? 当 径?, 当 一个? 结 在? 径之 中 ? 明 在? 一 条 ; 径向? path ? 可以 条 ? ? 所有结 .把 结 ? (例 7) thi ? e 中;由 ? 中,一条 ? 发 几? ,所以 ? 是 ? 在? s 中 记录 , 果 有 ? cy ? cles 一个 向 ? 中 把 cycl . ? es 一个 向 ? 与之 ? . 由 一条 ? 可 有 ? 储 ?, 142 ? 857 同 2857 ? 1 4 1428,所以 调? 整 向 ? , te ? mp 数组,例 ycle 7 第一个结 s 当 向 857 ? 142, 找 ? 中 1,把 1 部分? 提 1 部? 分 ,最终在 te ? mp 中 7,与 this ? ,发 同,因 142 ? 8 57 是同一条 ? ,不予 储. 个 ? , 细? 性?, 理解 ? 可. 望有 给? 更 加 ? . 7.31 ZE]; ZE]; 在第一

? ph G)//求

? 中 ? 结

指 储

?

hed 数组 ?有 向 G

填 强 ?

置? 分 ?

{ =0; ed[v]=0; m;v++) //第一 ? ? fini ? shed 数组 ed[v]) DFS1(G,v); ed[v]=0; // 空 vis ? ited 数组 m-1;i>=0;i--) //第二 逆向? ? { hed(i); ed[v]) { f("\n"); //不同 DFS2(G,v); } 强 ? 分 在不? 同 ?

}//for ph G,int v)//第一 { ed[v]=1; { w= }//for ]=v; //在第一 }//DFS1 ph G,int v)//第二 { ed[v]=1; f("%d",v); //在第二 ? 中 结? in;p;p=p->hli ) { ex; ed[w]) DFS2(G,w); 强 ? 分 ? ? ? ? 同, }//for }//DFS2 分析:求有向 O(n+e). 7.32 e &T)// ? 储 k ?发 , 邻接 结 ? 逆向? ? ? ? 中 ? f ed 数组 ex; ed[w]) DFS1(G,w); ) ? ?

有向? {

G 最

? 生 森林 T ? ,



m;j++) //以下在 Pr ? im if(j!=k) { nt}; }//if st=0; m;i++) { k= { x,k); //把 st=0; x]. rc) st) 条 dge); nt) rc) st=p->cost;

作改? 动

加? 生

森林? 中

}//if

x]={k,p->cost}; 一个? 分 ?

m(G,k); // }//for m

e &T,int i,int j)//把 中? { e(T,i); //找 q=(C q->data=j; if(!p) //起始 { 结 ? 应 i

(i,j)添加

子?

?

T

指针? p , 程略 de)); ?一

不?

森林中? 有

de)); p->data=i; ib); ib=p; =q; } //作 ? 最 ? else i ) // 有? 子 =q; //作 第一个 子? ? else // 有? 子 { ib); ib=q; //作 最? 一个 子? } st main() { ... f(CSTN de)); // T->data=1; m(G,1,T); ... }//main 分析: 个 是? 在Prim ? 模? ?, ? 7.33 t{ int vex; //结 int ecno; //结 所 fo; ZE]; //记录结 ? 所? 分 分 ? ? 数组

? 添加 O(n^2).

非?

?



?

m)//初始化 { m;i++) vexs[i]={i,i}; //初始 态: fo 一个结 ? 不同? 分 ?

fo vexs[ ],int i,int j)// { n 1; n 0;

? i

j 是?

同一? 个



?

fo &vexs[ ],int ec1,int ec2)//合 { for(i=0;vexs[i].vex;i++) if(vexs[i].ecno==ec2) vexs[i].ecno==ec1; _ec

分?

ec1

?e c 2

e &T)//求 最 ? 生 { ? ? m); 分 个? 数

m; // >1) {

et,u,v); // (vexs,u,v)) //u v {

最 不同

? 分?

ee(T,u,v); //加 生 ? 中 _ec(vexs,vexs[u].ecno,vexs[v].ecno); //合 --; } et,u,v); // scal e &T,int i,int j)//把 T 中? { e(T,i); //找 结 ? 应 i 指针? p , 程略 de)); (i,j)添加 中 ?

分?

子?

?

q->data=j; ) // 有? 子 =q; //作 第一个 子? ? else // 有? 子 { ;r->n ib); ib=q; //作 最? 一个 子?

} ee 分析: 一 结 体? ? 结 ? 一个 价? . 在 个结 是? 同一? 个 分 ? ),合 7.34 ph G,int new[ ])// , { ZE]; // ree); tack(S); m;i++) ree[i]) Push(S,i); =0; (S)) { ; //把 { -} ; n OK; eq 7.35 ZE]; vo { { ed[w]=0;// DFS(G,v); // v ? 发 ? m;w++) ed[w]) flag=0; // 果 v 是 ?, x:%d\n",v); }//for oot, 个 求 中不 ? 有 , ? ph G,int v) { 将? 问数组 ?零 ph G)//求有向 m;v++) ? , 果有 话? x; ree[k])) Push(S,k); ? 数组 rc) ? 应分 中? 是? 排 数组? n ew 中 求给有向 ? ? 结 ? 编 数组 ? 价 ?, 个 分? 所 所有 ? ? 初? 始化, 元素是? 价(两个结 价 ?( 分 ) 操作.

?

可以

? 问

所有结?

发生? 误

ed[v]=1; { } }//DFS 7.36 ph &G)// { ree); m;i++) PL(G,i);// MPL ph &G,int i)// { arc) { ces[i].MPL=0; n 0; //零 ? } else { max=0; { x; 直接 PL(G,j); ?继 MP ?L 是当 ? 最 MPL ? if(k>max) max=k; //求 } ces[i]=max+1;//再加一, n max+1; }//else PL 7.37 ZE]; //数组 pat ?h 储当 ZE]; //数组 mlp ? 储 ? 发 最 ph G)//求一个有向? { n=0; ree); m;i++) { 径 ? 径 中最? 径 rc) 一个 ? 发 M ? PL MPL ? 一个零? ?发 MP ? L 有向 ? G添加 M ? PL x; ed[w]) DFS(G,w); rc)

ed[j]=0; ree[i]) DFS(G,i,0);// 一个零? } st Path:"); f("%d",mlp[i]); // h ph G,int i,int len) { ed[i]=1; path[len]=i; arc) // { for(j=0;j<=len;j++) mlp[j]=path[j]; // n=len; } else { { x; ed[j]) DFS(G,j,len+1); } }//else path[i]=0; ed[i]=0; }//DFS 7.38 ph G)// { ree); m;i++) ree[i]) r=i; //找 有向 G(G,i); G ? 有向 rc) 下



始 ?

?



?径



?径

?

?



? 逆

?

ph G,int i)// { ces[i].data; ces[ arc) //c 是 f("%c",c); else //子 达 { arc; 子

以?

i

?



?逆

x); -

x);

f("%c",c); } G 7.39 e T)//在二 { f("%c",T->data); tree 7.40 ph G)//给有向 { ree); m;i++) ree[i]) r=i; //找 有向 mp(G,i); G ? ? ?达 求 d); d); ? 储结 ? 一 ?

ph G,int i)//求子 { else { arc; } 分析: ? v es 向 t{ enum tag{NUM,OPTR}; { ; char optr; }; arc; ype; 7.41 ph G)// { ree); mp 中,邻接



? ;

x); x); ces[i].optr,v2); 元素 修? 改 下:

?



?

径?

m;i++) ree[i]) DFS1(G,i); //第一 m;i++) ree[i]) DFS2(G,i); //第二 m;i++) f("%d",i); // ath vo { { dut=*p->info; } }//DFS1 ph G,int i) { arc) vl[i]=ve[i]; else { { x); dut=*p->info; x]-dut<vl[i]) x]-dut; } }//else }//DFS2 7.42 x]) x]=ve[i]+dut; x); ph G,int i) ree[i]) ve[i]=0; -

? ? ?

: : 径

ve vl

rc)

rc)

void ALGra ? ph_DI ? J(ALGra ? ph G,int v0,Pathm ? atrix ? &P,Short ? estPa ? thTab ? le &D)// 在邻接 储结 ? ? ?拉 { for(v=0;v<G.vexnu ? m;v++) D[v]=INFIN ? ITY; for(p=G.verti ? ces[v0].first ? arc;p;p=p->nexta ? rc) D[p->adjve ? x]=*p->info; //给 D 数组 ? 初 for(v=0;v<G.vexnu ? m;v++) { final ? [v]=0; for(w=0;w<G.vexnu ? m;w++) P[v][w]=0; // 空 径

if(D[v]<INFIN ? ITY) { P[v][v0]=1; P[v][v]=1; } }//for D[v0]=0;final ? [v0]=1; //初始化 for(i=1;i<G.vexnu ? m;i++) { min=INFIN ? ITY; for(w=0;w<G.vexnu ? m;w++) if(!final ? [w]) if(D[w]<min) // 求 ? 最? 径 { v=w; min=D[w]; } final ? [v]=1; for(p=G.verti ? ces[v].first ? arc;p;p=p->nexta ? rc) { w=p->adjve ? x; if(!final ? [w]&&(min+(*p->info)<D[w])) //符合 ? 拉条件 { D[w]=min+edgel ? en(G,v,w); P[w]=P[v]; P[w][w]=1; // 最 径 ? } }//for }//for }//ALGra ? ph_DI ? J 分析: ? 拉 ? 中直接 ? ? 作 ?修 改 .由 在 ? 中, ? 是 尾 同? 处? 理 ,所以可以 ? 邻接 ? 中 一条 ? .

第八章 动态
8.11 t{ ; int size; ck; //空 f(int n)// { 最 ? 分? 配 最



? 理

释? 放

? 分配

?

p(S,b)&&b.size<n) { Pop(S,b); Push(T,b); // } n NULL; // Pop(S,b); b.size-=n; +n,b.size});//分 (T)) { Pop(T,a); Push(S,a); } //恢 ; f nit()//初始化 { ... tack(T); //S T 元素 是 fm ? n}); //一 始, 中 有一? 个 ... }//main 8.12 Fdlf(char *addr,int n)//与 { <addr) { Pop(S,b); Push(T,b); } //在 地 排? { Pop(T,b); ;n+=b.size; } )) //可以与下邻? 合 { Pop(S,b); n+=b.size; } Push(S,{addr,n}); // (T)) { Pop(T,b); 空 ? 中 中找? 合 ? 置 +b.size==addr)) //可以与 一 应 ? 释放 ? 整 ? 程? ? 空 ? 有 ? 空 ? 个? 空 ?

邻? 合

Push(S,b); } //恢 Fdlf 8.13

?

p)//在 ? { n=p->size; f=p+n-1; //f 指向空 底部 if((p-1)->tag&&(f+1)->tag) // 下? 邻 { p->tag=0;f->tag=0; k=p; if(!pav) { =p; =p; } else { ; =pav; =p; } pav=p; }//if else if(!(p-1)->tag&&(f+1)->tag) // 邻 空? { - k; q->size+=n; k=q; f->tag=0; } else if((p-1)->tag&&!(f+1)->tag) //下邻 空? { q=f+1; ; =t; s->rlin =p; p->size+=q->size; - k=p; p->tag=0; } else // 下邻 ? 空 { - k; t=f+1; p

?

动态

储 ?

理系统? 中



?

s->size+=n+t->size; ; ; (t+t->size-1)->up k=s; } BT, 8.14 ,char *addr,int n)// { =addr%(2*n)?(addr-n):(addr+n); //求 ? addr->tag=0; addr->kval=n; ize<n;i++); //找 一 ? 空 ) // 有 ? 空 ? { =addr; =addr; =addr; //作 唯一一? 个 ?空 } else { ) // 空 ? , 合? { =NULL;// 是 ? else { ; ; } // 空 中 去 ? ? new=addr>p?p:addr; //合 ? ,new,2*n); // 归地 ? }//if else // ? , 空? 部? { ; =p; =q; } }//else BS 8.15 und)//把 接? 可 空? , ?指 针 结 储 ? 所有? 空 地 系统 空 ? ? 在 ? 有 细? 述.

?

);//



唯一空?

{ und; head=p; ize) // if(!p->tag) { q->next=p; q=p; }//if p->next=NULL; n head; // ist 8.16 void Mem_C ? ontra ? ct(Heap &H)// { q=MemSt ? art;j=0; for(i=0;i<Max_L ? i stLe ? n;i++) if(H.list[i].stadr ? ->tag) { s=H.list[i].lengt ? h; p=H.list[i].stadr ? ; for(k=0;k<s;k++) *(q++)=*(p++); //紧缩 H.list[j].stadr ? =q; H.list[j].lengt ? h=s; //紧缩 空? j++; } }//Mem_C ? ontra ? ct 第 9.25 le ST,int key)//在有 端 { h+1].key=key; for(i=1;ST.elem[i].key>key;i++); ; n i; h_Sq 分析: 查找? 功 h. 9.26 况下? 查找? ST ? h/2,不 功 况? 下 ? 查找 ? , 在? 高 下 章? H ? 储紧缩 ound) p++; //查找第一个? 空 n NULL; // 有空 ?

指针?

空?

查找

le ST,int key,int low,int high)// { if(low> n 0; //查找不 mid=(low+high)/2; ? 0

半查找

? 归

n mid; else if(ST.elem[mid].key>key) (ST,key,low,mid-1); (ST,key,mid+1,high); } 9.27 le ST,int key)// 个结 { int *r; r=ST.elem; n 0; h; h; (low<=high) { mid=(low+high)/2; if(key>=r[mid].key&&key<r[mid+1].key) //查找结束 n mid; else if(key<r[mid].key) high=mid; else low=mid; } // 不 ? 在查找失 ? 况,不 re ? turn 0; 9.28 t{ y; loc; ; t{ int *elem; h; , 初始? 化 {0,0}以 m; // List; // OCK]; // 起始 半? 查 找 数 ? 置 ? 最 元? 素 , 中 idx ? [0]不 ?条 件 半查找, 或? 查元? 素 最 一?

List L,int key)//分 ? 查找 {

查找,

半查找?

记录? 所 在 ,

; //超 m; =0; (low< { mid=(low+high)/2; =1; y) low=mid+1; else high=mid-1; } loc; // 下 ze-1; // temp=L.elem[i-1]; // 邻元? 素 L.elem[i-1]=key; // 置 ? for(k=j;L.elem[k]!=key;k--); // 查找 L.elem[i-1]=temp; //恢 元素 ; // 找 n k; Seq 分析:在 ? 查找 ?, 果 ?置 元素,以免数据 ? 失 . 9.29 t{ *h; //h 指向最 元素 *t; //t 指向 查找 结 t; ? ) // 半查找记? 录所在



元? 素

?m id y)

,

?



? 邻

t &L,int key)//在有 , { n L.t; else if(L.t->data>key) for(p=L.h,i=1;p->data!=key;p=p->next,i++); else for(p=L.t,i=L.tpos;p->data!=key;p=p->next,i++); L.t=p; //更 t 指针? n p; ist 分析:由 中? 查? 找 是 功? , 所以 理.由 分可? , 在 概 ?况 下, 查找 ? 查? 找 功

?

储? 结

查? 找

? 中 n/3.



? 查找失

?处

9.30 t{ e *pre; int data; e *next; e; t{ e *sp; h; t; // 查找 向 ? ? 向? ? 储结 ?

查找 , 查? 找 { p=L.sp; if(p->data>key) { (p->data>key) p=p->pre; L.sp=p; } else if(p->data<key) { (p->data<key) p=p->next; L.sp=p; } n p; ist 分析: 查找 ? 与? 一 9.31 int last=0,flag=1; e T)// { if(T->data<last) flag=0; //与 last=T->data; n flag; Tree 9.32 int last=0; 二

t &L,int key)//在有 功

同?, 是 n/3.

? T是 二 排 d); ?驱 d);

,是

? , 1

? 0

中 -

e T,int x)//找 ? x 最 元素 { if(last<x&&T->data>=x) //找 f("a=%d\n",last); if(last<=x&&T->data>x) //找 f("b=%d\n",T->data); last=T->data; T 9.33 e T,int x)// 素 { if(T->data<x) exit(); //当 f("%d\n",T->data); _NLT 9.34 e &T,int x)//



排?

T中

?

x



元素 ?

d,x); // 是? ? x 最 元素 ? x 最 元素 d,x);



?

? 二



?

T中所有? 不

x

?元

d,x); ? x 元素 d,x); //

结束 ?中

?



排?

T 中所? 有 不

? 元素结 x

,

释放空 ? { d,x); if(T->data<x) exit(); //当 ? x 元素 q=T; d; free(q); // 果 不? x, ?, 以 (T,x); //继 在 子? 中 9.35 Tree T,int a,int b)// ?元 素

结束

?

子 ?

?



?

继线 ?



?排

T 中? 所

有 ? 且 a b { p=T; d; //找 最 元? 素 (p&&p->data<b) { f("%d\n",p->data); // 符合条? 件 元素 if(p->rtag) p=p->rtag; else

{ } // 中 een 9.36 Tree &T,int x)//在 素x { if(T->data<x) // { if(T->rtag) //T { d; 继线 二 ? 排 ?T 中 元 d; ?继 d;

? 有 子 ,作 子? Node));

q->data=x; d=q;T->rtag=0; d=p; //修改 } }//if else if(T->data>x) // { d) //T 有 { q->data=x; d=q; } }//if ey 9.37

线 ? d,x);//T 有 子 , 子 ?中

子? 中 子 ,作 子? Node));

d=T; //修改自身

?线 , 子 ?中

d,x);//T 有 子

Tree &T,int x)//在 元素 x {

继线

二 ?



? T中

e *pre,*ptr,*suc;//ptr 所在结 ,pre uc 分别指向 ptr p=T;last=NULL; //last 始终指向当 ? 结 p ?一 个( 驱) (!p->ltag) p=p->lch d; //找 中 起? 始 元 素 (p) { if(p->data==x) //找 元素? x结

? 驱

继?

{ pre=last; ptr=p; } else if(last&&last->data==x) suc=p; //找 if(p->rtag) p=p->rtag; else { d; d; } // 中 ?继 last=p; // 中 ? 找 元素? x ; // 找 ?结 ree(ptr); // x结 ? if(pre&&pre->rtag) d=suc; //修改线 n OK; ey x ? 继



继结

?

?, {

线

二?

Tree &T)// 给 结 ? 作 一 改? 动

?



排 ?

子? T

q=T; if(!T->ltag&&T->rtag) //结 子? , 接 ? 子 ? d; else if(T->ltag&&!T->rtag) //结 子? , 接 ? 子 ? d; else if(!T->ltag&&!T->rtag) //结 有 ? 子 有 ?子 { d; (!r->rtag) { s=r; d; //找 结 ? 驱r r ? s } T->data=r->data; // r T ? 结 if(s!=T) d; d; // 接 r 子 ? ? 结 q=r; }//else free(q); // 结 ree 分析: ? 求 x ?结 驱? 继,再 x 结? 办 , 修改线? ? ,直接 驱? 线 指向? 继 ?. 果 在? x结 ? 同 修改? 线 , 问 反 ? 化 .

9.38 e &S)//把二 { if(S-> (T,S); // ge 元素 d); d); //合 子 排 ? S合 ?T 中

e *S)//把 { if(S->data>T->data) { d=S; d,S);



S ?

T

? 合



?

} else if(S->data<T->data) { d=S; d,S); } d=NULL; // 结? ? d=NULL; // 导 ? 结 ?乱 e 分析: 是一个与? 不同? ?. 在合 , 是 修? 改指针 ? 合? . , 元素 个 ? ? 接 一 ? , 将 导? 9.39

子?

系?

程? 中 , 不释放或? ? 把? 一 结 ? 乱.

结? 中

? 两 {



排?

A

B ?,

中A

元? 素

e &B,int x)//把二 排 ? T 分 部 ? x,B 元素 部 x

if(T-> it

d,A,B,x); d,A,B,x); //分 子? e(A,T); e(B,T); //将元素结 ? 合 ? 中

e *S)//把 {



S ? 况

T

? 合



?

if(!T) T=S; // 刚 ? 始分 ?A B 空 else if(S->data>T->data) // 余部分与? 一 同 { d=S; d,S); } else if(S->data<T->data)

{ } 9.40 t{ int data; int bf; 结? de,*Bl d; ee; // lsiz ? e ee T,int k)//在 ? 第k { n NULL; //k 1或 结 ? 数 n T; // 是 个结? >k) d,k); //在 子 中? 找 - ); //在 子 Tree 9.41 t{ H} tag; //结 m; t; // 指针 ILD]; // { ILD];//非 t{ ILD];// 子结 e *next; //指向下一个? 子结 } leaf; } e;//B+ 结 ? ? 指针 ? 接 结 ? 子指针 ? 结? 指针 子 ? 结 排 数? 加1 ? 衡二 排 ? T中 d=NULL; d=NULL; d=S; d,S);

衡二 lsi ? ze

中? 找,

修改? k

查找? ? 置 pos ? {

,

?

子? 结

e *ptr,int pos)//B+ 中 ? 随 指针? p tr 以 在 ? 子结 中

p=T; H) // { } ptr=p;pos=i; n OK; rch 9.42 key)//在 Trie ? ke ? { 结 第? 四 章 ode)); q->kind=LEAF; q->lf.k=key; // 子结 ? klen=key[0]; p=T;i=1; (p&&i<=klen&&p->bh.ptr[ord(key[i])]) { last=p; p=p->bh.ptr[ord(key[i])]; i++; } //自 下查? 找 H) // 果最 ? 分 结 ? ( 同 词): { p->bh.ptr[ord(key[i])]=q; //直接 ?子 p->bh.num++; } else // 果最 ? 子结 ? (有同 词): { ode)); // 分? 结 last->bh.ptr[ord(key[i-1])]=r; // 分 结? 子结 ? ? 一 系? H;r->bh.num=2; r->bh.ptr[ord(key[i])]=q; r->bh.ptr[ord(p->lf.k[i])]=p; // 分 结 ? 与 两个? 子结 ? } _Key 分析:当自 下? 查找结束? , 在两 ? 况.一 况, 中 有 ? ? 同 词, ? 一个 子? 结 ? 分 结 ? 可. 一 况?,有同 词, 把同? 词 子? 结 与 ? , 在 部? 一个? 下一 分? 结 ,再把同 词? ? 子结 ? 分 ? 结 下一? . T中 ? 符串 m&&key!=p->key[i];i++); //在 ; //找不 ? 子结 ?中 查找 [i]; m&&key>p->key[i];i++); // ; // ? ?所 在子 分 向下? 查 找

9.43 key)//在 Trie ? 串 ke ? y { p=T;i=1; { last=p; p=p->bh.ptr[ord(key[i])]; i++; } if(p&&p->kind==LEAF&&p->lf.k=key) //找 { last->bh.ptr[ord(key[i-1])]=NULL; free(p); n OK; } ; // 找 ? 元素 _Key 9.44 able H)// 第一个 线性? 放 ? ? 母 ?H ash 中 所有 ? , ? 元素 H&&i<=key[0]) //查找 ?元 素 T中 ? 符

中处理 ? { for(i=1;i<=26;i++)

ndex]) //线性 f("%s\n",H.elem[j]); int H(char *s)//求 Hash ? 数 { n s[0]-96; //求 n 0; }//H 9.45 ; // &T,int m)// m, { 地 ?处 理 . 地 Ha ? sh ? , Has ?h ,

第? 一个



? 母

( 写)

一组

; f(WORD)); // for(i=0;i<m;i++) T[i]=NULL; key())!=NULL) //

指? 针 向 Inp ? 数 ? ?

{ )); q->data=key;q->next=NULL; n=H(key); if(!T[n]) T[n]=q; //作 第一个结 ? ? else { for(p=T[n];p->next;p=p->next); p->next=q; // 尾? 部 . 不 ? 排 } n OK; 9.46 Statu ? s Locat ? e_Has ? h(HashT ? able H,int row,int col,KeyTy ? pe key,int &k)// 据 ? 在Hash ? ? 矩阵中 ? 元 素 ke ? y 置k ? { h=2*(100*(row/10)+col/10); //作 ?H ash ? 数 while ? (H.elem[h].key&&!EQ(H.elem[h].key,key)) h=(h+1)%20000 ? ; if(EQ(H.elem[h].key,key)) k=h; else k=NULL; }//Locat ? e_Has ? h 分析: 所 ? Has ? h 20 ? 000, 填因子 ? 5 0%,Hash ? 数 数 ? 两 数? 两 所组? 四 数? 再 以二, 线性 ? 处理 ?. 当矩阵 元? 素 是随 分? 布 ,查找 ? ? (1). O



?.


相关文章:
数据结构课后习题答案.doc
数据结构课后习题答案 - 第 1 章绪论 1 .简述下列概念:数据、数据元素、数
严蔚敏版数据结构课后习题答案-完整版.doc
严蔚敏版数据结构课后习题答案-完整版 - 第 1 章 绪论 1.1 简述下列术语
《数据结构》习题集答案(C语言版)严蔚敏.doc
数据结构习题答案(C语言版)严蔚敏 - 第 1 章 绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类 型和抽象数据类型。 解:...
数据结构课后习题答案_图文.pdf
数据结构课后习题答案 - 大学课程《数据结构》课后习题答案 第1章绪论 课后习题讲解 1. 填空 ⑴( )是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和...
数据结构习题与答案.doc
数据结构习题与答案 - 清华大学严蔚敏版数据结构课后习题答案... 数据结构习题与答案_工学_高等教育_教育专区。清华大学严蔚敏版数据结构课后习题答案 ...
数据结构习题及答案.doc
数据结构习题答案 - 数据结构习题 习题一 一、选择题 1、数据结构是一门研究
《数据结构》课后习题答案.doc
数据结构》课后习题答案 - 第1章 绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象 数据类型。 答案: 数据:是客观...
数据结构各章习题及答案.pdf
数据结构各章习题答案 - 第一章 绪论 一、选择题 1.组成数据的基本单位是(
数据结构习题答案.doc
数据结构习题答案 - 选择题: 1-5 DAACB 6-10 CDBDC 11-
数据结构习题(有答案).doc
数据结构习题(有答案) - 第1章 绪 1.1 有下列几种二元组表示的数据结构,
数据结构课程课后习题集答案解析.doc
数据结构课程课后习题答案解析 - 《数据结构简明教程》练习题及参考答案 练习题 1 1. 单项选择题 (1)线性结构中数据元素之间是( )关系。 A.一对多 B.多...
耿国华数据结构习题答案完整.doc
耿国华数据结构习题答案完整 - . 第一章答案 1.3 计算下列程序中 x=x+
清华数据结构习题集答案(C语言版严蔚敏).doc
清华数据结构习题答案(C语言版严蔚敏) - 清华数据结构习题答案(C 语言版
数据结构(c语言版)课后习题答案完整版资料.doc
数据结构(c语言版)课后习题答案完整版资料 - . 第 1 章 绪论 5.选择题
数据结构习题和答案及解析.doc
数据结构习题答案及解析 - WORD 格式 可编辑 第 1 章绪论 课后习题讲解 1. 填空 ⑴( )是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 ...
数据结构习题及参考答案.doc
数据结构习题及参考答案 - 习题 1 一、单项选择题 A1. 数据结构是指( )
数据结构习题解答.pdf
数据结构习题解答 - 习题一 1、简要回答术语:数据,数据元素,数据结构,数据类
数据结构课后习题答案第六章.doc
数据结构课后习题答案第六章 - 第六章树和二叉树(下载后用阅读版式视图或 web
数据结构课程 课后习题答案.doc
数据结构课程 课后习题答案 - 《数据结构简明教程》练习题及参考答案 练习题 1
数据结构习题及答案.doc
数据结构习题答案 - 第一章 1.在数据结构中,从逻辑上可以把数据结构分为(C