唐策善數(shù)據(jù)結(jié)構(gòu)答案-用C語言描述原版_第1頁
唐策善數(shù)據(jù)結(jié)構(gòu)答案-用C語言描述原版_第2頁
唐策善數(shù)據(jù)結(jié)構(gòu)答案-用C語言描述原版_第3頁
唐策善數(shù)據(jù)結(jié)構(gòu)答案-用C語言描述原版_第4頁
唐策善數(shù)據(jù)結(jié)構(gòu)答案-用C語言描述原版_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第二章 線性表(參考答案)2.1 頭指針:指向鏈表的指針。因?yàn)閷︽湵淼乃胁倬鑿念^指針開始,即頭指針具有標(biāo)識鏈表的作用,所以鏈表的名字往往用頭指針來標(biāo)識。如:鏈表的頭指針是la,往往簡稱為“鏈表la”。頭結(jié)點(diǎn):為了鏈表操作統(tǒng)一,在鏈表第一元素結(jié)點(diǎn)(稱為首元結(jié)點(diǎn),或首結(jié)點(diǎn))之前增加的一個結(jié)點(diǎn),該結(jié)點(diǎn)稱為頭結(jié)點(diǎn),其數(shù)據(jù)域不無實(shí)際意義(當(dāng)然,也可以存儲鏈表長度,這只是副產(chǎn)品),其指針域指向頭結(jié)點(diǎn)。這樣在插入和刪除中頭結(jié)點(diǎn)不變。開始結(jié)點(diǎn):即上面所講第一個元素的結(jié)點(diǎn)。2.2 只設(shè)尾指針的單循環(huán)鏈表,從尾指針出發(fā)能訪問鏈表上的任何結(jié)點(diǎn)。23 設(shè)線性表存放在向量A的前elenum個分量中,且遞增有序。協(xié)議

2、算法將X插入適當(dāng)位置、void insert(ElemType A,int elenum,ElemType x)/ 向量A目前有elenum個元素,且遞增有序,本算法將x插入到向量A中,并保持向量的遞增有序。 int i=0,j; while (ielenum & Ai=i;j-) Aj+1=Aj;/ 向后移動元素 Ai=x; / 插入元素 / 算法結(jié)束24 void rightrotate(ElemType A,int n,k)/ 以向量作存儲結(jié)構(gòu),本算法將向量中的n個元素循環(huán)右移k位,且只用一個輔助空間。 int num=0; / 計(jì)數(shù),最終應(yīng)等于n int start=0; / 記錄開始

3、位置(下標(biāo)) while (numn) temp=Astart; /暫存起點(diǎn)元素值,temp與向量中元素類型相同 empty=start; /保存空位置下標(biāo) next=(start-K+n) %n; / 計(jì)算下一右移元素的下標(biāo) while (next !=start) Aempty=Anext;/ 右移 num+; / 右移元素數(shù)加1 empty=next; next=(next-K+n) %n; / 計(jì)算新右移元素的下標(biāo) Aempty=temp; / 把一輪右移中最后一個元素放到合適位置num+;start+; / 起點(diǎn)增1,若numnext, *pre=L,*s;/ p為工作指針,指向當(dāng)前

4、元素,pre為前驅(qū)指針,指向當(dāng)前元素的前驅(qū) s=(linklist *)malloc(sizeof(linklist);/申請空間,不判斷溢出s-data=x;while (p & p-datanext; / 查找插入位置 pre-next=s; s-next=p; / 插入元素 / 算法結(jié)束 26void invert(linklist *L)/ 本算法將帶頭結(jié)點(diǎn)的單鏈表L逆置。 /算法思想是先將頭結(jié)點(diǎn)從表上摘下,然后從第一個元素結(jié)點(diǎn)開始,依次前插入以L為頭結(jié)點(diǎn)的鏈表中。 linklist *p=L-next,*s;/ p為工作指針,指向當(dāng)前元素,s為p的后繼指針 L-next=null;/

5、頭結(jié)點(diǎn)摘下,指針域置空。算法中頭指針L始終不變 while (p)s=p-next; / 保留后繼結(jié)點(diǎn)的指針 p-next=L-next; / 逆置 L-next=p; p=s; / 將p指向下個待逆置結(jié)點(diǎn) / 算法結(jié)束 27(1) int length1(linklist *L)/ 本算法計(jì)算帶頭結(jié)點(diǎn)的單鏈表L的長度 linklist *p=L-next; int i=0;/ p為工作指針,指向當(dāng)前元素,i 表示鏈表的長度 while (p) i+; p=p-next; return(i); / 算法結(jié)束(2) int length1(node saMAXSIZE)/ 本算法計(jì)算靜態(tài)鏈表s中

6、元素的個數(shù)。 int p=sa0.next, i=0;/ p為工作指針,指向當(dāng)前元素,i 表示元素的個數(shù),靜態(tài)鏈指針等于-1時鏈表結(jié)束while (p!=-1) i+; p=sap.next; return(i); / 算法結(jié)束 28void union_invert(linklist *A,*B,*C)/ A和B是兩個帶頭結(jié)點(diǎn)的遞增有序的單鏈表,本算法將兩表合并成 / 一個帶頭結(jié)點(diǎn)的遞減有序單鏈表C,利用原表空間。 linklist *pa=A-next,*pb=B-next,*C=A,*r;/ pa,pb為工作指針,分別指向A表和B表的當(dāng)前元素,r為當(dāng)前逆置/元素的后繼指針, 使逆置元素的

7、表避免斷開。 /算法思想是邊合并邊逆置,使遞增有序的單鏈表合并為遞減有序的單鏈表。 C-next=null;/頭結(jié)點(diǎn)摘下,指針域置空。算法中頭指針C始終不變 while (pa & pb) / 兩表均不空時作 if (pa-datadata) / 將A表中元素合并且逆置 r=pa-next; / 保留后繼結(jié)點(diǎn)的指針 pa-next=C-next; / 逆置 C-next=pa; pa=r; / 恢復(fù)待逆置結(jié)點(diǎn)的指針 else / 將B表中元素合并且逆置 r=pb-next; / 保留后繼結(jié)點(diǎn)的指針 pb-next=C-next; / 逆置 C-next=pb; pb=r; / 恢復(fù)待逆置結(jié)點(diǎn)的

8、指針 / 以下while (pa)和while (pb)語句,只執(zhí)行一個 while (pa) / 將A表中剩余元素逆置 r=pa-next; / 保留后繼結(jié)點(diǎn)的指針 pa-next=C-next; / 逆置 C-next=pa; pa=r; / 恢復(fù)待逆置結(jié)點(diǎn)的指針 while (pb) / 將B表中剩余元素逆置 r=pb-next; / 保留后繼結(jié)點(diǎn)的指針 pb-next=C-next; / 逆置 C-next=pb; pb=r; / 恢復(fù)待逆置結(jié)點(diǎn)的指針 free(B);/釋放B表頭結(jié)點(diǎn) / 算法結(jié)束 29 void deleteprior(linklist *L)/ 長度大于1的單循環(huán)

9、鏈表,既無頭結(jié)點(diǎn),也無頭指針,本算法刪除*s 的前驅(qū)結(jié)點(diǎn) linklist *p=s-next,*pre=s; / p為工作指針,指向當(dāng)前元素,/ pre為前驅(qū)指針,指向當(dāng)前元素*p的前驅(qū) while (p-next!=s) pre=p; p=p-next; / 查找*s的前驅(qū) pre-next=s;free(p); / 刪除元素 / 算法結(jié)束 210void one_to_three(linklist *A,*B,*C)/ A是帶頭結(jié)點(diǎn)的的單鏈表,其數(shù)據(jù)元素是字符字母、字符、數(shù)字字符、其他字符。本算法/將A表分成 / 三個帶頭結(jié)點(diǎn)的循環(huán)單鏈表A、B和C,分別含有字母、數(shù)字和其它符號的同一類字

10、符,利用原表空間。 linklist *p=A-next,r;/ p為工作指針,指向A表的當(dāng)前元素,r為當(dāng)前元素的后繼指針,使表避免斷開。 /算法思想是取出當(dāng)前元素,根據(jù)是字母、數(shù)字或其它符號,分別插入相應(yīng)表中。 B=(linklist *)malloc(sizeof(linklist);/申請空間,不判斷溢出B-next=null; / 準(zhǔn)備循環(huán)鏈表的頭結(jié)點(diǎn) C=(linklist *)malloc(sizeof(linklist);/申請空間,不判斷溢出C-next=null; / 準(zhǔn)備循環(huán)鏈表的頭結(jié)點(diǎn) while(p) r=p-next; / 用以記住后繼結(jié)點(diǎn) if (p-data=a&

11、p-datadata=A& p-data next=A-next; A-next=p; / 將字母字符插入A表 else if (p-data=0&p-datanext=B-next; B-next=p; / 將數(shù)字字符插入B 表 else p-next=C-next; C-next=p;/ 將其它符號插入C 表 p=r; / 恢復(fù)后繼結(jié)點(diǎn)的指針 /while / 算法結(jié)束 211void locate(dlinklist *L)/ L是帶頭結(jié)點(diǎn)的按訪問頻度遞減的雙向鏈表,本算法先查找數(shù)據(jù)x,/ 查找成功時結(jié)點(diǎn)的訪問頻度域增1,最后將該結(jié)點(diǎn)按頻度遞減插入鏈表中適當(dāng)位置。 linklist *p

12、=L-next,*q;/p為工作指針,指向L表的當(dāng)前元素,q為p的前驅(qū),用于查找插入位置。while (p & p-data !=x) p=p-next; / 查找值為x的結(jié)點(diǎn)。 if (!p) return (“不存在值為x的結(jié)點(diǎn)”);else p-freq+; / 令元素值為x的結(jié)點(diǎn)的freq域加1 。p-next-prir=p-prior; / 將p結(jié)點(diǎn)從鏈表上摘下。 p-prior-next=p-next;q=p-prior; / 以下查找p結(jié)點(diǎn)的插入位置 while (q !=L & q-freqprior;p-next=q-next; q-next-prior=p;/ 將p結(jié)點(diǎn)插入

13、 p-prior=q; q-next=p; / 算法結(jié)束 第三章 棧和隊(duì)列(參考答案)3.3 void sympthy(linklist *head, stack *s)/判斷長為n的字符串是否中心對稱 int i=1; linklist *p=head-next;while (idata); p=p-next; if (n % 2 !=0) p=p-next;/ 奇數(shù)個結(jié)點(diǎn)時跳過中心結(jié)點(diǎn) while (p & p-data=pop(s) p=p-next;if (p=null) printf(“鏈表中心對稱”);else printf(“鏈表不是中心對稱”); / 算法結(jié)束 3.4int m

14、atch()/從鍵盤讀入算術(shù)表達(dá)式,本算法判斷圓括號是否正確配對(init s;/初始化棧sscanf(“%c”,&ch);while (ch!=#) /#是表達(dá)式輸入結(jié)束符號switch (ch) case (: push(s,ch); break;case ): if (empty(s) printf(“括號不配對”); exit(0);pop(s);if (!empty(s) printf(“括號不配對”); else printf(“括號配對”); / 算法結(jié)束 3.5typedef struct / 兩棧共享一向量空間 ElemType vm; / ??捎每臻g0m-1 int top

15、2 / 棧頂指針twostack;int push(twostack *s,int i, ElemType x)/ 兩棧共享向量空間,i是0或1,表示兩個棧,x是進(jìn)棧元素,/ 本算法是入棧操作 if (abs(s-top0 - s-top1)=1) return(0);/ 棧滿 else switch (i)case 0: s-v+(s-top)=x; break;case 1: s-v-(s-top)=x; break;default: printf(“棧編號輸入錯誤”); return(0);return(1); / 入棧成功 / 算法結(jié)束 ElemType pop(twostack *s

16、,int i)/ 兩棧共享向量空間,i是0或1,表示兩個棧,本算法是退棧操作 ElemType x;if (i!=0 & i!=1) return(0);/ 棧編號錯誤 else switch (i)case 0: if(s-top0=-1) return(0);/??誩lse x=s-vs-top-;break;case 1: if(s-top1=m) return(0);/棧空else x=s-vs-top+; break;default: printf(“棧編號輸入錯誤”);return(0);return(x); / 退棧成功 / 算法結(jié)束 ElemType top (twostack

17、 *s,int i)/ 兩棧共享向量空間,i是0或1,表示兩個棧,本算法是取棧頂元素操作 ElemType x;switch (i)case 0: if(s-top0=-1) return(0);/??誩lse x=s-vs-top; break;case 1: if(s-top1=m) return(0);/棧空else x=s-vs-top; break;default: printf(“棧編號輸入錯誤”);return(0);return(x); / 取棧頂元素成功 / 算法結(jié)束 36void Ackerman(int m,int n)/ Ackerman 函數(shù)的遞歸算法 if (m=0

18、) return(n+1);else if (m!=0 & n=0) return(Ackerman(m-1,1);else return(Ackerman(m-1,Ackerman(m,n-1) / 算法結(jié)束 37(1) linklist *init(linklist *q)/ q是以帶頭結(jié)點(diǎn)的循環(huán)鏈表表示的隊(duì)列的尾指針,本算法將隊(duì)列置空 q=(linklist *)malloc(sizeof(linklist);/申請空間,不判斷空間溢出q-next=q;return (q); / 算法結(jié)束 (2) linklist *enqueue(linklist *q,ElemType x)/ q是

19、以帶頭結(jié)點(diǎn)的循環(huán)鏈表表示的隊(duì)列的尾指針,本算法將元素x入隊(duì) s=(linklist *)malloc(sizeof(linklist);/申請空間,不判斷空間溢出s-next=q-next; / 將元素結(jié)點(diǎn)s入隊(duì)列 q-next=s;q=s; / 修改隊(duì)尾指針 return (q); / 算法結(jié)束 (3) linklist *delqueue(linklist *q)/q是以帶頭結(jié)點(diǎn)的循環(huán)鏈表表示的隊(duì)列的尾指針,這是出隊(duì)算法 if (q=q-next) return (null); / 判斷隊(duì)列是否為空 else linklist *s=q-next-next; / s指向出隊(duì)元素 if (s

20、=q) q=q-next; / 若隊(duì)列中只一個元素,置空隊(duì)列else q-next-next=s-next;/ 修改隊(duì)頭元素指針 free (s); / 釋放出隊(duì)結(jié)點(diǎn) return (q); / 算法結(jié)束。算法并未返回出隊(duì)元素 3.8 typedef structElemType datam;/ 循環(huán)隊(duì)列占m個存儲單元 int front,rear; / front和rear為隊(duì)頭元素和隊(duì)尾元素的指針 / 約定front指向隊(duì)頭元素的前一位置,rear指向隊(duì)尾元素 sequeue; int queuelength(sequeue *cq)/ cq為循環(huán)隊(duì)列,本算法計(jì)算其長度 return (c

21、q-rear - cq-front + m) % m; / 算法結(jié)束 3.9 typedef structElemType sequm;/ 循環(huán)隊(duì)列占m個存儲單元 int rear,quelen; / rear指向隊(duì)尾元素,quelen為元素個數(shù)sequeue;(1) int empty(sequeue *cq)/ cq為循環(huán)隊(duì)列,本算法判斷隊(duì)列是否為空 return (cq-quelen=0 ? 1: 0); / 算法結(jié)束 (2) sequeue *enqueue(sequeue *cq,ElemType x)/ cq是如上定義的循環(huán)隊(duì)列,本算法將元素x入隊(duì)if (cq-quelen=m)

22、return(0); / 隊(duì)滿 else cq-rear=(cq-rear+1) % m; / 計(jì)算插入元素位置 cq-sequcq-rear=x; / 將元素x入隊(duì)列 cq-quelen+; / 修改隊(duì)列長度 return (cq); / 算法結(jié)束 ElemType delqueue(sequeue *cq)/ cq是以如上定義的循環(huán)隊(duì)列,本算法是出隊(duì)算法,且返回出隊(duì)元素 if (cq-quelen=0) return(0); / 隊(duì)空 else int front=(cq-rear - cq-quelen + 1+m) % m;/ 出隊(duì)元素位置 cq-quelen-; / 修改隊(duì)列長度 r

23、eturn (cq-sequfront); / 返回隊(duì)頭元素 / 算法結(jié)束第四章 串 (參考答案)4.2 用串的去其他運(yùn)算構(gòu)成子串的定位運(yùn)算index。 int index(string s,t)/s,t是字符串,本算法求子串t在主串s中的第一次出現(xiàn),若s串中包含t串,返回其/第一個字符在s中的位置,否則返回0m=length(s); n=length(t);i=1;while(i=m-n+1)if(strcmp(substr(s,i,n),t)=0) break;else i+;if(inext; q=Y-next; pre=p;while (p & q) ch=p-data; / 取X中的

24、字符 while (q & q-data!=ch) q=q-next; / 和Y中字符比較 if (!q) return(ch); / 找到Y(jié)中沒有的字符 else pre=p-next; / 上一字符在Y中存在,p=pre; / 取X中下一字符。 q=Y-next; / 再從Y的第一個字符開始比較return(null); / X中字符在Y中均存在 / 算法結(jié)束 4.6 是設(shè)計(jì)一算法,在順序串上實(shí)現(xiàn)串的比較運(yùn)算 strcmp(s,t)int strcmp(seqstring *S, seqstring *T)/ S和T是指向兩個順序串的指針,本算法比較兩個串的大小,若S串大于T串,返回1;若

25、S串等于T串,返回0;否則返回-1 int i=0;while (s-chi!=0 & t-chi!=0)if (s-chit-chi) return(1);else if (s-chichi) return(-1);else i+; / 比較下一字符 if (s-chi!=0& t-chi=0) return(1);else if (s-chi=0& t-chi!=0) return(-1);else return(0);/ 算法結(jié)束4.7 linkstring *invert(linkstring *S, linkstring *T)/ S和T是用帶頭結(jié)點(diǎn)的結(jié)點(diǎn)大小為1的單鏈表表示的串,S

26、是主串,T是/ 模式串。本算法是先模式匹配,查找T在S中的第一次出現(xiàn)。如模式匹/ 配成功,則將S中的子串(T串)逆置。linkstring *pre,*sp, *tp; pre=S; / pre是前驅(qū)指針,指向S中與T匹配時,T 中的前驅(qū) sp=S-next; tp=T-next;/sp 和tp分別是S和T串上的工作指針 while (sp & tp)if (sp-data=tp-data) / 相等時后移指針 sp=sp-next; tp=tp-next;else / 失配時主串回溯到下一個字符,子串再以第一個字符開始pre=pre-next; sp=pre-next; tp=T-next;

27、if (tp!=null) return (null); / 匹配失敗,沒有逆置 else / 以下是T串逆置 tp=pre-next; / tp是逆置的工作指針,現(xiàn)在指向待逆置的第一個字符pre-next=sp; / 將S中與T串匹配時的前驅(qū)指向匹配后的后繼 while (tp!=sp) r=tp-next;tp-next=pre-next;pre-next=tp;tp=r/ 算法結(jié)束 第五章 多維數(shù)組和廣義表(參考答案)5.1 A2323A0000 , A0001 , A0002 A0010 , A0011 , A0012 A0100 , A0101 , A0102 A0110 , A01

28、11 , A0112 A0200 , A0201 , A0202 A0210 , A0211 , A0212 將第一維的0變?yōu)?后,可列出另外18個元素。以行序?yàn)橹鳎葱袃?yōu)先)時,先改變右邊的下標(biāo),從右到左進(jìn)行。5.2 設(shè)各維上下號為c1d1,c2d2,c3d3,每個元素占l個單元。LOC(aijk)=LOC(ac1c2c3)+(i-c1)*(d2-c2+1)*(d3-c3+1)+(j-c2)*(d3-c3+1)+(k-c3)*l推廣到n維數(shù)組!(下界和上界)為(ci,di),其中1=i=n.則:其數(shù)據(jù)元素的存儲位置為:LOC(aj1j2.jn)=LOC(ac1c2cn)+(d2-c2+1)

29、(dn-cn+1)(j1-c1)+(d3-c3+1) (dn-cn+1)n(j2-c2)+(dn-cn+1)(jn-1-cn-1)+(jn-cn)*l=LOC(ac1c2c3)+ i(ji-ci) i=1n其中i(dk-ck+1)(1=ilchild);br=height(bt-rchild);return(blbr? bl+1: br+1); / 左右子樹高度的大者加1(根) / 算法結(jié)束 6.227,19,2,6,32,3,21,10其對應(yīng)字母分別為a,b,c,e,f,g,h。哈夫曼編碼:a:0010b:10c:00000d:0001e:01f:00001g:11h:0011第七章 圖(參

30、考答案)71(1)鄰接矩陣中非零元素的個數(shù)的一半為無向圖的邊數(shù);(2)Aij= =0為頂點(diǎn),I 和j無邊,否則j和j有邊相通;(3)任一頂點(diǎn)I的度是第I行非0元素的個數(shù)。73(1)鄰接表(2)從頂點(diǎn)4開始的DFS序列:V5,V3,V4,V6,V2,V1(3)從頂點(diǎn)4開始的BFS序列:V4,V5,V3,V6,V1,V276簡單回路指起點(diǎn)和終點(diǎn)相同的簡單路徑。算法基本思想是利用圖的遍歷,以頂點(diǎn)VK開始,若遍歷中再通到VK,則存在簡單回路,否則不存在簡單回路。Adjlisttp g ; visited1.n=0;Int found =0;/全程變量Int dfs(btxptr x)/從k頂點(diǎn)深度優(yōu)先

31、遍歷圖g,看是否存在k的簡單回路 visitedx=1;p=gx.firstarc;while(p!=null) w=p-adjvex;if(w= =k) found=1;exit(0);/有簡單回路,退出if (!visitedk ) dfs(w );p=p-nextarc;/while(p!=null)/ dfs711void toposort_dfs (graph g;vtptr v)/從頂點(diǎn)v開始,利用深度優(yōu)先遍歷對圖g進(jìn)行拓?fù)渑判颉?基本思想是利用棧s存放頂點(diǎn),首先出棧的頂點(diǎn)是出度為0的頂點(diǎn),是拓?fù)湫蛄兄凶詈笠粋€頂/點(diǎn)。若出棧元素個數(shù)等于頂點(diǎn)數(shù),則拓?fù)渑判虺晒?,輸出的是逆拓?fù)渑判蛐蛄?/p>

32、。 visited1.n=0;top=0;num=0;/初始化;top為棧頂指針,num記出棧元素數(shù)s+top=v;/頂點(diǎn)入棧while (top!=0) w=firstadj(g,v);/求頂點(diǎn)v的第一鄰接點(diǎn)while (w!=0) / w!=0的含義是w存在 if ( !visitedw) s+top=w;w=nextadj(g,v,w);/求下一個鄰接點(diǎn)if (top!=0) v=stop-; num+; printf(v);/輸出頂點(diǎn)printf(“n”);if (num=i+1;j-) / 向前起泡,一趟有一最小冒出 if (rjrj-1; exchange=1; / 有交換 for

33、 (j= i+1;j=n-I;j+) / 向后起泡,一趟有一最大沉底 if (rjrj+1) rjrj+1; exchange=1; / 有交換 i+; / end of WHILE exchange /算法結(jié)束 8.6void QuickSort(rectype rn+1; int n)/ 對r1.n進(jìn)行快速排序的非遞歸算法 typedef struct int low,high; nodenode sn+1;int top;int quickpass(rectype r,int,int); / 函數(shù)聲明 top=1; stop.low=1; stop.high=n;while (top0)

34、ss=stop.low; tt=stop.high; top-;if (ss1) top+; stop.low=ss; stop.high=k-1;if (tt-k1) top+; stop.low=k+1; stop.high=tt; / 算法結(jié)束 int quickpass(rectype r;int s,t)i=s; j=t; rp=ri; x=ri.key;while (ij)while (ij & x=rj.key) j-;if (ij) ri+=rj; while (i=rj.key) i+;if (i0)k=quickpass(r,ss,tt);if (k-sstt-k) / 一

35、趟排序后分割成左右兩部分 if (k-ss1) / 左部子序列長度大于右部,左部進(jìn)棧 top+; stop.low=ss; stop.high=k-1; if (tt-k1) ss=k+1; / 右部短的直接處理 else flag=false; / 右部處理完,需退棧 else if (tt-k1) /右部子序列長度大于左部,右部進(jìn)棧 top=top+1; stop.low=k+1; stop.high=tt; if (k-ss1) tt=k-1 / 左部短的直接處理 else flag=false / 左部處理完,需退棧 if (!flag & top0)ss=stop.low; tt=s

36、top.high; top-; flag=true; / end of while (flag | top0) / 算法結(jié)束 int quickpass(rectype r;int s,t)/ 用“三者取中法”對8.6進(jìn)行改進(jìn) int i=s, j=t, mid=(s+t)/2; rectype tmp;if (ri.keyrmid.key) tmp=ri;ri=rmid;rmid=tmp if (rmid.keyrj.key)tmp=rj;rj=rmid;if (tmpri) rmid=tmp; else rmid=ri;ri=tmp tmp=ri;ri=rmid;rmid=tmp / 三者

37、取中:最佳2次比較3次移動;最差3次比較10次移動 rp=ri; x=ri.key;while (ij)while (ij & x=rj.key) j-;if (ij) ri+=rj; while (i=rj.key) i+;if (ij) rj-=ri;ri=rp; return (i); / 一次劃分算法結(jié)束 8.8viod searchjrec(rectype r,int j)/在無序記錄rn中,找到第j(0=jn)個記錄。算法利用快速排序思想,找到第一/軸元素的位置i,若i=j則查找結(jié)束。否則根據(jù)ji在0i、1或i+1n+1之間查/找,直到/i=j為止。 int quichpass (

38、rectype r,int,int) / 函數(shù)聲明i=quichpass(r,0,n-1); / 查找樞軸位置whilehile(i!=j)if (ji) i=quichpass(r,0.i-1);else i=quichpass(r,i+1.n-1);/ searchjrec算法結(jié)束8.9viod rearrange (rectype r,int n)/本算法重排具有n個元素的數(shù)r,使取負(fù)值的關(guān)鍵字放到取非負(fù)值的關(guān)鍵字之前。 int i=0,j=n-1; rp=r0;while(ij)while(i=0) j-;if(ij) ri+=rj;/取負(fù)值關(guān)鍵字記錄放到左面while(ij&ri.k

39、ey0) i+;if(ij) rj-=ri/ 取非負(fù)值關(guān)鍵字記錄放到右面/while(ij)8.9void arrange(rectype rn+1; int n)/ 對r1.n進(jìn)行整理,使關(guān)鍵字為負(fù)值的記錄排在非負(fù)值的記錄之前 int i=0, j=-1;rp=r0; while (ij) while (i=0) j-;if (ij) ri+=rj; /將關(guān)鍵字取負(fù)值的記錄放到前面while (ij & ri.key0) i+;if (inext;while (p-next!=null) / 剩最后一個元素時,排序結(jié)束 q=p; / 設(shè)當(dāng)前結(jié)點(diǎn)為最小 s=p-next; / s指向待比較結(jié)點(diǎn)

40、 while (s!=null)if (s-dataq-data) s=s-next;else q=s; s=s-next; / 用指向新的最小 if (q!=p) x=q-data; q-data=p-data; p-data=x; p=p-next; / 鏈表指針后移,指向下一個最小值結(jié)點(diǎn) /算法結(jié)束 8.14 void CountSort(rectype r; int n);/ 對r0.n-1進(jìn)行計(jì)數(shù)排序 int cn = 0;/ c數(shù)組初始化,元素值指其在r中的位置。如ci=j,(0=i,jn)/ 則意味著ri 應(yīng)在r的第 j 位置上。for (i=0;in;i+) / 一趟掃描比較選出大小,給數(shù)組 c 賦值for (j=i+1;jrj) ci=ci+1else cj=cj+1;for (i=0;ik) i-;if (i0 & ri.key=k) return(i); else return(0) / 算法結(jié)束 查找過程的判定樹是單支樹。查找成功的平均查找長度為ASL=PICI =1/n*i = 1/2*(n+1)查找不成功的平均查找長度為 ASL=1/(n+1)(i+(n+1)=(n+2)/2.9

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論