版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)實驗報告-動態(tài)查找表實驗報告數(shù)據(jù)結(jié)構(gòu)實驗報告題目:動態(tài)查找表學(xué)院計算機專業(yè)計算機科學(xué)與技術(shù)年級班別2009級 2 班學(xué)號3109005935學(xué)生姓名黃麗敏指導(dǎo)教師吳偉民成績_2011年6月 一. 動態(tài)查找表: 抽象數(shù)據(jù)類型動態(tài)查找表的定義如下:adt dynamicsearchtable數(shù)據(jù)對象d:d是具有相同特性的數(shù)據(jù)元素的集合。各個數(shù)據(jù)元素均含有類型相同,可唯一標(biāo)識數(shù)據(jù)元素的關(guān)鍵字數(shù)據(jù)關(guān)系r:數(shù)據(jù)元素同屬一個集合?;静僮鱬:initdstable(&dt);操作結(jié)果:構(gòu)造一個空的動態(tài)查找表dt。destroydstable(&dt)初始條件:動態(tài)查找表dt存在。操作結(jié)果:銷毀動態(tài)
2、查找表dt。searchdstable(dt,key);初始條件:動態(tài)查找表dt存在,key為和關(guān)鍵字類型相同的給定值。操作結(jié)果:若dt中存在其關(guān)鍵字等于key的數(shù)據(jù)元素,則函數(shù)值為該元素的值或在表中的位置,否則為“空”。insertdstable(&dt,e);初始條件:動態(tài)查找表dt存在,e為待插入的數(shù)據(jù)元素。操作結(jié)果:若dt中不存在其關(guān)鍵字等于e.key的數(shù)據(jù)元素,則插入e到dt。deletedstable(&dt,key);初始條件:動態(tài)查找表dt存在,key為和關(guān)鍵字類型相同的給定值。操作結(jié)果:若dt中存在其關(guān)鍵字等于key的數(shù)據(jù)元素,則刪除之。traversedstable(dt,
3、visit();初始條件:動態(tài)查找表dt存在,visit是對結(jié)點操作的應(yīng)用函數(shù)。操作結(jié)果:按某種次序?qū)t的每個結(jié)點調(diào)用函數(shù)visit()一次且至多一次,一旦visit()失敗,則操作失敗。adt dynamicsearchtable二. 存儲結(jié)構(gòu)定義:公用頭文件ds0.h和宏定義:#include /* eof(=z或f6),null */#include#define true 1#define false 0#define ok 1#define n 10 /* 數(shù)據(jù)元素個數(shù) */typedef int status; /* status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如ok等 *
4、/typedef int keytype; /* 設(shè)關(guān)鍵字域為整型 */#define eq(a,b) (a)=(b)#define lt(a,b) (a) 二叉排序樹存儲結(jié)構(gòu): 二叉排序樹的類型bitree定義如下:typedef int keytype; /* 設(shè)關(guān)鍵字域為整型*/typedef structkeytype key;int others; elemtype; /* 數(shù)據(jù)元素類型*/typedef elemtype telemtype;typedef struct bitnodetelemtype data;struct bitnode *lchild,*rchild; /*
5、 左右孩子指針*/bitnode,*bitree;三、算法設(shè)計:/* 操作結(jié)果: 構(gòu)造一個空的動態(tài)查找表dt */status initdstable(bitree *dt)*dt=null;return ok;/* 初始條件: 動態(tài)查找表dt存在。操作結(jié)果: 銷毀動態(tài)查找表dt */void destroydstable(bitree *dt) /* 同bo6-2.c */if(*dt) /* 非空樹*/if(*dt)-lchild) /* 有左孩子*/destroydstable(&(*dt)-lchild); /* 銷毀左孩子子樹*/if(*dt)-rchild) /* 有右孩子*/de
6、stroydstable(&(*dt)-rchild); /* 銷毀右孩子子樹*/free(*dt); /* 釋放根結(jié)點*/*dt=null; /* 空指針賦0 */* 在根指針t所指二叉排序樹中遞歸地查找某關(guān)鍵字等于key的數(shù)據(jù)元素,*/* 若查找成功,則返回指向該數(shù)據(jù)元素結(jié)點的指針,否則返回空指針。*/ bitree searchbst(bitree t,keytype1 key) if(!t)|eq(key,t-data.key)return t; /* 查找結(jié)束*/else if lt(key,t-data.key) /* 在左子樹中繼續(xù)查找*/return searchbst(t-l
7、child,key);elsereturn searchbst(t-rchild,key); /* 在右子樹中繼續(xù)查找*/* 在根指針t所指二叉排序樹中遞歸地查找其關(guān)鍵字等于key的數(shù)據(jù)元素,若查找*/* 成功,則指針p指向該數(shù)據(jù)元素結(jié)點,并返回true,否則指針p指向查找路徑上*/* 訪問的最后一個結(jié)點并返回false,指針f指向t的雙親,其初始調(diào)用值為null */void searchbst1(bitree *t,keytype1 key,bitree f,bitree *p,status *flag)if(!*t) /* 查找不成功*/*p=f;*flag=false;else if
8、eq(key,(*t)-data.key) /* 查找成功*/*p=*t;*flag=true;else if lt(key,(*t)-data.key)searchbst1(&(*t)-lchild,key,*t,p,flag); /* 在左子樹中繼續(xù)查找*/elsesearchbst1(&(*t)-rchild,key,*t,p,flag); /* 在右子樹中繼續(xù)查找*/* 當(dāng)二叉排序樹t中不存在關(guān)鍵字等于e.key的數(shù)據(jù)元素時,插入e并返回true,*/* 否則返回false。*/status insertbst(bitree *t, elemtype1 e)bitree p,s;sta
9、tus flag; searchbst1(t,e.key,null,&p,&flag); if(!flag) /* 查找不成功*/s=(bitree)malloc(sizeof(bitnode);s-data=e;s-lchild=s-rchild=null;if(!p)*t=s; /* 被插結(jié)點*s為新的根結(jié)點*/else if lt(e.key,p-data.key)p-lchild=s; /* 被插結(jié)點*s為左孩子*/elsep-rchild=s; /* 被插結(jié)點*s為右孩子*/return true;elsereturn false; /* 樹中已有關(guān)鍵字相同的結(jié)點,不再插入*/* 從
10、二叉排序樹中刪除結(jié)點p,并重接它的左或右子樹。*/void delete(bitree *p)bitree q,s;if(!(*p)-rchild) /* 右子樹空則只需重接它的左子樹(待刪結(jié)點是葉子也走此分支)*/q=*p;*p=(*p)-lchild;free(q);else if(!(*p)-lchild) /* 只需重接它的右子樹*/q=*p;*p=(*p)-rchild;free(q);else /* 左右子樹均不空*/q=*p;s=(*p)-lchild;while(s-rchild) /* 轉(zhuǎn)左,然后向右到盡頭(找待刪結(jié)點的前驅(qū))*/q=s; s=s-rchild; (*p)-d
11、ata=s-data; /* s指向被刪結(jié)點的前驅(qū)(將被刪結(jié)點前驅(qū)的值取代被刪結(jié)點的值)*/if(q!=*p)q-rchild=s-lchild; /* 重接*q的右子樹*/elseq-lchild=s-lchild; /* 重接*q的左子樹*/free(s);/* 若二叉排序樹t中存在關(guān)鍵字等于key的數(shù)據(jù)元素時,則刪除該數(shù)據(jù)元素結(jié)點,*/* 并返回true;否則返回false。*/status deletebst(bitree *t,keytype1 key)if(!*t) /* 不存在關(guān)鍵字等于key的數(shù)據(jù)元素*/return false;elseif eq(key,(*t)-data.
12、key) /* 找到關(guān)鍵字等于key的數(shù)據(jù)元素*/delete(t);else if lt(key,(*t)-data.key)deletebst(&(*t)-lchild,key);elsedeletebst(&(*t)-rchild,key);return true;/* 初始條件: 動態(tài)查找表dt存在,visit是對結(jié)點操作的應(yīng)用函數(shù)*/* 操作結(jié)果: 按關(guān)鍵字的順序?qū)t的每個結(jié)點調(diào)用函數(shù)visit()一次且至多一次*/void traversedstable(bitree dt,void(*visit)(elemtype1)if(dt)traversedstable(dt-lchil
13、d,visit); /* 先中序遍歷左子樹*/visit(dt-data); /* 再訪問根結(jié)點*/ traversedstable(dt-rchild,visit); /* 最后中序遍歷右子樹*/ 四、編譯:1.初次編譯會出現(xiàn)很多錯誤,這主要是寫程序時的粗心大意還有一些潛在的定于或邏輯錯誤,第一次運行如下:2.錯誤很多,經(jīng)過一番調(diào)試才發(fā)現(xiàn)定義結(jié)構(gòu)體時出了問題,有些沒用到,有些重定義了,調(diào)試后如下:3.此時只剩下很少錯誤,很明顯是i未定義,經(jīng)過修改調(diào)試后編譯通過。五、測試void print(elemtype c) /*以下主函數(shù)調(diào)用*/printf(%d,%d) ,c.key,c.other
14、s);void main() /*用于測試二叉排序樹的查找*/char q;bitree dt,p;int i,select;keytype j;elemtype k;elemtype r10=45,1,12,2,53,3,3,4,37,5,24,6,100,7,61,8,90,9,70,10; /* 測試數(shù)據(jù)*/ initdstable(&dt); /* 構(gòu)造空表*/for(i=0;iinsertbst(&dt,ri); /* 依次插入數(shù)據(jù)元素*/h1: printf(=動態(tài)查找表演示系統(tǒng)=);printf(n);printf(1、遍歷原有表n);printf(2、查找表內(nèi)值n);print
15、f(3、刪除表內(nèi)值n);printf(4、插入一個值n);printf(5、銷毀表n);printf(6、退出系統(tǒng));printf(n);printf(請選擇你需要的操作(16):);scanf(%d,&select);switch(select)h2: case 1:printf(原有的表遍歷如下:n);traversedstable(dt,print);printf(n);printf(按任意鍵返回.);getchar();getchar();system(cls);goto h1;h3: case 2:printf(原有的表遍歷如下:n);traversedstable(dt,print
16、);printf(n);printf(n請輸入你要查找的值:);scanf(%d,&j);p=searchbst(dt,j);if(p)printf(n查找成功:);printf(%d,%d),p-data.key,p-data.others);/getchar();getchar();printf(n是否繼續(xù)查找?(y/n):);q=getchar();getchar();if(q=y|q=y) else system(cls);goto h1;elseprintf(查找失敗,表中無此值,是否繼續(xù)查找?(y/n):);getchar();q=getchar();if(q=y|q=y)goto
17、 h2;elsesystem(cls);goto h1;h4: case 3:printf(原有的表遍歷如下:n);traversedstable(dt,print);printf(n);printf(n請輸入你要刪除的值:);scanf(%d,&j);/getchar();/q=getchar();p=searchbst(dt,j);if(p)printf(刪除此值后:n);deletebst(&dt,j);traversedstable(dt,print);printf(n是否繼續(xù)刪除?(y/n):);getchar();q=getchar();if(q=y|q=y)goto h4;els
18、esystem(cls);goto h1; elseprintf(刪除失敗,表中無此值,請按任意鍵返回繼續(xù).);printf(n);getchar();getchar();goto h4;h5: case 4:printf(原有的表遍歷如下:n);traversedstable(dt,print);printf(n);printf(請輸入你要插入的值:);scanf(%d,&k.key);p=searchbst(dt,k.key);if(!p)printf(插入此值后:n);k.others=k.others+(n+1);insertbst(&dt,k);traversedstable(dt,print);printf(n);printf(是否繼續(xù)插入新值?(y|n):);getchar();q=getchar();if(q=y|q=y)goto h5;elsesyste
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版商務(wù)車租賃合同(含保險責(zé)任條款)
- 二零二五版合作開發(fā)房地產(chǎn)合同綠色建筑認證3篇
- 2025年綠色建筑土石方工程承包合同樣本2篇
- 2025年度菜園大棚蔬菜種植與農(nóng)業(yè)科技研發(fā)合同3篇
- 2025版路燈設(shè)施安全檢查與應(yīng)急搶修服務(wù)合同4篇
- 二零二四年醫(yī)療耗材配件銷售代理合同樣本3篇
- 2025年度工業(yè)用地場地租賃及使用權(quán)轉(zhuǎn)讓合同3篇
- 2025年度車輛租賃與道路救援服務(wù)合同3篇
- 2025年新能源汽車專用車位租賃與充電服務(wù)合同2篇
- 2025年度房地產(chǎn)項目融資合同8篇
- 家庭年度盤點模板
- 河南省鄭州市2023-2024學(xué)年高二上學(xué)期期末考試 數(shù)學(xué) 含答案
- 2024年資格考試-WSET二級認證考試近5年真題集錦(頻考類試題)帶答案
- 試卷中國電子學(xué)會青少年軟件編程等級考試標(biāo)準(zhǔn)python三級練習(xí)
- 公益慈善機構(gòu)數(shù)字化轉(zhuǎn)型行業(yè)三年發(fā)展洞察報告
- 飼料廠現(xiàn)場管理類隱患排查治理清單
- 【名著閱讀】《紅巖》30題(附答案解析)
- Starter Unit 2 同步練習(xí)人教版2024七年級英語上冊
- 分數(shù)的加法、減法、乘法和除法運算規(guī)律
- 2024年江蘇鑫財國有資產(chǎn)運營有限公司招聘筆試沖刺題(帶答案解析)
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
評論
0/150
提交評論