第一篇:北京科技大學(xué)數(shù)據(jù)結(jié)構(gòu)試驗(yàn)報(bào)告(附錄含代碼)
一、1)功能描述
輸入數(shù)據(jù)(設(shè)為整型)建立單鏈表,并求相鄰兩節(jié)點(diǎn)data值之和為最大的第一節(jié)點(diǎn)。2)詳細(xì)設(shè)計(jì)
遵循鏈表建立的基本思想,建立一個(gè)新的鏈表,H為表頭,r為新節(jié)點(diǎn),p為表尾節(jié)點(diǎn)指針,沒存入一個(gè)新的數(shù)據(jù)則申請一個(gè)新的節(jié)點(diǎn),知道沒有數(shù)據(jù)輸入,利用循環(huán)和打擂臺(tái)法,比較和的大小,并輸出。3)測試分析
程序調(diào)試完成后,選取兩組數(shù)據(jù)進(jìn)行測試,都得出了正確結(jié)果(數(shù)據(jù)以0為結(jié)束符,若有相同和,則取第一組)結(jié)果截圖
4)心得體會(huì)
通過做第一題,學(xué)習(xí)到鏈表的建立以及鏈表里指針的使用,并且復(fù)習(xí)了比較法里面的打擂臺(tái)法。
二、1)功能描述
實(shí)現(xiàn)算術(shù)表達(dá)式求值程序(棧的運(yùn)用),輸入中綴表達(dá)式,可將其轉(zhuǎn)換成后綴表達(dá)式 2)詳細(xì)設(shè)計(jì)
本題目的程序是根據(jù)課本上的程序改進(jìn)之后得出的,課本上有完整的程序,但是有bug,按照課本上的程序,結(jié)果會(huì)出現(xiàn)“燙燙燙燙燙”,原因是對于優(yōu)先級的比較沒有處理好,因此加了兩行代碼,將優(yōu)先級的比較處理好,即現(xiàn)在的程序。3)測試分析
程序調(diào)試完成后,選取題目所給的式子進(jìn)行測試,得出了正確后綴表達(dá)式結(jié)果 結(jié)果截圖
4)心得體會(huì)
通過做第二題,對于課本上的知識表示得出“實(shí)踐出真知”的真理,即使書上的東西也不一定就是正確的,尤其是代碼,最好是個(gè)人自己真正實(shí)踐一下。
三、1)功能描述
實(shí)現(xiàn)鏈?zhǔn)疥?duì)列運(yùn)算程序(隊(duì)列的運(yùn)用)2)詳細(xì)設(shè)計(jì)
本題目是隊(duì)列相關(guān)應(yīng)用,隊(duì)列和棧是相反的,隊(duì)列是先進(jìn)的先出,因此輸入12345,先出的是1,本著隊(duì)列的這一特性,根據(jù)課本所學(xué)的隊(duì)列的算法,設(shè)計(jì)了如下程序。3)測試分析
程序調(diào)試完成后,選取12345進(jìn)行測試,后綴加0,則一個(gè)字符出隊(duì),只輸入0,則繼續(xù)出隊(duì),輸入@,則打印剩余全部元素。結(jié)果截圖
4)心得體會(huì)
通過做第三題,對于隊(duì)列的特點(diǎn)有了更加深刻的認(rèn)識,尤其區(qū)分隊(duì)列與棧的不同點(diǎn),需要特別注意。
四、1)功能描述
①構(gòu)造關(guān)于F的Huffman樹;
②求出并打印D總各字符的Huffman編碼。2)詳細(xì)設(shè)計(jì)
本題目是Huffman樹的應(yīng)用以及Huffman編碼的應(yīng)用,參照課本上關(guān)于Huffman樹的建立以及Huffman編碼的應(yīng)用的實(shí)現(xiàn),將所給數(shù)據(jù)依權(quán)值最小原則建立Huffman樹,并實(shí)現(xiàn)Huffman編碼。3)測試分析
程序調(diào)試完成后,給出數(shù)據(jù)abcdefgh,相應(yīng)頻率為12345678,運(yùn)行代碼得出結(jié)果如圖。同時(shí)選取另一組數(shù)據(jù)測試也得出了正確結(jié)論
結(jié)果截圖
4)心得體會(huì)
通過做第四題,對于Huffman樹有了更加深刻的體會(huì),同時(shí)練習(xí)也使得對課本知識進(jìn)行實(shí)踐,有助于更好的理解Huffman樹的算法。
五、1)功能描述
設(shè)英文句子:“everyone round you can hear you when you speak.”(1)依次讀入句中各單詞,構(gòu)造一棵二叉排序樹;(2)按LDR遍歷此二叉排序樹。
LDR: can everyone hear round speak when you(有序)
2)詳細(xì)設(shè)計(jì)
本題目是有關(guān)二叉樹的建立和中序遍歷的,二叉樹作為數(shù)據(jù)存儲(chǔ)一個(gè)很重要的結(jié)構(gòu),它的建立也是很重要的。本題目代碼設(shè)計(jì)上采用課本上的對于二叉樹建立的方法,將所給單詞以二叉樹形式建立并存儲(chǔ),然后中序遍歷的到字典順序。3)測試分析
程序調(diào)試完成后,給出單詞串everyone round you can hear you when you speak,運(yùn)行代碼得出中序遍歷結(jié)果如圖。結(jié)果截圖
4)心得體會(huì)
通過做第五題,練習(xí)運(yùn)用二叉樹模型解決了一些實(shí)際問題如現(xiàn)實(shí)中字典的編排問題,在熟悉算法的基礎(chǔ)上,同時(shí)得出結(jié)論,好的算法可以應(yīng)用與實(shí)際生活生產(chǎn),使之更為便捷。
附錄 程序代碼 實(shí)驗(yàn)一:
#include“stdio.h” #include“malloc.h” typedef struct node {
int data;
struct node *next;}list,*List;List Creatlist()
//建立鏈表函數(shù) { List H,p,r;
//H為表頭,r為新節(jié)點(diǎn),p為表尾節(jié)點(diǎn)指針
H=(List)malloc(sizeof(list));
//建立頭節(jié)點(diǎn)
r=H;
p=(List)malloc(sizeof(list));
//申請新節(jié)點(diǎn)
while(scanf(“%d”,p)&&p->data!=0)//輸入數(shù)據(jù),直到為零(結(jié)束標(biāo)志)
{
r->next=p;//新節(jié)點(diǎn)鏈入表尾
r=p;
p=(List)malloc(sizeof(list));
} r->next=NULL;//將尾節(jié)點(diǎn)的指針域置空
return H;
//返回已創(chuàng)建的頭節(jié)點(diǎn) } List Adjmax(List H)//比較相鄰兩數(shù)之和
{
//返回相鄰兩數(shù)之和最大的第一個(gè)數(shù)指針
List p,r,q;int sum=0;p=H->next;if(H->next ==NULL)//判斷是否為空
{
printf(“Empty List!”);
q=(List)malloc(sizeof(list));
q->data =0;}
while(p!=NULL)//比較相鄰兩數(shù)之和
{
r=p->next;
if(p&&r)
if(r->data+p->data>sum)
{
q=p;
sum=r->data +p->data;}//不斷賦給sum新的最大值
else;
p=p->next;} return q;} int main(){ char ch;printf(“/// 請輸入整形數(shù)據(jù),以空格隔開,0結(jié)束。/// n”);printf(“Ready? nY/N(enter 'y' or 'Y' to continue)n”);while(scanf(“%c”,&ch)&&(ch=='Y'||ch=='y'))
{
List H,pmax;
H=Creatlist();
pmax=Adjmax(H);
printf(“相鄰兩數(shù)之和最大的第一個(gè)數(shù)為:%dnContinue?
Y/N
free(H);
scanf(”%c“,&ch);} return 0;}
”,pmax->data);實(shí)驗(yàn)二:
#include
struct node *next;//后繼指針 }snode,*slink;int Emptystack(slink S)//檢測???{ if(S==NULL)return(1);else return(0);} char Pop(slink*top)//出棧 { char e;slink p;if(Emptystack(*top))return(-1);//??辗祷?/p>
else {
e=(*top)->data;//取棧頂元素
p=*top;*top=(*top)->next;//重置棧頂指針
free(p);return(e);} } void Push(slink*top,char e)//進(jìn)棧 { slink p;p=(slink)malloc(sizeof(snode));//生成進(jìn)棧p節(jié)點(diǎn)
p->data=e;//存入元素e p->next=*top;//p節(jié)點(diǎn)作為新的棧頂鏈入
*top=p;} void Clearstack(slink*top)//置空棧 { slink p;while(*top!=NULL){
p=(*top)->next;
Pop(top);//依次彈出節(jié)點(diǎn)直到???/p>
*top=p;} *top=NULL;} char Getstop(slink S)//取棧頂 { if(S!=NULL)return(S->data);return(0);} //符號優(yōu)先級比較
int Precede(char x,char y)//比較x是否“大于”y { switch(x){
case '(':x=0;break;case '+': case '-':x=1;break;case '*': case '/':x=2;break;default: x=-1;} switch(y){ case '+': case '-':y=1;break;case '*': case '/':y=2;break;case '(':y=3;break;default: y=100;} if(x>=y)return(1);else return(0);} //中后序轉(zhuǎn)換
void mid_post(char post[],char mid[])//中綴表達(dá)式mid到后綴表達(dá)式post的轉(zhuǎn)換的算法 { int i=0,j=0;char x;
slink S=NULL;//置空棧 Push(&S,'#');//結(jié)束符入棧 do { x=mid[i++];//掃描當(dāng)前表達(dá)式分量x switch(x){ case '#':
{ while(!Emptystack(S))
post[j++]=Pop(&S);
}
}break;case ')':
{ while(Getstop(S)!='(')
post[j++]=Pop(&S);//反復(fù)出棧直至遇到'('
Pop(&S);//退掉'('
}break;case '+': case '-': case '*': case '/': case '(':
{ while(Precede(Getstop(S),x))//棧頂運(yùn)算符(Q1)與x比較
post[j++]=Pop(&S);//Q1>=x時(shí),輸出棧頂符并退棧
Push(&S,x);//Q1 }break;default:post[j++]=x;//操作數(shù)直接輸出 } }while(x!='#');post[j]='