第一篇:二叉樹(shù)的創(chuàng)建與訪問(wèn)算法設(shè)計(jì)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
實(shí) 驗(yàn) 報(bào) 告
課程名稱: 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)實(shí)驗(yàn)名稱: 二叉樹(shù)的創(chuàng)建與訪問(wèn)算法設(shè)計(jì) 實(shí)驗(yàn)類型: 驗(yàn)證性□ 綜合性□ 設(shè)計(jì)性□ 實(shí)驗(yàn)室名稱: c機(jī)房 班級(jí):xxxxxxxxx 學(xué)號(hào): xxxxxxxxxxxxxxx 姓名: xxx 組別: 同組人:
成績(jī):
實(shí)驗(yàn)日期: 2011年 6月
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
預(yù)習(xí)報(bào)告成績(jī): 指導(dǎo)教師審核(簽名): 2011年 月 日
預(yù)習(xí)報(bào)告
一.實(shí)驗(yàn)?zāi)康?/p>
本實(shí)驗(yàn)以二叉樹(shù)的創(chuàng)建與訪問(wèn)算法設(shè)計(jì)作為實(shí)驗(yàn)內(nèi)容,掌握樹(shù)型結(jié)構(gòu)的實(shí)現(xiàn)方法,培養(yǎng)解決負(fù)責(zé)問(wèn)題的能力。
二.實(shí)驗(yàn)內(nèi)容
1、編寫生成二叉樹(shù)的函數(shù),二叉樹(shù)的元素從鍵盤輸入;
2、編寫在二叉樹(shù)中插入元素的函數(shù);
3、編寫在二叉樹(shù)中刪除元素的函數(shù);
4、編寫遍歷并輸出二叉樹(shù)的函數(shù)。
方案一采用遞歸算法實(shí)現(xiàn)二叉樹(shù)遍歷算法。方案二采用非遞歸算法實(shí)現(xiàn)二叉樹(shù)遍歷算法。三.實(shí)驗(yàn)要求
1、掌握樹(shù)型結(jié)構(gòu)的機(jī)器內(nèi)表示;
2、掌握樹(shù)型結(jié)構(gòu)之上的算法設(shè)計(jì)與實(shí)現(xiàn);
3、列表對(duì)比分析兩種數(shù)據(jù)結(jié)構(gòu)的相應(yīng)操作的時(shí)間復(fù)雜度、空間復(fù)雜度,闡明產(chǎn)生差異的原因。四.問(wèn)題描述
從鍵盤輸入二叉樹(shù)的元素,建立二叉樹(shù),實(shí)現(xiàn)二叉樹(shù)的遍歷算法。
五.基本要求
實(shí)現(xiàn)以下基本操作:
(1)從鍵盤輸入二叉樹(shù)的元素,建立二叉樹(shù)。(2)實(shí)現(xiàn)二叉樹(shù)的先序遍歷算法。
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
實(shí)驗(yàn)報(bào)告成績(jī): 指導(dǎo)教師審核(簽名): 2011年 月 日
實(shí)驗(yàn)報(bào)告
一 程序清單
#include “stdio.h” #include “string.h” #include
typedef struct BiTNode{ char data;
struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
BiTree Create(BiTree T){
char ch;
ch=getchar();if(ch=='#')T=NULL;else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf(“Error!”);T->data=ch;
T->lchild=Create(T->lchild);T->rchild=Create(T->rchild);}
return T;}
int Depth(BiTree T){
int dep=0,depl,depr;if(!T)dep=0;else {
depl=Depth(T->lchild);depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);}
return dep;}
void main(){ BiTree T;int dep;printf(“請(qǐng)輸入您要?jiǎng)?chuàng)建的二叉樹(shù)!!n
'#'表示空元素!n”);T=Create(T);
printf(“nn您要求的二叉樹(shù)的深度:”);dep=Depth(T);
printf(“%dnn”,dep);} }
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
二 測(cè)試結(jié)果
三 調(diào)試程序出現(xiàn)的問(wèn)題及解決的方法
編程中出現(xiàn)很多的編譯錯(cuò)誤,主要采用對(duì)每個(gè)函數(shù)調(diào)試,設(shè)斷點(diǎn),運(yùn)用自己的程序中,讓我更好的掌握了遞歸算法。四 實(shí)驗(yàn)心得體會(huì)
通過(guò)這次試驗(yàn),讓我鞏固了鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)和遞歸算法的使用,用模塊化思路設(shè)計(jì)程序,編寫程序要小心謹(jǐn)慎,要細(xì)化到每個(gè)函數(shù),通過(guò)多次調(diào)試,才使得整個(gè)程序正確運(yùn)行,達(dá)到預(yù)期結(jié)果。
第二篇:實(shí)驗(yàn)一線性表的創(chuàng)建與訪問(wèn)算法設(shè)計(jì)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
四、編譯程序:
#include
typedef char ElemType;typedef struct LNode
//定義單鏈表結(jié)點(diǎn)類型 {
ElemType data;
struct LNode *next;}LinkList;
LinkList *CreatlinkR(LinkList *L)
//用尾插法建立帶頭結(jié)點(diǎn)的單鏈表 {
LinkList *s, *r;char ch;r =(LinkList *)malloc(sizeof(LinkList));
//創(chuàng)建頭結(jié)點(diǎn)
L = r;s = r;r->next = NULL;printf(“單鏈表元素值為單個(gè)字符, 連續(xù)輸入,$為結(jié)束字符:”);while((ch = getchar())!= '$'){
r =(LinkList *)malloc(sizeof(LinkList));
//創(chuàng)建新結(jié)點(diǎn)
r->data = ch;
r->next = NULL;
s->next = r;
s = r;
} r->next=NULL;
//終端結(jié)點(diǎn)
return(L);}
void Sort(LinkList *h)
//單鏈表元素排序 { LinkList *p=h->next,*q,*t;
if(p!=NULL){
t=p->next;
p->next=NULL;
p=t;
while(p!=NULL)
{
t=p->next;
q=h;
第 頁(yè)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
while(q->next!=NULL&&q->next->data
data)
q=q->next;
//在有序表中找插入*p的前驅(qū)結(jié)點(diǎn)*q
p->next=q->next;
//將*p插到*q之后
q->next=p;
p=t;
} } }
void DispList(LinkList *L)
//輸出單鏈表L {
LinkList *p=L->next;
while(p!=NULL){
printf(“%c ”,p->data);
p=p->next;} }
LinkList *Union(LinkList *La,LinkList *Lb,LinkList *Lc)
{ LinkList *pa=La->next,*pb=Lb->next,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;while(pa!=NULL&&pb!=NULL){
if(pa->data
data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
}
else if(pa->data>pb->data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
tc->next=s;
tc=s;
pb=pb->next;
}
else
{
第 頁(yè)
//求兩有序集合的并集 //復(fù)制結(jié)點(diǎn)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
//重復(fù)元素只復(fù)制一個(gè)
pb=pb->next;
} } if(pb!=NULL)
//復(fù)制余下結(jié)點(diǎn)
pa=pb;while(pa!=NULL){
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
} tc->next=NULL;return(Lc);}
LinkList *InsterSect(LinkList *La,LinkList *Lb,LinkList *Lc)
//求兩有序集合的交集 {
LinkList *pa=La->next,*pb,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;
while(pa!=NULL){
pb=Lb->next;
while(pb!=NULL&&pb->data
data)
pb=pb->next;
if(pb!=NULL&&pb->data==pa->data)
//若pa結(jié)點(diǎn)值在pb中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;}
tc->next=NULL;return(Lc);
第 頁(yè)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
}
LinkList *Subs(LinkList *La,LinkList *Lb,LinkList *Lc)
//求兩有序集合的差集 {
LinkList *pa=La->next,*pb,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;
while(pa!=NULL){
pb=Lb->next;
while(pb!=NULL&&pb->data
data)
pb=pb->next;
if(!(pb!=NULL&&pb->data==pa->data))
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;} tc->next=NULL;return(Lc);}
void main(){
LinkList *La,*Lb,*Lc;
int num=0,loop,j;loop=1;La=CreatlinkR(La);Lb=CreatlinkR(Lb);Sort(La);Sort(Lb);
printf(“有序集合A={ ”);
DispList(La);
printf(“}n”);
printf(“有序集合B={ ”);
DispList(Lb);printf(“}n”);while(loop){
printf(“請(qǐng)選擇您要執(zhí)行的操作:1.求并集
scanf(”%d“,&j);printf(”n%d“,j);
第 頁(yè)
//若pa結(jié)點(diǎn)值不在pb中 2.求交集
3.求差集n”);
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
if(j>=1&&j<=3)
switch(j)
{
case 1: Lc=Union(La,La,Lc);
printf(“集合A與集合B的并集C={ ”);
DispList(Lc);
printf(“}n”);
break;
case 2: Lc=InsterSect(La,Lb,Lc);
printf(“集合A與集合B的交集C={ ”);
DispList(Lc);
printf(“}n”);
break;
case 3: Lc=Subs(La,Lb,Lc);
printf(“集合A與集合B的差集C={ ”);
DispList(Lc);
printf(“}n”);
break;
} printf(“0.結(jié)束
1.繼續(xù)n”);scanf(“%d”,&loop);printf(“n”);} }
五、運(yùn)行結(jié)果:
1.輸入兩個(gè)無(wú)序集合,排序后輸出:
第 頁(yè)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
2.求集合的并集:
3.選1繼續(xù):
第 頁(yè)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
4.求集合的交集:
5.求集合的差集:
第 頁(yè)
內(nèi)蒙古工業(yè)大學(xué)信息工程學(xué)院
6.選0結(jié)束:
第 頁(yè)
第三篇:二叉樹(shù)的構(gòu)造函數(shù)算法BiTree
template
BiTree ::BiTree(BiNode
creat(root);
}
template
void BiTree ::Creat(BiNode
cin>>ch;
if(ch=='# ')root=NULL;//建立一棵空樹(shù)else {
root=new BiNode
Creat(root->lchild);//遞歸建立左子樹(shù)Creat(root->rchild);//遞歸建立右子樹(shù)}
}
第四篇:算法描述與設(shè)計(jì)教案
課型:新課 《算法與程序設(shè)計(jì)》(選修)人教版
教學(xué)目標(biāo):
1.進(jìn)一步理解什么是;算法,知道算法的多樣性
2.能夠?qū)υO(shè)計(jì)的算法做簡(jiǎn)裝的評(píng)價(jià)
3.學(xué)會(huì)利用自然語(yǔ)言、流程圖和偽代碼來(lái)描述算法
教學(xué)內(nèi)容
1.了解什么是算法及其特征 2.學(xué)習(xí)三種描述算法語(yǔ)言
教學(xué)重點(diǎn):通過(guò)例子設(shè)計(jì)算法
教學(xué)難點(diǎn):三種描述算法語(yǔ)言的使用
課時(shí)數(shù):1課時(shí)
正課講解
一、算法是“靈魂”
1.算法存在于人們生活中,如:上街購(gòu)物、顧客付款、營(yíng)業(yè)員(主)找銀等。
2.“韓信點(diǎn)兵問(wèn)題”有不同的求解過(guò)程,就有不同的算法。
有N個(gè)人,除以3,5,7,分別余2,3,2,求N。
3.算法——解決問(wèn)題的方法和步驟。
算法是尼克勞斯.沃斯(N.Writh)提出的,他指出:算法+數(shù)據(jù)結(jié)構(gòu)=程序。
(即算法不能單獨(dú)構(gòu)成程序,它必須和數(shù)據(jù)結(jié)構(gòu)合二為一)
4.算法的發(fā)現(xiàn)
時(shí)間:公元前3000年~公元前1500年 地點(diǎn):巴比倫
巴比倫人求解“算法”的過(guò)程:先用解代數(shù)方法,再計(jì)算實(shí)際數(shù)目,最后寫上一句短句“這就是一個(gè)過(guò)程”。
5.算法的特征
我們?cè)诒仨毿拚n中提過(guò)一點(diǎn)算法,如:冒泡排序法。
例:計(jì)算1+2+3+??+100=?
分析:這個(gè)算法有限制范圍,可以在有限時(shí)間內(nèi)完成,這是算法的第一個(gè)特征:有窮性。計(jì)算此算法可以用紙筆、算盤、運(yùn)算器
和計(jì)算機(jī)來(lái)完成,且計(jì)算過(guò)程是多樣的,但結(jié)果是唯一的。這就是算法的可行性、確定性。
計(jì)算方法:
⑴把這100個(gè)數(shù)按順序相加。
⑵用湊數(shù)法:1+99=100,2+98=100,3+97=100,??,49+51,最后只剩下50和100。
⑶令S=0,使1≤n≤100,先執(zhí)行S=S+n ⑴,再執(zhí)行n=n+1 ⑵
n=1,S=0時(shí),S(0)=1 n=2,S=1時(shí),S(0)=3 n=3,S=3時(shí),S(0)=6
n=4,S=6時(shí),S(0)=10 n=5,S=10時(shí),S(0)=15 n=6,S=15時(shí),S(0)=21??
算法的另外一個(gè)特征:輸入、輸出。
練習(xí):水仙花數(shù)問(wèn)題,如153=1^3+5^3+3^3,分析它應(yīng)滿足什么條件才能使用此方法?
二、如何描述算法
1.用自然語(yǔ)言描述算法
⑴自然語(yǔ)言——人們?nèi)粘I钪惺褂玫恼Z(yǔ)言。
⑵此種語(yǔ)言的特點(diǎn):通俗語(yǔ)易懂,缺乏直觀性和簡(jiǎn)潔,且易產(chǎn)生歧義。
使用此種語(yǔ)言的注意事項(xiàng):描述要求盡可能精確,詳盡。
例:用自然語(yǔ)言描述凱撒密碼的原理
第1步:輸入26個(gè)英文字母,它們分別對(duì)應(yīng)1~26個(gè)數(shù)學(xué)。
第2步:令a=1,k=3,n=26。
第3步:使a的取值范圍為1≤a≤26,F(xiàn)(a)=(a+k)mod n,轉(zhuǎn)第5步。
第4步:a=a+1,轉(zhuǎn)第3步。
第5步:輸出F(a)相對(duì)應(yīng)的數(shù)字。
第6步:把數(shù)學(xué)轉(zhuǎn)化成相當(dāng)?shù)淖帜?,輸出字母?/p>
第7步:累計(jì)字母出現(xiàn)順序,轉(zhuǎn)第4步。
練習(xí):現(xiàn)有一串字母“PROGRAM”給它加密,請(qǐng)?jiān)O(shè)計(jì)算法,用自然語(yǔ)言描述。
2.用流程圖描述算法
⑴特點(diǎn):描述算法形象、直觀,容易理解。
⑵流程圖符號(hào)
3.用偽代碼描述算法
特點(diǎn):描述的算法簡(jiǎn)、易懂,修改容易,容易轉(zhuǎn)化為程序語(yǔ)言代碼。
例:分析課本經(jīng)9頁(yè)算法描述
第一個(gè)條件:y mod 4=0
判斷閏年的條件:⑴y不能被100整除;⑵y能被400整除且y能被400整除。
判斷不是閏年的條件:⑴y mod 4=0 且y mod 100=0,但y不能被400整除;⑵y不能被4整除。
表示條件判斷語(yǔ)句 表示循環(huán)處理語(yǔ)句:
IF 條件 THEN 執(zhí)行語(yǔ)句一 Do While 條件循環(huán)語(yǔ)句
ELSE執(zhí)行語(yǔ)句二 Loop
END IF
條件語(yǔ)句中可以包含多個(gè)子語(yǔ)句
實(shí)踐:用表格比較自然語(yǔ)言、流程圖和偽代碼3種描述方法的優(yōu)缺點(diǎn)。
第五篇:數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析
數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析、計(jì)算機(jī)網(wǎng)絡(luò)、計(jì)算機(jī)組成原理、操作系統(tǒng)原理、編譯原理、數(shù)據(jù)庫(kù)原理及應(yīng)用、軟件工程、軟件測(cè)試等計(jì)算機(jī)基礎(chǔ)理論課程;
網(wǎng)頁(yè)制作、程序設(shè)計(jì)Java、JSP程序設(shè)計(jì)、Oracle、XML程序設(shè)計(jì)、計(jì)算機(jī)網(wǎng)絡(luò)、SSH(Struts+Spring+Hibernate)框架、Java EE程序設(shè)計(jì)、Ajax程序設(shè)計(jì)、Linux+PHP+MySQL程序設(shè)計(jì)、Android手機(jī)開(kāi)發(fā)、UML系統(tǒng)分析與設(shè)計(jì)、性能測(cè)試、自動(dòng)化軟件測(cè)試、軟件質(zhì)量保證、畢業(yè)設(shè)計(jì)及項(xiàng)目綜合實(shí)訓(xùn)等。
數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)網(wǎng)絡(luò)、計(jì)算機(jī)組成原理、操作系統(tǒng)原理、編譯原理、數(shù)據(jù)庫(kù)原理及應(yīng)用、金融學(xué)概論、西方經(jīng)濟(jì)學(xué)等基礎(chǔ)理論課程;
網(wǎng)頁(yè)制作、程序設(shè)計(jì)Java、JSP程序設(shè)計(jì)、J2EE程序設(shè)計(jì)、SQL Server數(shù)據(jù)庫(kù)、Oracle數(shù)據(jù)庫(kù)、Linux操作系統(tǒng)、UML系統(tǒng)分析與設(shè)計(jì)、軟件工程、XML程序設(shè)計(jì)、SSH框架、金融市場(chǎng)學(xué)、ERP財(cái)務(wù)管理、管理信息系統(tǒng)、投資銀行學(xué)、商業(yè)銀行學(xué)、國(guó)際金融管理、畢業(yè)設(shè)計(jì)及項(xiàng)目綜合實(shí)訓(xùn)等專業(yè)課程。
數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)網(wǎng)絡(luò)、計(jì)算機(jī)組成原理、操作系統(tǒng)原理、數(shù)據(jù)庫(kù)原理及應(yīng)用、軟件工程、軟件測(cè)試等計(jì)算機(jī)基礎(chǔ)理論課程;
網(wǎng)頁(yè)制作、程序設(shè)計(jì)Java、JSP程序設(shè)計(jì)、J2EE程序設(shè)計(jì)、XML程序設(shè)計(jì)、Ajax程序設(shè)計(jì)、SSH框架、Android手機(jī)開(kāi)發(fā)、Linux+PHP+MySQL程序設(shè)計(jì)、SQL Server數(shù)據(jù)庫(kù)、Linux操作系統(tǒng)、UML系統(tǒng)分析與設(shè)計(jì)、軟件項(xiàng)目管理、行業(yè)標(biāo)準(zhǔn)與規(guī)范、IT服務(wù)管理、IT職業(yè)英語(yǔ)、畢業(yè)設(shè)計(jì)及項(xiàng)目綜合實(shí)訓(xùn)等專業(yè)課程