




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(一)提交日期:班級(jí)名稱(chēng)線性表姓名67線性表是最簡(jiǎn)單的線性結(jié)構(gòu)。線性表的主要操作特點(diǎn)是可以在任意位置插入和刪除一個(gè)數(shù)據(jù)元素。一、線性表的順序存儲(chǔ)結(jié)構(gòu)線性表的順序存儲(chǔ)結(jié)構(gòu)的本質(zhì)是:在邏輯上相鄰的兩個(gè)數(shù)據(jù)元素ai-1,ai,在存儲(chǔ)地址中也是相鄰的,既地址連續(xù)。我們采用的是含靜態(tài)一維數(shù)組和線性表長(zhǎng)的結(jié)構(gòu)體。測(cè)試數(shù)據(jù)與運(yùn)行記錄如下:步驟一,建立線性表。輸入“1”?;剀?chē)鍵入,得到“n=?”輸入的n即為線性表所要存儲(chǔ)的元素長(zhǎng)度,由于建立線性表時(shí)已規(guī)定MAXSIZE=20,因此所輸入的n應(yīng)該小于等于20。此處實(shí)驗(yàn)輸入n=6。然后,將想要插入的數(shù)據(jù)元素分別輸入數(shù)據(jù)域data0到data5?;剀?chē)
2、鍵入,程序得出一段由6個(gè)數(shù)據(jù)元素組成的如下圖所示的線性鏈表。測(cè)試 數(shù)據(jù) 與運(yùn) 行記 錄鏈表數(shù)據(jù)為:1,2,3,4,5,6。*'C:LlserslenovoDesktop5S5sHt5Debog1,exe'1 .建立線性表2 .在i瓦亶插入元素e3 .刪除第i個(gè)元素,返回其值4 .查找值為e的元素6 .結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(L2,3,4,6)1門(mén)=?6data0=?1data1=?2data2二73data3=?4data4=75data5=?6123456打回車(chē)鍵,繼續(xù)。4.查找值為e的元素6.結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(L2,3,4,6)4e=?4已找到,元素位置是4e
3、=?10未找到T最后,程序運(yùn)行完畢,回車(chē)退出。二、線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)線性表鏈?zhǔn)酱鎯?chǔ)的操作同樣包括幾個(gè)方面:線性表的建立、元素的插入、刪除、查詢等。其本質(zhì)是:在邏輯上相鄰的兩個(gè)數(shù)據(jù)元素ai-1,ai,在存儲(chǔ)地址中可以不相鄰,既地址不連續(xù)。根據(jù)指針域的不同和結(jié)點(diǎn)的構(gòu)造鏈的方式不同,鏈表主要有單鏈表、單循環(huán)鏈表和雙向循環(huán)鏈表。其中,單鏈表是最經(jīng)常使用的鏈表。試據(jù)運(yùn)記 測(cè)數(shù)與行錄步驟一,建線性鏈表選擇“1”。輸入元素組成一個(gè)鏈表。鏈表的建立與順序表不同,它是一種動(dòng)態(tài)結(jié)構(gòu)。建立線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的過(guò)程就是一個(gè)動(dòng)態(tài)生成鏈表的過(guò)程。因此每輸入一個(gè)元素即重新分配新的結(jié)點(diǎn),本次實(shí)驗(yàn)輸入元素為:5,1,2,3
4、,4,5,6,7。步驟二,插入元素鏈表和順序表的插入運(yùn)算不同,順序表在插入時(shí)要移動(dòng)大量的結(jié)點(diǎn),而鏈表在插入時(shí)不需要移動(dòng)結(jié)點(diǎn),但需要移動(dòng)指針來(lái)進(jìn)行位置的查找。先使p指向ai-1,然后生成一個(gè)數(shù)據(jù)域值為x的新結(jié)點(diǎn)*s,再進(jìn)行插入操作。2 .在i位置插入元素日&刪除第i個(gè)元素,返回其值4 .查找值為e的元素5 .結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,2,3,4,5)2i產(chǎn)?5,115123114567步驟三,刪除第i個(gè)元素選擇“3”,回車(chē)鍵入,輸入想要?jiǎng)h掉的第“i”個(gè)元素工刪除第i個(gè)元素,返回其值4 .查找值為e的元素5 .結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,2,3,4,5)3i=7251311456
5、7步驟四,查找元素6 .查找值為e的元素7 .結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(L2,3,4,5)4e=74已找到,元素位置是5最后,程序運(yùn)行完畢,回車(chē)退出。一、線性表的順序結(jié)構(gòu)存儲(chǔ)(1)創(chuàng)建順序表create_listL并輸出表out_listL(注:本程序中未進(jìn)行順序表的初始化InitListL,其效果與create_listL的效果一樣,據(jù)部實(shí)總的序程 根本分驗(yàn)結(jié)程流對(duì)實(shí)驗(yàn)無(wú)影響。)/*建立線性表*/voidcreat_list(SqList*L)inti;printf("nn=?");scanf("%d”,&L->length);for(i=0;i
6、<L->length;i+)printf("ndata%d=?",i);scanf("%d”,&(L->ai);/*creat_list*/【說(shuō)明】由于函數(shù)中要改變參數(shù)L的一維數(shù)組MAXSIZE的值,因此參數(shù)L應(yīng)設(shè)計(jì)為輸出型參數(shù),即L設(shè)計(jì)為SqList的指針類(lèi)型,否則,一維數(shù)組子域的修改值將不能帶回去。(2)插入數(shù)據(jù)元素insert_sqvoidinsert_sq(SqList*L,inti,ElemTypee)intj;if(L->length=MAXSIZE)printf("noverflow!");else
7、if(i<1|i>L->length+1)printf("nerroei!");elsefor(j=L->length-1;j>i-1;j-)L->aj+1=L->aj;/*向后移動(dòng)數(shù)據(jù)元素*/L->ai-1=e;/*插入元素*/L->length+;/*線性表長(zhǎng)加1*/*insert_sq*/【說(shuō)明】數(shù)據(jù)元素個(gè)數(shù)size比數(shù)組下標(biāo),即參數(shù)i的值大1,所以插入位置參數(shù)i應(yīng)大于等于0且小于等于宏定義的MAXSIZE20.當(dāng)參數(shù)i不在上述區(qū)間內(nèi)時(shí),即可判定參數(shù)出錯(cuò)。數(shù)組的存儲(chǔ)空間是有限的,若當(dāng)前已存滿數(shù)組的MAXSIZE的存
8、儲(chǔ)空間,則不能繼續(xù)插入。(注:本程序先把存儲(chǔ)單元i-1至存儲(chǔ)單元i中的數(shù)據(jù)元素依次后移,然后把數(shù)據(jù)元素e插入到存儲(chǔ)單元i中,最后把數(shù)據(jù)元素+1.)(3)刪除數(shù)據(jù)元素delete_sqElemTypedelete_sq(SqList*L,inti)據(jù)部實(shí)總的序程 根本分驗(yàn)結(jié)程流ElemTypex;intj;if(L->length=0)printf("n是空表。underflow!”);elseif(i<1|i>L->length)printf("nerrori!");x=-1;elsex=L->ai-1;for(j=i;j<=L
9、->length-1;j+)L->aj-1=L->aj;L->length-;return(x);/*delete_sq*/【說(shuō)明】若順序表中當(dāng)前沒(méi)有一個(gè)數(shù)據(jù)元素,則無(wú)法進(jìn)行刪除,判斷為函數(shù)調(diào)用出錯(cuò)。刪除位置參數(shù)i應(yīng)大于等于0且小于等于i-1,當(dāng)參數(shù)i不在上述區(qū)間,即為參數(shù)出錯(cuò)。刪除步驟總結(jié)如下:首先把存儲(chǔ)單元i中的數(shù)據(jù)元素,即ai存放到參數(shù)x中,然后從前向后依次前移從存儲(chǔ)位置i到存儲(chǔ)單元i-1中的數(shù)據(jù)元素,最后把數(shù)據(jù)元素個(gè)數(shù)-1。(4)查找數(shù)據(jù)元素locat_sq(注:此處為按結(jié)點(diǎn)值查找方法,另有按結(jié)點(diǎn)序號(hào)查找get_sq)/*查找值為e的元素,返回它的位置*/int
10、locat_sq(SqListL,ElemTypee)inti=0;while(i<=L.length-1&&L.ai!=e)i+;if(i<=L.length-1)return(i+1);elsereturn(-1);/*locat_sq*/【說(shuō)明】在表中按值查找結(jié)點(diǎn),即從鏈表的開(kāi)始結(jié)點(diǎn)出發(fā),順鏈逐個(gè)將結(jié)點(diǎn)的值和給定的值e進(jìn)行比較,若遇到相等的,則返回結(jié)點(diǎn)的存儲(chǔ)位置,否則返回一1(按值查找法比按序號(hào)查找更為簡(jiǎn)單,建議使用前者)。三、線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(1)建立線T鏈表*creat_L并輸出鏈表out_L1133A(1)插入數(shù)據(jù)元素insert_Lvoidinse
11、rt_L(LNode*L,inti,ElemTypee)LNode*s,*p;intj;p=L;/*找第i-1個(gè)結(jié)點(diǎn)*/j=0;根據(jù) 本部 分實(shí) 驗(yàn)總 結(jié)的 程序 流程while(p!=NULL&&j<i-1)p=p->next;j+;if(p=NULL|j>i-1)printf("niERROR!");elses=(LNode*)malloc(sizeof(LNode);s->data=e;s->next=p->next;p->next=s;/*insert_L*/【說(shuō)明】要在帶頭結(jié)點(diǎn)的單鏈表第i(0wiwsiNe
12、個(gè)結(jié)點(diǎn)前插入一個(gè)存放數(shù)據(jù)元素e的結(jié)點(diǎn),首先在單鏈表中尋找到第i-1個(gè)結(jié)點(diǎn)并由p指示,然后動(dòng)態(tài)申請(qǐng)一個(gè)結(jié)點(diǎn)存儲(chǔ)空間并由s指示,并s->data=e,最后修改新結(jié)點(diǎn)指針域指向ai:s->next=p->next,并修改ai-1指針域使之指向s,即p->next=s。(2) 刪除數(shù)據(jù)元素delete_L刪除運(yùn)算就是將鏈表中的第i個(gè)結(jié)點(diǎn)從表中刪去。由于第i個(gè)結(jié)點(diǎn)的存儲(chǔ)位置存儲(chǔ)在第i-1個(gè)結(jié)點(diǎn)的指針域next中,因此要先使p指向第i-1個(gè)結(jié)點(diǎn),然后使得p->next指向第i+1個(gè)結(jié)點(diǎn),再將第i個(gè)結(jié)點(diǎn)釋放掉。(3) 查找數(shù)據(jù)元素locat_L在單鏈表中按值查找結(jié)點(diǎn),就是從鏈表
13、的開(kāi)始結(jié)點(diǎn)出發(fā),順鏈逐個(gè)將結(jié)點(diǎn)的值和給定的e進(jìn)行比較,若相等,則返回結(jié)點(diǎn)的存儲(chǔ)位置,否則程序return(-1)。1、 VC6.0自動(dòng)檢測(cè)出的錯(cuò)誤顯示為“getch:undeclaredidentifier”。實(shí)驗(yàn) 中遇 到的 問(wèn)題 及解 決情 況問(wèn)題分析:"undeclaredidentifier"意為未聲明的標(biāo)識(shí)符。未聲明的標(biāo)識(shí)符有以下兩種情況:一為沒(méi)有聲明的語(yǔ)句直接使用;二為沒(méi)有聲明語(yǔ)句,直接使用函數(shù)。因此此處可以添加頭文件。頭文件的作用是避免多個(gè)代碼文件全局變量(函數(shù)),防止定義沖突。因此可以在函數(shù)聲明處添加#include<conio.h>另外,get
14、ch()函數(shù)在此程序中并未起實(shí)際作用,可以刪去。2、VC6.0檢測(cè)錯(cuò)誤顯示“'main':functionshouldreturnavalue;'void'returntypeassumed'。問(wèn)題分析:"main:functionshouldreturnavalue意'為主函數(shù)沒(méi)有返回值,有三種改正方法:(1)改為空類(lèi)型,即把main()改為voidmain();(2)不加void的話主函數(shù)默認(rèn)返回值是int,所以可以把main()改為intmain(),再在主函數(shù)末尾加入return(0);(3)直接只加入return(0)。3、在
15、程序運(yùn)行過(guò)程中因?yàn)檩斎敕▎?wèn)題導(dǎo)致程序運(yùn)行錯(cuò)誤,如下圖所示:2.在i位置插入元素e3,刪除第i個(gè)元素,返回其值工查找值為e的元素僅結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,2,3,4,6)21-858993460234打回車(chē)鍵,繼續(xù).麒拼音半:?jiǎn)栴}分析:程序中只識(shí)別英文編輯狀態(tài)下的字符,不能識(shí)別中文輸入的字符,上圖中的逗號(hào)是中文方式輸入,程序無(wú)法識(shí)別,導(dǎo)致程序終止。將逗號(hào)輸入切換到英文狀態(tài)下即可。實(shí)驗(yàn) 完成 后的 體會(huì)通過(guò)本次實(shí)驗(yàn),我對(duì)線性表的順序存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)有了新的認(rèn)識(shí)。線性表的順序存儲(chǔ)結(jié)構(gòu)優(yōu)點(diǎn)是空間利用率高,可以隨機(jī)存取。缺點(diǎn)是插入元素和刪除元素存在元素移動(dòng),耗時(shí)較多,并且順序存儲(chǔ)結(jié)構(gòu)有空間
16、限制,當(dāng)需要存取的元素個(gè)數(shù)可能多于順序表的元素個(gè)數(shù)時(shí),會(huì)出現(xiàn)"溢出”問(wèn)題.當(dāng)元素個(gè)數(shù)遠(yuǎn)少于預(yù)先分配的空間時(shí),空間浪費(fèi)大。線性表在單鏈表存儲(chǔ)結(jié)構(gòu)上的基本運(yùn)算有建表、插入、刪除和查找。鏈表存儲(chǔ)結(jié)構(gòu)彌補(bǔ)了順序存儲(chǔ)結(jié)構(gòu)的缺憾,其插入元素和刪除元素速度快并且沒(méi)有空間限制,存儲(chǔ)元素的個(gè)數(shù)無(wú)上限,基本只與內(nèi)存空間大小有關(guān)。缺點(diǎn)是占用額外的空間以存儲(chǔ)指針(浪費(fèi)空間),存取某個(gè)元素速度慢。順序存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)對(duì)比如下:(1)順序結(jié)構(gòu)可以進(jìn)行隨機(jī)存取順序存儲(chǔ)表中的第i個(gè)元素,鏈?zhǔn)酱鎯?chǔ)不能進(jìn)行隨機(jī)的存儲(chǔ),每次訪問(wèn)數(shù)據(jù)元素都需要從頭指針開(kāi)始進(jìn)行。(2)順序存儲(chǔ)不需要為表示表中元素之間的邏輯關(guān)系增加額外
17、的存儲(chǔ)空間一個(gè)存儲(chǔ)單位就存儲(chǔ)一個(gè)數(shù)據(jù)元素,即存儲(chǔ)密度大。鏈?zhǔn)酱鎯?chǔ)數(shù)據(jù)元素之間的邏輯關(guān)系與物理關(guān)系位置不對(duì)應(yīng),需要指示結(jié)點(diǎn)之間關(guān)系的指針域,因而在存儲(chǔ)空間要付出代價(jià)。(3)順序存儲(chǔ)采用靜態(tài)分配的內(nèi)存空間,存儲(chǔ)容量難以事先確定,分配過(guò)大或過(guò)小都不好;鏈?zhǔn)酱鎯?chǔ)的存儲(chǔ)空間采用動(dòng)態(tài)分配的方式,不會(huì)存在分配不夠用或浪費(fèi)的情況。(4)在順序存儲(chǔ)表上進(jìn)行大量的插入和刪除操作時(shí),需要移動(dòng)大量的元素,使操作運(yùn)行時(shí)間長(zhǎng);鏈?zhǔn)酱鎯?chǔ)進(jìn)行插入和刪除數(shù)據(jù)時(shí),不需要移動(dòng)大量的元素,只需要修改指針。另外,實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn)許多在課堂上忽視的問(wèn)題,在實(shí)驗(yàn)室中,從自己動(dòng)手調(diào)試程序,修改程序中錯(cuò)誤,再到成功運(yùn)行出程序,在此過(guò)程中有屢次調(diào)
18、試失敗的灰心喪氣,也有成功后的莫大喜悅,這應(yīng)該就是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的魅力所在了吧。與此同時(shí),我更深刻認(rèn)識(shí)到了自己的不足,有時(shí)候一個(gè)小小的標(biāo)點(diǎn)就能使一個(gè)大的程序卡死或者停止運(yùn)行。記得老師說(shuō)過(guò)“細(xì)節(jié)決定成敗”,在調(diào)試程序的時(shí)候,我就是因?yàn)閷?duì)輸入法的不在意,中文狀態(tài)下的標(biāo)點(diǎn)符號(hào)不被程序識(shí)別,結(jié)果耽誤了整整半堂實(shí)驗(yàn),到最后經(jīng)過(guò)逐一排查,終于找到了問(wèn)題所在,最終成功運(yùn)行出了程序。由此可以看出實(shí)踐不光是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),還是發(fā)現(xiàn)自身錯(cuò)誤的最好方法。通過(guò)這次實(shí)驗(yàn),我不僅對(duì)老師在課堂上講過(guò)的內(nèi)容加深了理解,更深刻的體會(huì)到自己自身的缺點(diǎn)帶來(lái)的麻煩。在今后的學(xué)習(xí)過(guò)程中,我更要加倍努力改正自己的缺點(diǎn),盡可能將粗心帶來(lái)
19、的實(shí)驗(yàn)誤差降到最低。數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(二)提交日期:級(jí)號(hào)驗(yàn)稱(chēng)班學(xué)實(shí)名姓名±W¥67棧的順序存儲(chǔ)結(jié)構(gòu)及實(shí)現(xiàn)假設(shè)棧S=(a1,a2,,an),則稱(chēng)al為棧底元素,an為棧頂元素。棧中元素按a1,a2,an的次序進(jìn)棧,退棧的第一個(gè)元素為棧頂元素,即棧的修改是按后進(jìn)先出(LIFO)或先進(jìn)后出(FILO)的原則。程序運(yùn)行如下:1、進(jìn)棧1 .數(shù)據(jù)元素巳進(jìn)棧2,出棧一個(gè)元素,返回其值工結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1.2,3)1試據(jù)運(yùn)記 測(cè)數(shù)與行錄進(jìn)棧e=?6data=6data-5data=4data=3data=2data=l2、出棧L數(shù)據(jù)元素日進(jìn)棧2 .出棧一個(gè)元素,返回其值3 .結(jié)
20、束程序運(yùn)行請(qǐng)襦又您而1擇(1,2,3)2匕棧元素:6data=5data=4data=3data=2data=l最后,運(yùn)行結(jié)束,回車(chē)退出程序。本次實(shí)驗(yàn)內(nèi)容為棧的順序存儲(chǔ)結(jié)構(gòu)及實(shí)現(xiàn)。由于棧是運(yùn)算受限的線性表,因此線性表的存儲(chǔ)結(jié)構(gòu)對(duì)棧也適用。棧的順序存儲(chǔ)結(jié)構(gòu)簡(jiǎn)稱(chēng)為順序棧。因?yàn)闂5孜恢檬枪潭ú蛔兊?,所以可以講棧底位置設(shè)置在數(shù)組的最低端(即下標(biāo)為0);棧頂位置是隨著進(jìn)棧和退棧操作而變化的,故用一個(gè)整型量top來(lái)指示當(dāng)前棧頂位置,則top為棧頂指針。因此,順序棧的類(lèi)型定義僅僅是將順序表類(lèi)型定義中的長(zhǎng)度length改為top,SqList改為SqStack。因此可定義順序棧如下:#include<s
21、tdio.h>#include<stdlib.h>/*數(shù)組最大界限*/*數(shù)據(jù)元素類(lèi)型*/* 一維數(shù)組子域*/*棧頂指針子域*/*棧的順序結(jié)構(gòu)體類(lèi)型*/#defineMAXSIZE20typedefintElemType;typedefstructElemTypeaMAXSIZE;據(jù)部實(shí)總的序程 根本分驗(yàn)結(jié)程流inttop;SqStack;SqStacks1;順序棧的操作實(shí)現(xiàn)如下:初始化空棧init_s步驟如下:(1)分配空間并檢查空間是否分配失敗,若失敗則返回錯(cuò)誤設(shè)置棧底和棧頂指針S.top=S.base;(3)設(shè)置棧大小2、進(jìn)棧pushvoidpush(SqStack*s,
22、ElemTypee)if(s->top=MAXSIZE-1)printf("nSstackisOverflow!");elses->top+;s->as->top=e;/*push*/【說(shuō)明】先判斷是否棧滿,若滿則出錯(cuò);然后將元素e壓入棧頂,同時(shí),棧頂指針加1。1、出棧popElemTypepop(SqStack*s)ElemTypex;if(s->top=-1)printf("nStackisUnderflow!");x=-1;elsex=s->as->top;s->top-;return(x);/*po
23、p*/【說(shuō)明】首先判斷是否棧空,若空則出錯(cuò);接著獲取棧頂元素e,同時(shí),棧頂指針減1。另外,本實(shí)驗(yàn)中程序沒(méi)有涉及到取順序棧棧頂元素,即GetTop,其運(yùn)行思路為:首先,判斷是否空棧,若空則返回錯(cuò)誤;否則通過(guò)棧頂指針獲取棧頂元素。實(shí)驗(yàn)中遇至1的問(wèn)題及解決情況1、VC6.0測(cè)試出現(xiàn)錯(cuò)誤"errorC2018:unknowncharacter'0xa3'errorC2018:unknowncharacter'0xbb'"。問(wèn)題分析:“printf("nn2.出棧一個(gè)元素,返回其值“);”原程序段中的“;”是在中文狀卷下輸入的字符,程序無(wú)法識(shí)
24、別導(dǎo)致出錯(cuò)。應(yīng)使用英文輸入法輸入程序語(yǔ)言。2、調(diào)試出現(xiàn)"syntaxerror:missing''beforeidentifier'push'"問(wèn)題分析:"case1:printf("n進(jìn)棧e=?");scanf("%d",&e)"末尾缺少";”,應(yīng)在句末加上一個(gè)分號(hào),并且是英文狀態(tài)嚇的字符形式。3、VC6.0測(cè)試出現(xiàn)錯(cuò)誤如下:errorC26Q1:outs':localfunctiondefinitionsareillegalerrorC2601:*pus
25、h':localfunctiondefinitionsareillegalerror02691:4pop1:localfunctiondefinitionsareillegal問(wèn)題分析:localfunctiondefinitionsareillegal息為函數(shù)te義出錯(cuò)。調(diào)試錯(cuò)誤原因是主應(yīng)用程序的函數(shù)少了一個(gè)“"。用“Ctrl+”逐一排查函數(shù)(一般報(bào)錯(cuò)位置并不是真正的出錯(cuò)位置,通常是報(bào)錯(cuò)位置的上一個(gè)函數(shù))。實(shí)驗(yàn)完成后的體會(huì)通過(guò)在課堂內(nèi)外的學(xué)習(xí)和實(shí)踐,我了解到棧是一種重要的線性結(jié)構(gòu)。從數(shù)據(jù)結(jié)構(gòu)角度看,棧也是線性表,其特殊性在于棧的基本操作是線性表操作的子集,它是操作受限的線性
26、表,因此,可稱(chēng)為限定性的數(shù)據(jù)結(jié)構(gòu)。與前面學(xué)的關(guān)于順序表的知識(shí)對(duì)比發(fā)現(xiàn),順序棧和順序表的數(shù)據(jù)成員是相同的,不問(wèn)的是,順序棧的入棧和出棧操作只能對(duì)于當(dāng)前棧頂元素進(jìn)行。n:Cpp1-Uin32Debug(1):uarning2867:unexpectedtokensfollowingpreprocessordirective-expectedanw】ig):errorC2065:'MftXSIZE':und«tlaeedidentifier(4) :errorC2U57:expectedconstantexpression(5) :earningC42B0:nonstand
27、ardextensionused:zero-sizedarrayinstruct/union(6) :errorC2229:struct'_unnamed1hasanillegalzero-sizedarrap(19) :errorC2G18:unknouncharacter'1(20) :errorC2018:unknouncharacter'Oxbbh(21) :errorC71U6:到ntaKerror:nissingb;'beForeidentifier'printf-(32) :errorC2O65:dexitb:undeclaredident
28、ifier(37) :errorC2仙6:syntaxerror:nissing'HbeFureidentifierbprintF'(38) :errorC2M5:'getch':undeclaredidentifier(39) :learningC45冏:'main':functionshouldreturnavalue;'void'returntypeassuned(46) :errorC2S19:type'SqStack'doesnothaveanoverloadedmenber'operator-&
29、gt;'cpp1.cpp(4):seedeclarationoF'SqStack'(47) :errorC2227:LeftoF*->tcp'nustpainttoclass/struct/union(48) :errorC2819:typeb$q£tack'doesnothaueanourLaadedmenber'operatorcpp1.cpp(ii):seedeclarationof'qtck'(117) :errorC2227:LeftoF->top-nustpointtoclss/struct/un
30、ion(iiS):errorC2819:typeFSqStackFdoesnothauanouerLoadedmenberOperatorcppl.cpp(i>):Seedeclarationof'SqStack'(48):errorC2227:LeftoF'->aFmustpointtoclass/5truct/union個(gè)人體會(huì):剛開(kāi)始調(diào)試程序時(shí),VC6.0檢測(cè)出上圖所示的長(zhǎng)長(zhǎng)的一串錯(cuò)誤來(lái),讓人看了都覺(jué)得十分發(fā)愁。后來(lái)通過(guò)老師的指導(dǎo),我和身邊的同學(xué)分工合作,將困難化整為零,認(rèn)真考慮程序的可能存在錯(cuò)誤點(diǎn),最后我們終于把程序成功的運(yùn)行了出來(lái)。經(jīng)過(guò)這次實(shí)驗(yàn),我
31、深深地體會(huì)到耐心對(duì)于學(xué)好程序的重要性。隨著學(xué)習(xí)的不斷深入,我們所學(xué)的問(wèn)題深度越來(lái)越多,所需要處理的程序也就越來(lái)越長(zhǎng),只用耐下心來(lái)分析問(wèn)題,才能得到正確的結(jié)果。同時(shí),在運(yùn)行程序的時(shí)候一定不要害怕麻煩,靜下心來(lái)做,慢慢把錯(cuò)誤的一個(gè)大的程序慢慢分解成一個(gè)個(gè)小的問(wèn)題,化繁為簡(jiǎn),認(rèn)真細(xì)心地分析函數(shù)中的每一個(gè)語(yǔ)句和運(yùn)算,隱藏在程序語(yǔ)句中的錯(cuò)誤最終都會(huì)被糾正。數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(三)提交日期:班級(jí)實(shí)驗(yàn)隊(duì)列名稱(chēng)隊(duì)列也是一種特殊的線性表,隊(duì)列的數(shù)據(jù)元素及數(shù)據(jù)元素間的邏輯關(guān)系和線性表的完全相同,其差別是:線性表允許在任意位置插入和刪除數(shù)據(jù)元素,而隊(duì)列只允許在其一端進(jìn)行插入操作(隊(duì)尾),另一端進(jìn)行刪除操作(隊(duì)頭)。隊(duì)
32、列中,最先進(jìn)入隊(duì)列的數(shù)據(jù)元素總是最先出隊(duì)列,所以隊(duì)列是一種先進(jìn)先出表。和線性表類(lèi)似,隊(duì)列也有兩種存儲(chǔ)表示一一循環(huán)隊(duì)列(順序存儲(chǔ))和鏈隊(duì)列。一、循環(huán)隊(duì)列(即隊(duì)列的順序存儲(chǔ)結(jié)構(gòu))實(shí)現(xiàn)用數(shù)組實(shí)現(xiàn)隊(duì)列時(shí),隨著數(shù)據(jù)的不斷讀寫(xiě),會(huì)出現(xiàn)假滿隊(duì)列情況。即尾數(shù)組已滿而頭數(shù)是空的;循環(huán)隊(duì)列在邏輯上把數(shù)組的頭尾相連,能夠很好的利用有限的資源。1、進(jìn)隊(duì)1 .數(shù)據(jù)元素曰進(jìn)隊(duì)列測(cè)試 數(shù)據(jù) 與運(yùn) 行記 錄2 .出隊(duì)一個(gè)元素,返回其值3 .結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,2,3)1進(jìn)隊(duì)e=?ldata=5data=4data=3data=2data=l2、出隊(duì)1.數(shù)據(jù)元素E進(jìn)隊(duì)列Z出隊(duì)一個(gè)元素,返回其值工結(jié)束程序運(yùn)行請(qǐng)輸入您
33、的選擇(1,233)2年隊(duì):4data=3data=2data-l最后,程序運(yùn)行結(jié)束,回車(chē)退出。二、隊(duì)列的鏈表存儲(chǔ)結(jié)構(gòu)及實(shí)現(xiàn)鏈隊(duì)就是采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ)隊(duì)列,這里采用單鏈表來(lái)實(shí)現(xiàn)。鏈表的特點(diǎn)是不存在隊(duì)列溢滿的情況。鏈隊(duì)同循環(huán)隊(duì)列的程序運(yùn)行步驟相同,都是進(jìn)隊(duì)和出隊(duì)兩個(gè)步驟。、步驟如下:1、進(jìn)隊(duì)試據(jù)運(yùn)記 測(cè)數(shù)與行錄據(jù)部實(shí)總的序程 根本分驗(yàn)結(jié)程流1 .數(shù)據(jù)元素&進(jìn)隊(duì)列2 .出隊(duì)一個(gè)元素,返回其值3 .結(jié)束程序運(yùn)行請(qǐng)看工您正虛擇(1,2,3)1進(jìn)隊(duì)e=?634562、出隊(duì)L數(shù)據(jù)元素日進(jìn)隊(duì)列2.出隊(duì)一個(gè)元素,返回其值品結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,22出隊(duì)元素;3456最后,程序運(yùn)行結(jié)束,回車(chē)
34、退出。一、循環(huán)隊(duì)列通過(guò)順序隊(duì)列的“假溢出”現(xiàn)象優(yōu)化得到循環(huán)隊(duì)列結(jié)構(gòu)。循環(huán)隊(duì)列結(jié)構(gòu)存在兩種狀態(tài)和兩種操作,如下:1、兩種狀態(tài)(1) 隊(duì)空狀態(tài):Q->front=Q->rear。(2) 隊(duì)滿狀態(tài):(Q->rear+1)%MAXSIZE=Q->front)2、兩種操作(1)進(jìn)隊(duì)EnQueue:Q->rear=(Q->rear+1)%MAXSIZE;Q->aQ->rear=e;(2)出隊(duì)DeQueue:Q->front=(Q->front+1)%MAXSIZE;x=Q->aQ->front;程序流程為:1、初始化空隊(duì)列init_Q
35、并輸出隊(duì)列out_Q2、進(jìn)隊(duì)EnQueue3、出隊(duì)DeQueue根據(jù) 本部 分實(shí) 驗(yàn)總 結(jié)的 程序 流程實(shí)驗(yàn) 中遇 到的 問(wèn)題 及解 決情 況二、鏈隊(duì)列1、入隊(duì)EnQueue_voidEnQueue(L_Queue*Q,ElemTypee)QNode*s;s=(QNode*)malloc(sizeof(QNode);s->data=e;s->next=NULL;Q->rear->next=s;Q->rear=s;/*EnQueue*/【說(shuō)明】元素插入到隊(duì)列中只能在隊(duì)尾插入,隊(duì)頭指針始終指向頭結(jié)點(diǎn),隊(duì)尾指針指向隊(duì)列的最后一個(gè)元素。首先開(kāi)辟一個(gè)新結(jié)點(diǎn)s,再在隊(duì)尾才1入
36、結(jié)點(diǎn)Q->rear->next=s;最后修改隊(duì)尾指針:Q->rear=s;(2)出隊(duì)操作DeQueueElemTypeDeQueue(L_Queue*Q)ElemTypex;QNode*p;if(Q->front=Q->rear)printf("nQueueisNULL!");x=-1;elsep=Q->front->next;x=p->data;Q->front->next=p->next;if(Q->rear=p)Q->rear=Q->front;free(p);return(x);/*
37、DeQueue*/【說(shuō)明】首先判斷此隊(duì)列是否為空,若為空,則返回-1,結(jié)束進(jìn)程。否則,使p指向隊(duì)頭元素,再使隊(duì)頭元素p出隊(duì)。如果隊(duì)中只有一個(gè)元素,則p出隊(duì)后成為空隊(duì)。最后釋放存儲(chǔ)空間。1、'SqQueue':illegaluseofthistypeasanexpression原程序如圖所示:switch(k)case1:printf("n進(jìn)隊(duì)e=?");scanf(Iatda,;EnQueue(SqQueue&Q1,e);out_Q(&Q1);>break;問(wèn)題分析:編譯不允許在用到函數(shù)的時(shí)候,再去聲明這個(gè)函數(shù),即應(yīng)把聲明函數(shù)放在函數(shù)體
38、最前面。此處SqQueue重復(fù)聲明,直接把聲明去掉即可。2、“'Free':undeclaredidentifier”問(wèn)題分析:voidfree(void*p)動(dòng)態(tài)釋放函數(shù)內(nèi)存空間的函數(shù),這個(gè)函數(shù)包含在頭文件malloc.h中。在程序中,用malloc()函數(shù)申請(qǐng)的內(nèi)存空間要用一個(gè)指針類(lèi)型的變量指示其首地址。此處Free(p)改為free(p),在程序編譯中,需要區(qū)分大小寫(xiě)。實(shí)驗(yàn)中遇至1的問(wèn)題及解決情況3、調(diào)試檢測(cè)到的錯(cuò)誤如下(8):seedeclarationof'SqQueue1rrorC2819:type*SqQueue1docsnothzv電anouerload
39、edmember*op&rdtor(6):seedeclarationoF'SqQueue'rrorC2227:leftof'->Frnntbmustpointtoclss/struct/unionrroirC2819:type'SqQueue'doesnothaveanouerlcuadednember'operator->'(6):seedeclarationof'SqQueue'rrorC2227:leftof'->rear'mustpointtoclass/struct/u
40、nionrrorC28U9:tyipe'SqQueue'doesnothaueanouerlcuadedmenber'operator->'(6):se(?declarationof'SqQueue*rrorC2227:leftof'->Front'mustpointtoclass/struct/unionrrorC2819:type1SqQueue'doesnothaveanouerloadednember1operator'(6):seedeclarationof'SqQueue*問(wèn)題分析:must
41、pointtoclass/struct/union息為左邊必須有類(lèi)/結(jié)構(gòu)/聯(lián)合,te義一個(gè)后指針變量的函數(shù)時(shí),若有“一>”指向一個(gè)變量時(shí),所定義的指針變量前面必須加“*”,因此out_Q函數(shù)中定義的變量Q應(yīng)該為*Q,修改如下:voidout_Q(SqQueue裳Q)(charch;inti;if(Q->Front=Q->rear)printF("nQueueisNULL.;Blsei=(Q->Front+1)HAXSIZE;uhile(i?=Q->rear)printf("ridata=d*Q->ai):|L=(i+1)WXSiZE;&g
42、t;printf("nGata=制d”,Q->ai);printf(fin打回車(chē)鍵,繼續(xù)");ch=getch();實(shí)驗(yàn)完成后的體會(huì)通過(guò)上述的實(shí)驗(yàn)使我對(duì)隊(duì)列有了一個(gè)更加深刻地理解。對(duì)于循環(huán)隊(duì)列與鏈隊(duì)列的比較,可以從兩方面來(lái)考慮:從時(shí)間上,其實(shí)它們的基本操作都是常數(shù)時(shí)間,即都為0(1)的,不過(guò)循環(huán)隊(duì)列是事先申請(qǐng)好空間,使用期間不釋放,而對(duì)于鏈隊(duì)列,每次申請(qǐng)和釋放結(jié)點(diǎn)也會(huì)存在一些時(shí)間開(kāi)銷(xiāo),如果入隊(duì)出隊(duì)頻繁,則兩者還是有細(xì)微差異。對(duì)于空間上來(lái)說(shuō),循環(huán)隊(duì)列必須有一個(gè)固定的長(zhǎng)度,所以就有了存儲(chǔ)兀素個(gè)數(shù)和空間浪費(fèi)的問(wèn)題。而鏈隊(duì)列不存在這個(gè)問(wèn)題,盡管它需野-個(gè)指針域,會(huì)產(chǎn)一些空間上
43、的開(kāi)銷(xiāo),但也可以接受。所以在空間上,鏈隊(duì)列更加靈活。總的來(lái)說(shuō),在可以確定隊(duì)列長(zhǎng)度最大值的情況下,建議用循環(huán)隊(duì)列,如果你無(wú)法預(yù)估隊(duì)列的長(zhǎng)度時(shí),則用鏈隊(duì)列。在實(shí)驗(yàn)的過(guò)程中,程序的運(yùn)行出現(xiàn)了很多的錯(cuò)誤,所以我必須了嚴(yán)格的檢查程序中的每個(gè)字符,不斷地進(jìn)行調(diào)試。在調(diào)試的過(guò)程中,也發(fā)現(xiàn)了很多應(yīng)該注意的問(wèn)題,例如函數(shù)的聲明應(yīng)該與函數(shù)的應(yīng)用相一致、函數(shù)的名稱(chēng)不能有重復(fù)、函數(shù)中的指針的引用等。通過(guò)實(shí)驗(yàn)使我對(duì)瑣碎的知識(shí)點(diǎn)有了一個(gè)更加清晰的認(rèn)識(shí),使很多的知識(shí)點(diǎn)聯(lián)系在一起,問(wèn)時(shí)也鍛煉了我的計(jì)算機(jī)操作的能力,所以我們應(yīng)該增加這樣的實(shí)驗(yàn)操作,提高我們的動(dòng)手能力。在實(shí)踐操作的同時(shí),也要培養(yǎng)自己嚴(yán)謹(jǐn)?shù)膶W(xué)習(xí)態(tài)度,在細(xì)節(jié)上更要注
44、下。例如,函數(shù)Free(p)和free(p)的區(qū)別,雖然兩個(gè)函數(shù)的意思是一樣的,但是在程序編寫(xiě)中意思截然不問(wèn),“失之毫厘,差之千里”,平時(shí)只有多加注意小枝末節(jié),不粗心大意,才能將不必要的失誤盡量避免掉,并且能夠節(jié)省更多的練習(xí)時(shí)間。數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(四)提交日期:班級(jí)姓名學(xué)號(hào)上機(jī)號(hào)67實(shí)驗(yàn)樹(shù)與二叉樹(shù)名稱(chēng)樹(shù)形結(jié)構(gòu)是一類(lèi)非線性數(shù)據(jù)結(jié)構(gòu)。樹(shù)結(jié)構(gòu)包括樹(shù)和二叉樹(shù)。在樹(shù)結(jié)構(gòu)中,每個(gè)結(jié)點(diǎn)都只允許有一個(gè)直接前驅(qū)結(jié)點(diǎn),但允許有一個(gè)以上直接后繼結(jié)點(diǎn)。樹(shù)的存儲(chǔ)結(jié)構(gòu)和操作實(shí)現(xiàn)都比較復(fù)雜,但樹(shù)可以轉(zhuǎn)換為二叉樹(shù)進(jìn)行處理。樹(shù)的建立、二叉樹(shù)的遍歷和哈夫曼編碼。一、二叉樹(shù)的建立和遍歷建立二叉樹(shù)有各種不同的方法。一種方法利用二叉樹(shù)
45、的性質(zhì)5來(lái)建立二叉樹(shù),輸入數(shù)據(jù)時(shí)將結(jié)點(diǎn)的序號(hào)和數(shù)據(jù)同時(shí)給出:序號(hào)數(shù)據(jù)元素。1、用二叉樹(shù)性質(zhì)5建二叉樹(shù)輸入數(shù)據(jù):11,22,33,44,65,76,13159。測(cè)試 數(shù)據(jù) 與運(yùn) 行記 錄2、中序遍歷3 .中序遞歸遍歷二叉樹(shù)4-計(jì)算樹(shù)中結(jié)點(diǎn)個(gè)數(shù)5 .結(jié)束程序運(yùn)行鬲於原而以擇(1,2總4,5,6)34215738693、計(jì)算樹(shù)中結(jié)點(diǎn)數(shù)4.計(jì)算樹(shù)中結(jié)點(diǎn)個(gè)數(shù)E.結(jié)束程序運(yùn)行請(qǐng)輸入您的選擇(1,2,3,4,5,6)4421573869二叉樹(shù)結(jié)點(diǎn)總數(shù)口=9二叉樹(shù)葉子結(jié)點(diǎn)數(shù)n0=4度為1的結(jié)點(diǎn)數(shù)hl二2度為2的結(jié)點(diǎn)數(shù)n2=3二、哈夫曼編碼利用哈夫曼樹(shù)求得的用于通信的二進(jìn)制編碼稱(chēng)為哈夫曼編碼。哈夫曼樹(shù)中,從根到
46、每個(gè)葉子都有一條路徑,對(duì)路徑上的各分支約定指向左子樹(shù)的分支表示“0”碼,指向右子樹(shù)的分支表示“1”碼,取每條路徑上的“0”和“1”的序列作為和各個(gè)葉子對(duì)應(yīng)的字符的編碼,就是哈夫曼編碼。1、輸入權(quán)植輸入8個(gè)權(quán)植5,29,7,8,14,23,3,11.2、輸入字符,得出哈夫曼編碼請(qǐng)輸入字符"dfghjk第1個(gè)字符且的編碼為QQ01第2個(gè)字符制編碼為10第3個(gè)字符d的編碼為111Q第4個(gè)字符f的編碼為1111第5個(gè)字符后的編碼為110第6個(gè)字符h的編碼為01第7個(gè)字符j的編碼為0000第2個(gè)字符k的編碼為001一、二叉樹(shù)的建立和遍歷實(shí)驗(yàn)中的非遞歸遍歷算法特點(diǎn)是,在所有未被訪問(wèn)的結(jié)點(diǎn)中,最后
47、訪問(wèn)結(jié)點(diǎn)的左子樹(shù)的根結(jié)點(diǎn)將最先被訪問(wèn)。實(shí)驗(yàn)原理如下:根據(jù)如果有一顆有n個(gè)節(jié)點(diǎn)的完全二叉樹(shù)的節(jié)點(diǎn)按層次序編號(hào),對(duì)任一層的節(jié)點(diǎn)i(1<=i<=n)有:1 .如果i=1,則節(jié)點(diǎn)是二叉樹(shù)的根,無(wú)雙親,如果i>1,則其雙親節(jié)點(diǎn)為i/2,向下取整2 .如果2i>n那么節(jié)點(diǎn)i沒(méi)有左孩子,否則其左孩子為2i3 .如果2i+1>n那么節(jié)點(diǎn)沒(méi)有右孩子,否則右孩子為2i+1據(jù)部實(shí)總的序程 根本分驗(yàn)結(jié)程流中序遍歷:若二叉樹(shù)非空,則依次執(zhí)行以下操作:(1)中序遍歷左子樹(shù)(2)訪問(wèn)根結(jié)點(diǎn)(3)中序遍歷右子樹(shù)voidinorder(BiTNode*p)if(p)inorder(p->lc
48、h);printf("%3d”,p->data);inorder(p->rch);/*inorder*/二、哈夫曼編碼對(duì)于同一組結(jié)點(diǎn),構(gòu)造出的哈夫曼樹(shù)可能不是唯一的。但是對(duì)于同一組結(jié)點(diǎn),雖然會(huì)產(chǎn)生多棵哈夫曼樹(shù),但是它們的帶權(quán)路徑長(zhǎng)度(WPL)是相同的,即一組結(jié)點(diǎn)有唯一的WPL和它對(duì)應(yīng)。算法如下:1、輸入權(quán)植。首先將這n個(gè)權(quán)值分別看作是只有根的n棵二叉樹(shù),這些二叉樹(shù)構(gòu)成一個(gè)集合2、篩選最小權(quán)值。選出兩棵根結(jié)點(diǎn)的權(quán)值最小的樹(shù)作為左、右子樹(shù)構(gòu)造一棵新的二叉樹(shù),新二叉樹(shù)的根結(jié)點(diǎn)的權(quán)值為左、右子樹(shù)根結(jié)點(diǎn)權(quán)值之和。voidselectmin(huffmantreeht,inti,in
49、t*p1,int*p2)/*在ht1.i中選兩個(gè)權(quán)值最小的根結(jié)點(diǎn),其序號(hào)為*p1和*p2,*p1中放權(quán)值最小的根結(jié)點(diǎn)的序號(hào),*p2中放權(quán)值次小的根結(jié)點(diǎn)的序號(hào)*/intj,min1,min2;/*min1,min2分別是最小權(quán)值和次小權(quán)值*/min仁min2=32767;*p1=*p2=0;for(j=1;j<=i;j+)if(htj.parent=0)/*j為根結(jié)點(diǎn)*/if(htj.weight<min1|min1=32767)if(min1!=32767)min2=min1;*p2=*p1;min1=htj.weight;*p1=j;elseif(htj.weight<mi
50、n2|min2=32767)min2=htj.weight;*p2=j;3、從集合中刪除左、右子樹(shù),加入新構(gòu)造的樹(shù)。重復(fù)步驟2和3,直到集合中剩下一棵樹(shù)為止,這棵樹(shù)就是哈夫要樹(shù)。實(shí)驗(yàn)中遇至1的問(wèn)題及解決情況1、檢測(cè)出錯(cuò)誤為"function'void_cdeclinorder(structBiTNode*)'alreadyhasabody”。問(wèn)題分析:alreadyhasabody意為函數(shù)名稱(chēng)重復(fù)te義,即有兩個(gè)以上一樣的函數(shù)名稱(chēng)。解決方法是修正其中的一個(gè)函數(shù)名稱(chēng)使得函數(shù)名稱(chēng)都是獨(dú)立的。2、程序語(yǔ)句無(wú)錯(cuò),執(zhí)彳flink.exe時(shí)出錯(cuò),顯小為:unresolvedext
51、ernalsymbol"void_cdeclnumb(structBiTNode*)”(?numbYAXPAUBiTNodeZ)”問(wèn)題分析:所使用的numb(BiTNode*p)只是經(jīng)過(guò)聲明,并沒(méi)用定義函數(shù)的內(nèi)容,因此函數(shù)無(wú)法使用。應(yīng)該將numb()函數(shù)重新定義再使用。3、檢測(cè)出相同的4條錯(cuò)誤,如圖所示:,cpp(21t):errorC2039:'Ichild*:isnotamenberof1htnode1:opCpp1.cpp(9):seedeclarationoF*htnode*cpp(24):errorC2039:1rchildO*:isnotamembernF'
52、;htniode,;opXCppi.cpp(9):seedeclarationof1htnode,cpp(63):errorC2039:'Ichild:isnotamemberof'htnode':opCpp1.cpp(9):seedeclarationof*titnoile,WP(84):errorC2039:'Ichild*:isnotamenberof1htnode1:opCpp1.cpip(9):seedeclarationof1htnoide*問(wèn)題分析:意為htnode()函數(shù)中沒(méi)有te義lchild這個(gè)變重,但是函數(shù)體中存在此變量,因此,應(yīng)該在函數(shù)的
53、開(kāi)始部分添加該變量的定義。4、程序語(yǔ)法沒(méi)有問(wèn)題,調(diào)試不出錯(cuò)誤,但是程序在運(yùn)行期出錯(cuò)導(dǎo)致程序運(yùn)行終止。請(qǐng)輸入8個(gè)權(quán)值 請(qǐng)輸入第1個(gè)權(quán)值睛輸入第2個(gè)權(quán)值實(shí)驗(yàn) 中遇 到的 問(wèn)題 及解 決情 況請(qǐng)輸入第3個(gè)權(quán)值: 請(qǐng)輸入第4個(gè)權(quán)值: 請(qǐng)輸入第5個(gè)權(quán)值; 請(qǐng)輸入第6個(gè)權(quán)值; 請(qǐng)輸入第?個(gè)權(quán)值: 請(qǐng)輸入第8個(gè)權(quán)值; 請(qǐng)輸入字符adsf gjk529781423311Cppkexe已停止工作出現(xiàn)了一介問(wèn)題,導(dǎo)致程序停止正配年如累有可用的解決方賽,Windows將關(guān)閉程序并通知你.調(diào)試Q)問(wèn)題分析:在哈夫曼樹(shù)初始化函數(shù)中,缺少了十分重要的步驟:指定雙親結(jié)點(diǎn)。結(jié)果導(dǎo)致運(yùn)算不能繼續(xù),程序終止。應(yīng)該在選擇兩個(gè)權(quán)值最
54、小的根結(jié)點(diǎn)之后,添加指定雙親結(jié)點(diǎn)的語(yǔ)句:“htp1.parent=htp2.parent=i;"本次實(shí)驗(yàn)中,我們主要針對(duì)的是二叉樹(shù)的建立、遍歷以及哈夫曼樹(shù)進(jìn)行練習(xí)。我感覺(jué)其中最有難度的就是二叉樹(shù)的遍歷以及赫夫曼編碼。通過(guò)這次實(shí)驗(yàn)使我對(duì)二叉樹(shù)遍歷有了一個(gè)更深的認(rèn)識(shí)。遍歷二叉樹(shù)的過(guò)程實(shí)質(zhì)是把二叉樹(shù)的結(jié)點(diǎn)進(jìn)行線性排列的過(guò)程。假設(shè)遍歷二叉樹(shù)時(shí)訪問(wèn)結(jié)點(diǎn)的操作就是輸出結(jié)點(diǎn)數(shù)值域的值,那么遍歷的實(shí)驗(yàn) 完成 后的 體會(huì)結(jié)果得到一個(gè)線性序列。對(duì)于樹(shù)的遍歷包括三種:先序遍歷、中序遍歷、后序遍歷。此三種遍歷的算法都是遞歸的,遞歸終止的條件是二叉樹(shù)為空。在構(gòu)造赫夫曼樹(shù)的過(guò)程中可知,在赫夫曼樹(shù)中不存在度為一的
55、結(jié)點(diǎn)。對(duì)于每個(gè)結(jié)點(diǎn)而言,既需要知道雙親的信息,又需知孩子結(jié)點(diǎn)的信息。由此,可設(shè)定每個(gè)結(jié)點(diǎn)含有4個(gè)域:一個(gè)存放權(quán)值的數(shù)據(jù)域以及三個(gè)指針域,分別指向雙親和孩子在數(shù)組中的下標(biāo)。在實(shí)驗(yàn)過(guò)程中,我發(fā)現(xiàn)一個(gè)很突出的問(wèn)題,就是平時(shí)我們?cè)谡{(diào)試程序時(shí)太過(guò)于依賴VC6.0軟件自帶的語(yǔ)句錯(cuò)誤檢測(cè)系統(tǒng),導(dǎo)致我們錯(cuò)誤的認(rèn)為將自己的程序改到狀態(tài)顯示“0error(s),0warning(s)”就萬(wàn)事大吉了,從而忽視了最基礎(chǔ)的對(duì)程序結(jié)構(gòu)的檢查。最后的結(jié)果是程序的語(yǔ)法雖然沒(méi)有錯(cuò)誤了,但是程序依然還是運(yùn)行不了。因此,在平時(shí)的實(shí)驗(yàn)過(guò)程中,我們不能一開(kāi)始拿到程序就急于對(duì)程序錯(cuò)誤的修改。首先拿到程序,我們應(yīng)該明確這段程序的運(yùn)行目標(biāo),
56、并且大體找出程序的各個(gè)函數(shù)的框架,接下來(lái)需要逐個(gè)對(duì)每個(gè)函數(shù)聲明及變量的聲明進(jìn)行確認(rèn),然后自己試著對(duì)函數(shù)中的運(yùn)算進(jìn)行檢查,看是否符合和是否能夠達(dá)到預(yù)想的目標(biāo)。最后,上機(jī)調(diào)試,將程序中存在的小毛病、小問(wèn)題一一改正,只有有條不紊的逐一排查問(wèn)題,才能又快又好地完成試驗(yàn)任務(wù)。數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(五)提交日期:班級(jí)姓名學(xué)號(hào)上機(jī)號(hào):67實(shí)驗(yàn)名稱(chēng)圖圖是一種非線性結(jié)構(gòu)。在圖的結(jié)構(gòu)中,數(shù)據(jù)元素之間的關(guān)系是多對(duì)多的,。之前在運(yùn)籌學(xué)中從理論方面學(xué)習(xí)過(guò)圖,本次數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)中主要從圖的存儲(chǔ)結(jié)構(gòu)和操作實(shí)現(xiàn)方面學(xué)習(xí)圖。一、圖的鄰接矩陣存儲(chǔ)(數(shù)組表示)、簡(jiǎn)單輸出圖有多種存儲(chǔ)方式,主要應(yīng)用的是鄰接表和鄰接矩陣。本次實(shí)驗(yàn)中使用的存儲(chǔ)
57、方式是鄰接矩陣。輸入頂點(diǎn)數(shù)n,邊數(shù)e,然后輸入一條邊連接的兩個(gè)頂點(diǎn)的編號(hào)i和j。本次實(shí)驗(yàn)輸入的n=6,e=10,i和j的數(shù)值分別為65,61,23,12,54,43,64,14,13,63。011101101000110101101011000101101110測(cè)試 數(shù)據(jù) 與運(yùn) 行記 錄2、回車(chē)鍵入,得到0-1鄰接矩陣。二、圖的鄰接鏈表存儲(chǔ)及遞歸深度優(yōu)先遍歷i和jo本次實(shí)3 6, 3 7, 6 7。圖的深度優(yōu)先遍歷類(lèi)似于二叉樹(shù)的先序遍歷。1、輸入頂點(diǎn)數(shù)n,邊數(shù)e,然后輸入一條邊連接的兩個(gè)頂點(diǎn)的編號(hào)驗(yàn)輸入的n=8,e=9,i和j分別為:12,13,24,25,58,48,2、回車(chē)鍵入得到每個(gè)頂點(diǎn)的鄰接鏈表i=l32i=25411=3761i=4S2i=582i=673i=763i=845打回車(chē)鍵,維續(xù).俞人¥3、輸入V,從頂點(diǎn)Vi開(kāi)始,對(duì)圖進(jìn)行深度優(yōu)先遍歷®Av113762534根據(jù)本部分實(shí)驗(yàn)總結(jié)的程序流程一、鄰接矩陣鄰接矩陣是圖的順序存儲(chǔ)結(jié)構(gòu),由鄰接矩陣的行數(shù)或列數(shù)可知圖中的頂點(diǎn)數(shù)。對(duì)于無(wú)向圖,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司返合同范本
- 單位合伙型聯(lián)營(yíng)合同范本
- 廠房維修簡(jiǎn)易合同范本
- 公司企業(yè)工程合同范本
- 京東金條借款合同范本
- 醫(yī)用化妝品購(gòu)銷(xiāo)合同范例
- 口罩機(jī)采購(gòu)合同范本
- 出租文物合同范例
- 合作期限 合同范例
- 合作英語(yǔ)合同范本
- 祖國(guó)版圖知識(shí)主題班會(huì)
- 2025年上半年?yáng)|方電氣集團(tuán)科學(xué)技術(shù)研究院限公司公開(kāi)招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年高郵市國(guó)資產(chǎn)投資運(yùn)營(yíng)限公司(國(guó)企業(yè))公開(kāi)招聘工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年高考地理二輪復(fù)習(xí):地球運(yùn)動(dòng)(講義)解析版
- 2024年金華金開(kāi)招商招才服務(wù)集團(tuán)有限公司招聘筆試真題
- 【地理】亞洲的自然環(huán)境第3課時(shí) 2024-2025學(xué)年七年級(jí)地理下冊(cè)同步課件(人教版2024)
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 《國(guó)別和區(qū)域研究專(zhuān)題》教學(xué)大綱
- 2024年水利安全員(B證)考試題庫(kù)-上(單選題)
- 人教版小學(xué)六年級(jí)數(shù)學(xué)下冊(cè)教材研說(shuō)
- PPT辦公使用技巧培訓(xùn)筆記(共52張)
評(píng)論
0/150
提交評(píng)論