久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告(共五篇)

時(shí)間:2020-10-19 11:41:01下載本文作者:會(huì)員上傳
簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告》。

第一篇:數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告

20XX 報(bào) 告 匯 編 Compilation of reports

數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告

學(xué)

號(hào):

150906112

名:

武錦蓉

級(jí):

NET2 班

指導(dǎo)老師:

田喜平

時(shí)

間:

2016-12-21

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

項(xiàng)目名稱

一、項(xiàng)目構(gòu)思 程序由三個(gè)模塊組成:

(1)輸入模塊:無提示語(yǔ)句,直接輸入總?cè)藬?shù) n 和報(bào)數(shù)次數(shù) m,中間用逗號(hào)隔開。

(2)處理模塊:將元素儲(chǔ)存于順序表中。在主函數(shù)中根據(jù)報(bào)數(shù)間隔確定需要?jiǎng)h除的元素的位置,在順序表中設(shè)置該位置并刪除該位置,同時(shí)輸出該位置的值。反復(fù)設(shè)置并刪除直到表空。

(3)輸出模塊:分別在 DOS 下和文件中,按移除元素的順序依次顯示其位置。

約瑟夫環(huán)問題中的數(shù)據(jù)是人所在的位置,而這種數(shù)據(jù)是存在“第一元素、最后元素”,并且存在“唯一的前驅(qū)和后繼的”,符合線性表的特點(diǎn)。由于需要模擬約瑟夫環(huán)的出列問題,可以采用順序表來實(shí)現(xiàn)線性表,完成出列順序的輸出。

核心算法主要分為兩步:

1、確定需要?jiǎng)h除的位置,2、設(shè)置并刪除該位置。

已知報(bào)數(shù)間隔 m,我們可以把當(dāng)前位置加上 m 獲得需要?jiǎng)h除的位置,如果獲得的位置超過順序表中實(shí)際元素的總長(zhǎng)度,則可以通過減去數(shù)組的實(shí)際長(zhǎng)度來修正(即模擬環(huán)狀計(jì)數(shù))。然后把順序表中的當(dāng)前指向位置設(shè)置為該位置,繼而刪掉該位置。

反復(fù)進(jìn)行上述確定位置和刪除位置的操作,直到順序表為空。

程序主要功能模塊 1、輸入的形式和輸入值的范圍:

每一次輸入的值為兩個(gè)正整數(shù),中間用逗號(hào)隔開。

若分別設(shè)為 n,m,則輸入格式為:“n,m”。

不對(duì)非法輸入做處理,即假設(shè)輸入都是合法的。、輸出的形式:

輸出格式 1:在字符界面上輸出這 n 個(gè)數(shù)的輸出序列 輸出格式 2:將這 n 個(gè)數(shù)的輸出序列寫入到文件中、程序所能達(dá)到的功能:

對(duì)于輸入的約瑟夫環(huán)長(zhǎng)度 n 和間隔 m,輸出約瑟夫環(huán)的出列順序。、測(cè)試數(shù)據(jù):包括正確的輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及其輸出結(jié)果。

正確:

輸入:10,3

輸出:3 6 9 2 7 1 8 5 10 4

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

輸入:41,3 輸出:3 6 9 12 15 18 21 24 27 30 33 36 39 1 5 10 14 19 23 28 32 37 41 7 13 20 26 34 40 8 17 29 38 11 25 2 22 4 35 16 31

錯(cuò)誤:

輸入:10 3 輸出:6 8 7 1 3 4 2 9 5 10 二、程序清單 1、抽象數(shù)據(jù)類型的定義:

為實(shí)現(xiàn)上述程序的功能,可以用整數(shù)存儲(chǔ)用戶的輸入。并將用戶輸入的值存儲(chǔ)于線性表中。線性表 ADT 定義如下:

ADT list 數(shù)據(jù)對(duì)象:整形 數(shù)據(jù)關(guān)系:線性關(guān)系,即(0≤a<n)。

基本操作:

bool remove(int &elem)//移除一個(gè)元素,被移除的元素賦給 elem

//如果操作成功,返回 true,否則返回 false

bool isEmpty()//判斷數(shù)組的元素是否清空,空返回 true,否則返回false

bool setPos(int place)//設(shè)置當(dāng)前元素的位置,設(shè)置成功返回 true,否則返回 false

int getLength()//獲取數(shù)組的實(shí)際長(zhǎng)度、各程序模塊之間的層次(調(diào)用)關(guān)系:

主函數(shù)會(huì)按設(shè)計(jì)的方法調(diào)用順序表中“獲取實(shí)際長(zhǎng)度”、“設(shè)置需要?jiǎng)h除元素的位置”、“移除該位置元素”和“判斷是否為空表”四種方法方法,使元素依次出列,并正確結(jié)束程序。

用整形存儲(chǔ)用戶輸入的整數(shù)。

用順序表實(shí)現(xiàn)線性表:

class AList {

private:

int *listArray;//指向數(shù)組的指針

int realSize;//數(shù)組中含有元素的實(shí)際長(zhǎng)度

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

int fence;//指向當(dāng)前元素下標(biāo)

public:

AList(int s)//構(gòu)造函數(shù),初始化數(shù)組

{

listArray=new int[s];

for(int i=0;i

listArray[i]=i+1;//數(shù)組值等于數(shù)組下標(biāo)+1

realSize=s;

fence=0;//指向首元素

}

bool remove(int &elem)//移除一個(gè)元素

{

if(isEmpty())return false;//如果數(shù)組為空返回 false

elem = listArray[fence];

for(int i=fence;i

{

listArray[i]=listArray[i+1];

}

realSize--;

return true;

}

bool isEmpty()//判斷數(shù)組的元素是否清空

{

if(realSize==0)return true;

else return false;

}

bool setPos(int place)//設(shè)置當(dāng)前元素的位置

{

if(place>=0&&place<=realSize)

{

fence=place;

return true;

}

return false;

}

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

int getLength()//獲取數(shù)組長(zhǎng)度

{

return realSize;

}

};

在主函數(shù)中調(diào)用上述模塊的方法:

ofstream fout;//文件流

fout.open(“C:Josephus.txt”);//設(shè)置文件路徑

int n,m,elem,point=0;

scanf(“%d,%d”,&n,&m);//獲得用戶輸入

AList alist(n);//創(chuàng)建順序表對(duì)象

while(!alist.isEmpty())//如果順序表不為空,繼續(xù)刪除

{

m=m%alist.getLength();//調(diào)整計(jì)數(shù)的長(zhǎng)度

if(m==0)m=alist.getLength();

if(point+m-1

else{point=point+m-alist.getLength()-1;}

alist.setPos(point);//設(shè)置當(dāng)前需要?jiǎng)h除的位置

alist.remove(elem);//刪除元素

cout<

fout<

四、測(cè)試結(jié)果(截圖顯示)

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

五、遇到的問題及解決方法 1、初始化部分為循環(huán)賦值,時(shí)間復(fù)雜度為Θ(n)。

2、處理部分,我為了提高效率沒有采用循環(huán)尋找的方法,直接利用數(shù)學(xué)關(guān)系通過當(dāng)前位置獲得下一位置,因此對(duì)于長(zhǎng)度為 n 的約瑟夫環(huán),只做了 n 次定位,每次定位的復(fù)雜度為Θ(1),所以時(shí)間復(fù)雜度為Θ(n)。

但是用順序表實(shí)現(xiàn)時(shí),每次其移除的方法是時(shí)間復(fù)雜度為Θ(k)的(k 與實(shí)際長(zhǎng)度有關(guān)),所以處理部分總的結(jié)果是(2)1(n n ?)的,化簡(jiǎn)后時(shí)間復(fù)雜度仍然為Θ(n 2)。

綜上,該算法的時(shí)間代價(jià)為Θ(n 2)。

(PS:如果是用循環(huán)查找,在 n 次定位中每次都使用了 m 次的循環(huán),至少是Θ(n*m),然后再用順序表的移除方法,總的復(fù)雜度應(yīng)該是Θ(m*n 2)的。)

事實(shí)上要用線性表來完成這道題,其復(fù)雜度最好也是Θ(n 2)的,畢竟對(duì)于 n個(gè)數(shù)據(jù),每個(gè)都要進(jìn)行時(shí)間復(fù)雜度為Θ(n)的刪除工作。欲到達(dá)Θ(n)的效率除非不用線性表來實(shí)現(xiàn)。

六、體會(huì)

輸入人數(shù) n,報(bào)數(shù)間隔 m,創(chuàng)建順序表對(duì)象。

報(bào)告文檔·借鑒學(xué)習(xí)word 可編輯·實(shí)用文檔

主程序

輸入和輸出的格式:

輸入:10,3 輸出:3

10(文本中的輸出):3

!isEmpty()//順序表不為空 確定需要?jiǎng)h除的位置

Remove()//調(diào)用刪除方法

第二篇:南航計(jì)算機(jī)軟件數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)踐報(bào)告

數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告整理 031040102 劉玉 ? 簡(jiǎn)述每一部分的對(duì)象、目的和要求;

? 畫出程序流程圖;另附A4紙手繪; ? 附源程序清單; ? 實(shí)驗(yàn)的收獲:遇到的問題以及解決的辦法、方法的優(yōu)缺點(diǎn)。

實(shí)驗(yàn)一 單鏈表的基本操作與運(yùn)算

題目一:?jiǎn)捂湵淼亩x、創(chuàng)建、插入和刪除操作,將數(shù)據(jù)元素顯示出來。

本題目針對(duì)單鏈表。聯(lián)表示通過一組任意的存儲(chǔ)單元來存儲(chǔ)線性表格中的數(shù)據(jù)元素。為了建立起數(shù)據(jù)元素之間的存儲(chǔ)關(guān)系,設(shè)置每一個(gè)結(jié)點(diǎn),結(jié)點(diǎn)既存放數(shù)據(jù)data,又存放其后繼地址的部分next。而每個(gè)結(jié)點(diǎn)中只有一個(gè)指向后繼的指針,所以稱其為單鏈表。本題目的要求是創(chuàng)建一個(gè)新的鏈表,并且完成鏈表的創(chuàng)建定義。鏈表是一種動(dòng)態(tài)管理的存儲(chǔ)結(jié)構(gòu),鏈表中的每一個(gè)結(jié)點(diǎn)所占用的空間是根據(jù)運(yùn)行是的實(shí)際需要的空間生成的。因此建立單鏈表是從空鏈表開始的,每次讀入一個(gè)數(shù)據(jù)元素就申請(qǐng)一個(gè)結(jié)點(diǎn)鏈表的一段。在單鏈表中插入一個(gè)結(jié)點(diǎn)不需要移動(dòng)元素指針的指向。而刪除則需要找到木比啊偶元素的前驅(qū)結(jié)點(diǎn),并且修改指針的指向。題目一需要的操作就是,對(duì)于一個(gè)新建的空鏈表,以其為對(duì)象進(jìn)行具體的數(shù)據(jù)的插入填寫。待鏈表中存有數(shù)據(jù)后,再進(jìn)行數(shù)據(jù)的整理查找,然后刪除目標(biāo)數(shù)據(jù)。

//031040102單鏈表 #include #define SLNODE struct node SLNODE

//定義一個(gè)鏈表 { int data;SLNODE *next;};void CREATE_SL(SLNODE *h)//創(chuàng)建一個(gè)單鏈表 { SLNODE *p,*s;int x;h->next=NULL;

cout<<“輸入以-1結(jié)尾的一組數(shù)”<

cin>>x;

//開始輸入數(shù)據(jù)

while(x!=-1)

{

s=new SLNODE[sizeof(SLNODE)];

//申請(qǐng)一個(gè)動(dòng)態(tài)新空間

s->data=x;

if(h->next==NULL)

h->next=s;

else

p->next=s;

p=s;

cin>>x;

}

p->next=NULL;

//鏈表最后指向空 };int Insert_LinkList(SLNODE *h,int i,int x)

//在單鏈表第i個(gè)位置插入x {

SLNODE *p,*s;int j=0;

p=h;while(p->next!=NULL&&j

{

p=p->next;

j++;

}

if(j!=i-1){

cout<<“i is invalid!”<

return 0;}

else {

s=new SLNODE[sizeof(SLNODE)];

s->data=x;

s->next=p->next;

p->next=s;

return 1;

} };int Del_LinkList(SLNODE *h,int i)

//刪除單鏈表上第i個(gè)結(jié)點(diǎn) {

SLNODE *p,*s;int j=0;p=h;while(p->next!=NULL&&j

p=p->next;j++;

} if(j!=i-1){

cout<<“i is invalid!”<

return 0;4 6 8 9 7 2 6 9 7 5-1 } 鏈表數(shù)據(jù)如下

else 4 6 8 9 7 2 6 9 7 5 { 輸入需插入的數(shù)據(jù)8

if(p->next==NULL)輸入需插入的結(jié)點(diǎn)3

{ 插入成功

cout<<“第i個(gè)結(jié)點(diǎn)不存在鏈表數(shù)據(jù)如下 ”<

return 0;輸入需刪除的結(jié)點(diǎn) 4

} 刪除成功

else 鏈表數(shù)據(jù)如下

{s=p->next;p->next=s->next;

7 2 6 9 7 */

//刪除結(jié)點(diǎn)

Deletes;

//釋放結(jié)點(diǎn)空間

return 1;

} } };void Print_LinkList(SLNODE *h)//輸出鏈表中所有元素

{ SLNODE *p;p=h->next;cout<<“鏈表數(shù)據(jù)如下”<next!=NULL;p=p->next){

cout<

data<<'t';} cout<

data<next=NULL;CREATE_SL(h);Print_LinkList(h);cout<<“輸入需插入的數(shù)據(jù)”<>x;cout<<“輸入需插入的結(jié)點(diǎn)”<>i;if(Insert_LinkList(h,i,x))

cout<<“插入成功”<

cout<<“插入失敗”<>i;if(Del_LinkList(h,i))

cout<<“刪除成功”<

cout<<“刪除失敗”<

實(shí)驗(yàn)一的收獲

實(shí)驗(yàn)一讓我對(duì)于鏈表的創(chuàng)建于定義有了更多的接觸與認(rèn)識(shí)。之前的學(xué)習(xí)經(jīng)驗(yàn)里主要是 扎實(shí),VC++,涉及鏈表的內(nèi)容,我學(xué)的不夠所以這次在軟件基礎(chǔ)時(shí)間里重新再次

學(xué)習(xí)。題目一比較簡(jiǎn)單,設(shè)僅是創(chuàng)建和插入以及刪除的基本操作。實(shí)驗(yàn)一的困難較小,我也是比較順利參照課本,完成體題目一,也讓我對(duì)于進(jìn)一步學(xué)習(xí)鏈表有了興趣和動(dòng)力。由淺入深,我會(huì)一點(diǎn)點(diǎn)開展學(xué)習(xí)。在圖書館借閱一本《數(shù)據(jù)結(jié)構(gòu)教程上機(jī)實(shí)驗(yàn)指

導(dǎo)》,里面對(duì)于實(shí)驗(yàn)的指導(dǎo)比較全面而且有很多實(shí)例可以參考。

上機(jī)實(shí)踐二 題目二:棧、隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的定義、創(chuàng)建、插入和刪除操作,將數(shù)據(jù)元素顯示出來。本題目要求掌握棧和列隊(duì)。棧和列隊(duì)是

兩種常見的數(shù)據(jù)結(jié)構(gòu)。它們的邏輯結(jié)構(gòu)和線性表相同。其特點(diǎn)是,插入和刪除等運(yùn)算的位置有所限制:棧是按照先進(jìn)后出的規(guī)則進(jìn)行操作,而是按照先進(jìn)先出的規(guī)則進(jìn)行操作。堆棧技術(shù)現(xiàn)在的應(yīng)用非常廣泛,不管是編譯軟件還是程序設(shè)計(jì),在操作系統(tǒng)和事務(wù)管理中則是廣泛應(yīng)用了隊(duì)列技術(shù)。棧是限制在一段進(jìn)行插入和刪除的線性表,允許插入刪除的這一端稱為棧頂,固定端稱為棧底。棧是運(yùn)算受到限制的一種線

性表,采用順序存儲(chǔ)的是順序棧,采用鏈?zhǔn)酱鎯?chǔ)的是鏈棧。題目要求對(duì)于兩種存儲(chǔ)結(jié)構(gòu)

的棧進(jìn)行定義創(chuàng)建。對(duì)于順序棧,首先需要申請(qǐng)共享的一位數(shù)組空間。即為先置空棧,然后入棧插入元素(特別要注意棧滿不能插入),刪除出棧(特別要注意棧空不能出棧)。對(duì)于鏈棧,采用帶頭指針的單鏈表來實(shí)現(xiàn).隊(duì)列操作的順序隊(duì)列,插入在表的隊(duì)尾一端,刪除在表的另外的隊(duì)頭一端。隊(duì)的隊(duì)頭和隊(duì)尾都是活動(dòng)的,特別地需要設(shè)置隊(duì)頭和隊(duì)尾兩個(gè)指針。需要實(shí)現(xiàn)置空隊(duì)、入隊(duì)、出對(duì)、以及判別隊(duì)列是否為空的運(yùn)算。對(duì)于鏈?zhǔn)疥?duì)列,通常是用帶頭結(jié)點(diǎn)的單鏈表實(shí)現(xiàn)的,并且設(shè)置一個(gè)隊(duì)頭指針(始終指向頭結(jié)點(diǎn))和一個(gè)隊(duì)尾指針(指向當(dāng)前的最后一個(gè)元素),特別地,當(dāng)隊(duì)列為空時(shí)隊(duì)頭和隊(duì)尾指針均指向頭結(jié)點(diǎn)。顯示創(chuàng)建一個(gè)帶頭結(jié)點(diǎn)的空隊(duì),申請(qǐng)頭尾結(jié)點(diǎn),然后進(jìn)行如對(duì)操作不斷申請(qǐng)新的結(jié)點(diǎn),還需要進(jìn)行隊(duì)列是否為空的判斷操作,隊(duì)空則出隊(duì)失敗。

//031040102 順序棧 #include #define MaxSize 1024 #define ElemType int Typedef struct stack //定義一個(gè)棧 { ElemType data[MaxSize];int top;}SqStack;SqStack *Init_SeqStack()//棧的初始化 { SqStack *s;s=new SqStack[sizeof(SqStack)];s->top=-1;return s;};int IsEmpty_SeqStack(SqStack *s)//判空棧 { if(s->top==-1)

return 1;else

return 0;};int Push_SeqStack(SqStack *s,ElemType x)//入棧 { if(s->top==MaxSize-1)

return 0;else {

s->top++;

s->data[s->top]=x;

return 1;

}

};int Pop_SeqStack(SqStack *s,ElemType x)

//出棧

{ if(IsEmpty_SeqStack(s))

return 0;else

{

x=s->data[s->top];

s->top--;

return 1;

}

};

ElemType Top_SeqStack(SqStack *s)

//取出棧頂元素 {

if(IsEmpty_SeqStack(s))

return 0;

else

return(s->data[s->top]);

};void Print(SqStack *s)

//輸出棧內(nèi)所有元素 {

if(IsEmpty_SeqStack(s))

cout<<“

此棧為空

”<

cout<<“棧內(nèi)元素為”<

for(int i=s->top;i>-1;i--)

cout<data[i]<<'t';cout<

} };void main(){ SqStack *s;int x;

s=Init_SeqStack();cout<<“

輸入一組以-1結(jié)尾的數(shù)”<>x;while(x!=-1){

s->top++;

s->data[s->top]=x;

cin>>x;} Print(s);cout<<“輸入需插入的數(shù)”<>x;if(Push_SeqStack(s,x))

cout<<“插入成功”<

cout<<“插入失敗”<

Print(s);

delete p;if(Pop_SeqStack(s,x))

return top;

cout<<“刪除成功”<

cout<<“刪除失敗”<

Print(s);} 輸入一組以-1結(jié)尾的數(shù) 5 8 9 7 3 6 2 1 8-1 棧內(nèi)元素為 8 1 2 6 3 7 9 8 5 輸入需插入的數(shù)4 插入成功 棧內(nèi)元素為 4 8 1 2 6 3 7 9 8 5 刪除成功 棧內(nèi)元素為 8 1 2 6 3 7 9 8 5 //031040102 鏈棧 #include #define LinkStack struct linkstack #define elemtype int LinkStack

//定義一個(gè)鏈棧 { elemtype data;LinkStack *next;};LinkStack *Init_LinkStack()//鏈棧的初始化 { LinkStack *top;top=new LinkStack[sizeof(LinkStack)];top=NULL;return top;};LinkStack *Push_LinkStack(LinkStack *top,elemtype x)

//數(shù)據(jù)入棧 { LinkStack *s;s=new LinkStack[sizeof(LinkStack)];s->data=x;s->next=top;top=s;return top;};LinkStack *Pop_LinkStack(LinkStack *top,elemtype x)

//數(shù)據(jù)出棧 { LinkStack *p;if(top==NULL)

return NULL;else {

x=top->data;

p=top;

top=top->next;//輸出棧內(nèi)所有元素 { LinkStack *p;p=top;if(p==NULL)

cout<<“此棧為空”<

cout<<“棧內(nèi)元素為”<

for(;p->next!=NULL;p=p->next)

cout<

data<<'t';

cout<

data<>x;while(x!=-1){

s=new LinkStack[sizeof(LinkStack)];

s->data=x;

s->next=top;

top=s;

cin>>x;} Print(top);cout<<“輸入需插入的數(shù)”<>x;top=Push_LinkStack(top,x);Print(top);top=Pop_LinkStack(top,x);Print(top);} 輸入一組以-1結(jié)尾的數(shù) 7 9 8 4 3 6 1 23 65-1 棧內(nèi)元素為 65 23 1 6 3 4 8 9 7

輸入需插入的數(shù)15 棧內(nèi)元素為 15 65 23 1 6 3 4 8 9 7 棧內(nèi)元素為 65 23 1 6 3 4 8 9 7

//031040102 順序隊(duì)列 #include #define MaxSize 1024 #define ElemType int

typedef struct queue //定義一個(gè)順序隊(duì)列 { ElemType data[MaxSize];int rear,front;}SeQueue;SeQueue*Init_Queue()//隊(duì)列的初始化 { SeQueue *sq;sq=new SeQueue[sizeof(SeQueue)];sq->front=sq->rear=-1;return sq;};int IsEmpty_Queue(SeQueue *sq)//判空隊(duì)列 { if(sq->rear==-1)

return 1;else

return 0;};int In_Queue(SeQueue *sq,ElemType x)

//入隊(duì) { if(sq->rear==MaxSize-1)

return 0;else {

sq->rear++;

sq->data[sq->rear]=x;

return 1;} };int Out_Queue(SeQueue*sq)

//出隊(duì) { if(IsEmpty_Queue(sq))

return 0;else {

sq->front++;

return(sq->data[sq->front]);} };int Front_Queue(SeQueue *sq)//讀隊(duì)頭元素 { if(IsEmpty_Queue(sq))

return 0;else {

return(sq->data[sq->front+1]);} };void Print(SeQueue *sq)//輸出隊(duì)列所有元素 { if(IsEmpty_Queue(sq))

cout<<“此隊(duì)列為空”<

cout<<“隊(duì)列內(nèi)元素為”<

for(int i=sq->front+1;i<=sq->rear;i++)

cout<data[i]<<'t';

cout<

cin>>x;while(x!=-1){

sq->rear++;

sq->data[sq->rear]=x;

cin>>x;} Print(sq);cout<<“輸入需插入的數(shù)”<>x;if(In_Queue(sq,x))

cout<<“插入成功”<

cout<<“插入失敗”<

cout<<“刪除成功”<

cout<<“刪除失敗”< #define QNODE struct QNODE #define ElemType int QNODE

//定義鏈隊(duì)的結(jié)點(diǎn)類型 {

ElemType data;QNODE *next;};

typedef struct linkqueue

p=q->front->next;

//封裝頭尾指針

if(IsEmpty_LQueue(q)){

cout<<“此棧為空”<

cout<<“

隊(duì)列內(nèi)元素為

”<

{

for(;p->next!=q->rear->next;p=p->next)LinkQueue *q;

cout<

data<<'t';QNODE *p;

cout<

data<

} //申請(qǐng)頭尾節(jié)點(diǎn)

p=new QNODE[sizeof(QNODE)];//申請(qǐng)鏈隊(duì)頭結(jié)點(diǎn)

p->next=NULL;q->front=q->rear=p;return q;};void In_LQueue(LinkQueue *q,ElemType x)//入隊(duì)操作 {

QNODE *p;p=new QNODE[sizeof(QNODE)];//申請(qǐng)新結(jié)點(diǎn)

p->data=x;p->next=NULL;q->rear->next=p;q->rear=p;};int IsEmpty_LQueue(LinkQueue *q)//判隊(duì)空 { if(q->front==q->rear)

return 1;else

return 0;};int Out_LQueue(LinkQueue *q,ElemType x)//出隊(duì)操作 { QNODE *p;if(IsEmpty_LQueue(q))

return 0;else {

p=q->front->next;

q->front->next=p->next;

x=p->data;

delete p;

if(q->front->next==NULL)

//一個(gè)元素時(shí),出隊(duì)后隊(duì)空還要改隊(duì)尾指針

q->rear=q->front;

return 1;} };void Print(LinkQueue *q){ QNODE *p;};

void main(){ LinkQueue *q;QNODE *s;int x;

q=Init_LQueue();cout<<“輸入一組以-1結(jié)尾的數(shù)”<>x;while(x!=-1)

{

s=new QNODE[sizeof(QNODE)];

s->data=x;

s->next=NULL;

q->rear->next=s;

q->rear=s;

cin>>x;

}

Print(q);cout<<“輸入需插入的數(shù)”<>x;In_LQueue(q,x);Print(q);if(Out_LQueue(q,x))

cout<<“刪除成功”<

else

cout<<“刪除失敗”<

隊(duì)列內(nèi)元素為 8 9 4 5 3 2 1

實(shí)驗(yàn)二的收獲

實(shí)驗(yàn)二是全新的知識(shí)需要理解。在之前的學(xué)習(xí)經(jīng)歷中沒有接觸到棧和隊(duì)列。所以這

次是從概念開始學(xué)習(xí)的。在具體程序的學(xué)習(xí)應(yīng)用時(shí)候,我對(duì)于書上提到的,首先需要的是為棧申請(qǐng)共享空間,有了理解和認(rèn)識(shí)。特別地,在棧空的時(shí)候有s->top[0]==-1;s->top[1]==Maxsize。再有就是棧滿的時(shí)候不可以入棧操作,未滿的入棧操作則是先移動(dòng)再賦入值。例如語(yǔ)句(兩句的順序不可以顛倒)s->top++;s->data[s->top]=x;由于棧的主要運(yùn)算是在棧頂插入、刪除。因此我在鏈表的頭部作為棧頂,這樣方便了程序,而且不需要像單鏈表一樣為了運(yùn)算方便附加一個(gè)頭結(jié)點(diǎn)。在聯(lián)系隊(duì)列的相關(guān)程序時(shí)候,我理解了,列隊(duì)單向空間無法利用,即為前面的已經(jīng)被指針制動(dòng)過的空間不能釋放也無法利用。除此,隊(duì)列的操作里面。有可能出現(xiàn)“隊(duì)滿”“隊(duì)空”的條件相同,front==rear;需要具體區(qū)分。

上機(jī)實(shí)踐三

題目三:二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)定義、創(chuàng)建、先序和后序遍歷,并將結(jié)果序列輸出。

二叉樹是有限個(gè)元素的集合,該集合或者為空、或者由一個(gè)稱為根的元素以及兩個(gè)不相交的、被稱為左子樹右子樹的二叉樹組成。二叉樹的臉是存儲(chǔ)結(jié)構(gòu)是指,用鏈表來表示一顆二叉樹,即用鏈表來表示元素的邏輯關(guān)系。二叉樹的鏈表存儲(chǔ)的結(jié)點(diǎn)有三個(gè)域組成,除了數(shù)據(jù)域外,還有兩個(gè)指針域,分別用來指向該節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子結(jié)點(diǎn)的存儲(chǔ)地址。當(dāng)左子結(jié)點(diǎn)或者右子結(jié)點(diǎn)不存在的時(shí)候,相應(yīng)的指針值域?yàn)榭铡6鏄涞谋闅v是指按照某種順序結(jié)構(gòu)訪問二叉樹的每個(gè)結(jié)點(diǎn),使每個(gè)結(jié)點(diǎn)僅被訪問一次。限定先左后右,只有三種方式即為先序遍歷、中序遍歷、后序遍歷。遍歷其實(shí)是一個(gè)遞歸的過程,若二叉樹為空,則遍歷結(jié)束,不然就按照順序依次訪問根結(jié)點(diǎn)、左結(jié)點(diǎn)、右結(jié)點(diǎn)。

//031040102 二叉樹 #include #define elemtype char typedef struct BiTNode

//定義二叉樹結(jié)點(diǎn) { elemtype data;

BiTNode *lchild,*rchild;//兩結(jié)點(diǎn)指針

}BiTree;

BiTree *Create()//二叉樹的創(chuàng)建,遞歸算法 { BiTree *bt;elemtype ch;cin>>ch;if(ch=='0'){

bt=NULL;} else {

bt=new BiTNode[sizeof(BiTNode)];

bt->data=ch;

bt->lchild=Create();

bt->rchild=Create();} return bt;};

void PreOrder(BiTree *bt)

//先序遍歷二叉樹,遞歸算法 { if(bt==NULL)

return;cout<data<<'t';PreOrder(bt->lchild);PreOrder(bt->rchild);};

void PostOrder(BiTree *bt)

//先序遍歷二叉樹,遞歸算法 { if(bt==NULL)

return;PostOrder(bt->lchild);PostOrder(bt->rchild);cout<data<<'t';};

void main(){ BiTree *bt;cout<<“輸入所需字符(空結(jié)點(diǎn)以零代替)”<

輸入所需字符(空結(jié)點(diǎn)以零代替)frt0e000qj00m00

先序遍歷可得二叉樹元素為 f r t e q j m 后序遍歷可得二叉樹元素為 e t r j m q f

實(shí)驗(yàn)三的收獲

二叉樹可以用計(jì)算機(jī)語(yǔ)言來讀取,通過遍歷可以恢復(fù)二叉樹。通過這次試驗(yàn)更加深刻理解二叉樹。本體操作不斷調(diào)用函數(shù),遞歸實(shí)現(xiàn)遍歷。實(shí)際需要的時(shí)候?qū)τ谝阎亩鏄涞拿總€(gè)結(jié)點(diǎn)逐一訪問。一次完整的便利科室的一個(gè)二叉樹的結(jié)點(diǎn)信息由非線性排列轉(zhuǎn)變?yōu)橐饬x上的線性排列。在二叉樹的鏈表中無法根據(jù)結(jié)點(diǎn)找到其父結(jié)點(diǎn)。不過,二叉樹的鏈表結(jié)構(gòu)靈巧簡(jiǎn)便、操作方便。特別地還節(jié)省空間。對(duì)于一個(gè)龐大的工程型程序的話,空間與簡(jiǎn)便十分重要。同樣的目的,同樣的結(jié)果,需要比較選擇,肯定是精巧簡(jiǎn)單操作性強(qiáng)等等優(yōu)勢(shì)作為判斷取舍。

上機(jī)實(shí)踐四

題目四:查找:順序查找、二分查找

查找是許多程序中最為耗費(fèi)時(shí)間的部分。因此需要方法提高運(yùn)行的速度和效率。順序查找又稱為線性查找,也是最為基本的查找方法之一。具體實(shí)現(xiàn)為:從表的一端開始,依次將關(guān)鍵碼與給定的值比較,若找到查找成功,并且給出數(shù)據(jù)元素在表中的位置,若整個(gè)表查找完成仍未找到相同的關(guān)鍵碼,則查找失敗給出失敗信息。

二分法查找只適用于順序存儲(chǔ)的有序表。有序表即是表中數(shù)據(jù)元素按照關(guān)鍵碼的升序或者降序排列。去中間元素作為比較對(duì)象,若給定值與中間元素的關(guān)鍵碼相等,則為查找成功;若給定值小于中間元素的關(guān)鍵碼,則在中間元素的左半?yún)^(qū)繼續(xù)查找,若給定值大于中間元素的關(guān)鍵碼,則在中間元素的右半?yún)^(qū)繼續(xù)查找。不斷重復(fù)上述的查找過程直到查找成功,或者所查找的區(qū)域,沒有該元素查找失敗。

//031040102順序查找 #include #define KeyType int #define ElemType int

#define MaxSize 1024 typedef struct { KeyType key;

//定義關(guān)鍵碼字段

ElemType elem;//定義其他字段 }elemtype;

typedef struct

//順序存儲(chǔ)結(jié)構(gòu)定義 { elemtype elem[MaxSize];//定義數(shù)組

int length;

//表長(zhǎng)度 }S_TBL;

S_TBL *Init_S_TBL()

//順序表的初始化 { S_TBL *s;s=new S_TBL[sizeof(S_TBL)];s->length=-1;return s;};

int s_search(S_TBL *tbl,KeyType kx)//在表tbl中查找關(guān)鍵碼為kx的數(shù)據(jù)元素 { tbl->elem[0].key=kx;

//存放檢測(cè)

for(int

i=tbl->length;tbl->elem[i].key!=kx;i--);

//從表尾向前查找

return i;};

void main(){ S_TBL *tbl;tbl=Init_S_TBL();int i,k;cout<<“輸入一組以-1結(jié)尾的數(shù)(關(guān)鍵碼字段)”<>k;while(k!=-1){

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;} i=1;cout<<“輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素)”<>k;while(k!=-1){

tbl->elem[i].elem=k;

i++;

cin>>k;} cout<<“請(qǐng)輸入所需查找數(shù)的關(guān)鍵碼字段:”<>k;i=s_search(tbl,k);if(i)

{

flag=mid;

cout<<“查找成功”<

break;

cout<<“所查找的數(shù)為//查找成功,元素位置設(shè)置到flag中 ”<elem[i].elem<

} } } else return flag;

cout<<“查找失敗”< #define KeyType int #define ElemType int #define MaxSize 1024 typedef struct { KeyType key;

//定義關(guān)鍵碼字段

ElemType elem;

//定義其他字段 }elemtype;typedef struct

//順序存儲(chǔ)結(jié)構(gòu)定義 { elemtype elem[MaxSize];//定義數(shù)組

int length;

//表長(zhǎng)度 }S_TBL;S_TBL *Init_S_TBL()

//順序表的初始化 { S_TBL *s;s=new S_TBL[sizeof(S_TBL)];s->length=-1;return s;};int Binary_search(S_TBL *tbl,KeyType kx)//在表tbl中查找關(guān)鍵碼為kx的數(shù)據(jù)元素 { int mid,flag=0,low=1,high=tbl->length;//1.設(shè)置初始區(qū)間

while(low<=high)

//2.表空測(cè)試

{

//非空,進(jìn)行比較測(cè)試

mid=(low+high)/2;

//3.得到中間點(diǎn)

if(kxelem[mid].key)

high=mid-1;

//調(diào)整到左半?yún)^(qū)

else if(kx>tbl->elem[mid].key)

low=mid+1;

//調(diào)整到右半?yún)^(qū)

else

{ //返回該元素在表中的位置,或返回0 };void main(){ S_TBL *tbl;tbl=Init_S_TBL();int i,k;cout<<“輸入一組以-1結(jié)尾的數(shù)(關(guān)鍵碼字段)”<>k;while(k!=-1){

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;} i=1;cout<<“輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素)”<>k;while(k!=-1){

tbl->elem[i].elem=k;

i++;

cin>>k;} cout<<“輸入所需查找數(shù)的關(guān)鍵碼字段”<>k;i=Binary_search(tbl,k);if(i){

cout<<“查找成功”<

cout<<“所查找的數(shù)為”<elem[i].elem<

}

else

cout<<“查找失敗”<

-1結(jié)尾的數(shù)(數(shù)據(jù)元素)33 22 11 55 99 77 88 66 44-1 輸入所需查找數(shù)的關(guān)鍵碼字段3 查找成功

所查找的數(shù)為33 實(shí)驗(yàn)四的收獲

查找的程序?qū)ξ襾碚f不陌生。兩種基本方法的比較和應(yīng)用里,我留意了最大查找次

數(shù)的不同。順序查找的進(jìn)行,如果查找不成功那么會(huì)議共比較N+1次。當(dāng)數(shù)據(jù)量很大的時(shí)候,平均查找長(zhǎng)度過大,當(dāng)然順序查找對(duì)于數(shù)據(jù)的存貯方式?jīng)]有任何的要求。折半查找會(huì)有一個(gè)平均查找長(zhǎng)度以及查找的最大長(zhǎng)度。

我比較傾向于這本查找,其查找的效率明顯會(huì)高于順序查找。特別地,我還留意到對(duì)于單鏈表結(jié)構(gòu),無法進(jìn)行二分法的查找,因?yàn)槿康脑氐亩ㄎ恢荒軓闹羔橀_始。對(duì)于線性列表只能采取順序查找的方式。

上機(jī)實(shí)踐五

題目五:排序(插入排序選擇排序冒泡排序)排序是數(shù)據(jù)處理中經(jīng)常使用的一種重要的運(yùn)算,其目的就是將一組數(shù)據(jù)按照規(guī)定的順序進(jìn)行排列。排序的目的是便于查詢和處理。插入排序的基本思想是每一步將一個(gè)待排序的元素,按照其關(guān)鍵字嗎的大小,插入到前面已經(jīng)排序號(hào)的一組元素的適當(dāng)?shù)奈恢蒙希浪械脑囟疾迦霝橹埂R话愕卣J(rèn)為插入排序是一個(gè)穩(wěn)定的排序方法。選擇排序,每次從當(dāng)前待排序的記錄中,通過依次地進(jìn)行關(guān)鍵字媽的比較從中選擇一個(gè)關(guān)鍵字最小的記錄,并且把它與當(dāng)前待排序的第一個(gè)記錄進(jìn)行交換。直接選擇排序是一個(gè)不穩(wěn)定的排序方法。冒泡排序是一種簡(jiǎn)單的交換排序的方法。一次地比較相鄰兩個(gè)記錄的關(guān)鍵字,若發(fā)現(xiàn)兩個(gè)記錄的次序相反(即位前一個(gè)記錄的關(guān)鍵字大雨后有一個(gè)記錄的關(guān)鍵字),進(jìn)行記錄的交換一直到?jīng)]有反序?yàn)橹埂O端情況下,冒泡排序會(huì)有最短與最長(zhǎng)時(shí)間,整個(gè)隊(duì)列越是接近有序,則冒泡排序的進(jìn)行次數(shù)越少。

//031040102 插入排序 #include #define KeyType int #define ElemType int #define MaxSize 1024 typedef struct { KeyType key;

//定義關(guān)鍵碼字段

ElemType elem;

//定義其他字段 }elemtype;

typedef struct

//順序存儲(chǔ)結(jié)構(gòu)定義 { elemtype elem[MaxSize];

//定義數(shù)組

int length;

//表長(zhǎng)度 }S_TBL;

S_TBL *Init_S_TBL()

//順序表的初始化 { S_TBL *s;s=new S_TBL[sizeof(S_TBL)];s->length=-1;return s;};

int Binary_search(S_TBL *tbl,KeyType kx)//在表tbl中查找關(guān)鍵碼為kx的數(shù)據(jù)元素 { int mid,flag=0,low=1,high=tbl->length;//1.設(shè)置初始區(qū)間

while(low<=high)

//2.表空測(cè)試

{

//非空,進(jìn)行比較測(cè)試

mid=(low+high)/2;

//3.得到中間點(diǎn)

if(kxelem[mid].key)

high=mid-1;

//調(diào)整到左半?yún)^(qū)

else if(kx>tbl->elem[mid].key)

low=mid+1;

//調(diào)整到右半?yún)^(qū)

else

{

flag=mid;

break;

//查找成功,元素位置設(shè)置到flag中

} } Return flag;//返回該元素在表中的位置,或返回0 };

void main(){ S_TBL *tbl;tbl=Init_S_TBL();int i,k;cout<<“輸入一組以-1結(jié)尾的數(shù)(關(guān)鍵碼字段)”<>k;while(k!=-1){

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;} i=1;cout<<“輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素)”<>k;

while(k!=-1)};{ void Print(RecType R[],int n)

tbl->elem[i].elem=k;

i++;

cin>>k;} cout<<“輸入所需查找數(shù)的關(guān)鍵碼字段”<>k;i=Binary_search(tbl,k);if(i){

cout<<“查找成功”<

cout<<“所查找的數(shù)為”<elem[i].elem<

cout<<“查找失敗”< #define keytype int #define itemtype int #define MaxSize 50 typedef struct RecType //定義排序記錄的形式 { keytype key;itemtype otherinfo;}RecType;void SelectSort(RecType R[],int n)//選擇排序函數(shù) { int i,j,k;for(i=1;i

k=i;

for(j=i+1;j<=n;j++)

if(R[j].key

k=j;

if(k!=i)

{

R[0]=R[k];

R[k]=R[i];

R[i]=R[0];

} } //輸出數(shù)組內(nèi)所有元素 { cout<<“關(guān)鍵字段為:”<

cout<

cout<>x;while(x!=-1){

R[++n].key=x;

cin>>x;} n=0;cout<<“請(qǐng)輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素):”<>x;while(x!=-1){

R[++n].otherinfo=x;

cin>>x;}

cout<<“

排序前

”<

Print(R,n);SelectSort(R,n);cout<<“排序后”<

請(qǐng)輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素): 33 22 11 44 55 66 99 88 77-1 排序前 關(guān)鍵字段為: 6 9 7 4 1 5 6 8 3 所有元素為: 33 22 11 44 55 66 99 88

排序后 關(guān)鍵字段為: 1 3 4 5 6 6 7 8 9 所有元素為: 55 44 66 33 99 11 88 22 //031040102 冒泡排序 #include #define keytype int #define itemtype int

#define MaxSize 50

cin>>x;typedef struct RecType

}

//定義排序記錄的形式

cout<<“排序前:”<

請(qǐng)輸入一組以

-1結(jié)尾的數(shù)(關(guān)鍵碼字段): //選擇排序函數(shù) { int i,j,flag;for(i=1;i

flag=1;

for(j=1;j<=n-i;j++)

if(R[j+1].key

{

flag=0;

R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

}

if(flag==1)

return;} };void Print(RecType R[],int n)//輸出數(shù)組內(nèi)所有元素 { cout<<“關(guān)鍵字段為:”<

cout<

cout<>x;while(x!=-1){

R[++n].key=x;

cin>>x;} n=0;cout<<“請(qǐng)輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素):”<>x;while(x!=-1){

R[++n].otherinfo=x;9 8 7 4 1 5 6-1 請(qǐng)輸入一組以-1結(jié)尾的數(shù)(數(shù)據(jù)元素): 11 22 33 44 66 55 77 88-1 排序前: 關(guān)鍵字段為: 6 9 8 7 4 1 5 6 所有元素為: 11 22 33 44 66 55 77 88 排序后: 關(guān)鍵字段為: 1 4 5 6 6 7 8 9 所有元素為: 55 66 77 11 88 44 33 22 實(shí)驗(yàn)五的收獲

三種不同的排序方式,都是之前C++ 學(xué)習(xí)時(shí)候的重點(diǎn)掌握內(nèi)容。

直接插入排序的算法很簡(jiǎn)潔,也很容易實(shí)現(xiàn)。從空間看,它只需要一個(gè)元素的輔助,從實(shí)踐看該算法的主程序運(yùn)行次數(shù)只比元素的個(gè)數(shù)少一。當(dāng)然由于原列表的排序狀況未知,其總比較次數(shù)和總的移動(dòng)次數(shù)也是未定的,取平均數(shù)約為0.25N^2。對(duì)于直接選擇排序,比較次數(shù)與原表元素的排列順序無關(guān),移動(dòng)次數(shù)有關(guān)。根據(jù)冒泡排序的思想,待排序的記錄有序之

后,則在下一趟的排序時(shí)候不會(huì)再有記錄的交換位置,由此,我增加了一個(gè)標(biāo)記flag,來直觀表示每一次的排序是否需要發(fā)生交換,無交換則已經(jīng)完成可以結(jié)束冒泡。特別地冒泡排序需要增加一個(gè)附加的單元來實(shí)現(xiàn)元素的交換。在交換時(shí)需要留意免得出錯(cuò)。

·

第三篇:數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)報(bào)告

北京聯(lián)合大學(xué)

實(shí)訓(xùn)報(bào)告

課程(項(xiàng)目)名稱: 數(shù)據(jù)結(jié)構(gòu) 學(xué) 院: 專 業(yè): 班 級(jí): 學(xué) 號(hào):

姓 名: 成 績(jī):

2012年 6 月 21 日

數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)任務(wù)一

一、任務(wù)與目的:

1、用順序表表示兩個(gè)無序集合A、B,實(shí)現(xiàn)集合的如下操作,求兩個(gè)集合的并集、交集、差集。

2、用順序表表示兩個(gè)集合A、B(集合A、B都是有序遞增的情況)實(shí)現(xiàn)集合的如下操作,求兩個(gè)集合的并集、交集、差集。

3、用帶頭單鏈表存儲(chǔ)結(jié)構(gòu)表示兩個(gè)無序集合A、B,實(shí)現(xiàn)集合的如下操作,求兩個(gè)集合的并集、交集、差集。

4、用帶頭單鏈表存儲(chǔ)結(jié)構(gòu)表示兩個(gè)集合A、B(集合A、B都是有序遞增的情況),實(shí)現(xiàn)集合的如下操作,求兩個(gè)集合的并集、交集、差集。

5、殺人游戲 N個(gè)人坐成一圈玩殺人游戲,按順時(shí)針編號(hào)

N。從1號(hào)開始順時(shí)針開始數(shù)到第m號(hào)就殺掉第一個(gè)人,被殺掉的人要退出游戲。

如果數(shù)到了編號(hào)的末尾,接著數(shù)開頭的編號(hào)。

重復(fù),直至殺掉一半人時(shí),游戲結(jié)束,聰明的你能告訴我活到最后的幸存者最初的編號(hào)是多少嗎? 輸入數(shù)據(jù):N、M ;輸出數(shù)據(jù):幸存者的編號(hào)

分析該程序,如果N=20,M=2,……10。聰明的你應(yīng)選擇的編號(hào)是多少,(提示,計(jì)算出M分別等于1到10的情況下,那些編號(hào)生存概率較大)。給出實(shí)驗(yàn)結(jié)果

6、作業(yè)抽查問題:有35個(gè)學(xué)生的班級(jí),由于某種原因不能夠做到全部檢查作業(yè),現(xiàn)在希望每次抽查10名學(xué)生,希望能夠隨機(jī)抽查,并能夠有記憶,即希望抽查過的學(xué)生,下次抽查的概率有所減小,但避免不被抽查。設(shè)計(jì)一個(gè)算法實(shí)現(xiàn)該功能,給出你的解釋。1.void BingSet(SqList A, SqList B,SqList &C){//求并集

int i,j;int flag=0;C.length=0;for(i=0;i

if(flag==0)

{C.elem[i]=B.elem[j];i++;} } C.length=i;}

void JiaoSet(SqList A, SqList B,SqList &C){//求交集

int i,j;int flag=0;C.length=0;i=0;for(j=0;j

if(flag!=0)

{C.elem[i]=B.elem[j];i++;} } C.length=i;}

void ChaSet(SqList A, SqList B,SqList &C){//求差集

int i,j,k;int flag=0;C.length=0;k=0;for(i=0;i

if(flag==0)

{C.elem[k]=A.elem[i];k++;} } C.length=k;} 運(yùn)行結(jié)果:

2.void BingSet(SqList A, SqList B,SqList &C){//求并集

int i,j,k;k=0;C.length=0;for(i=0,j=0;(i

{C.elem[k]=A.elem[i];k++;i++;

}

else

{if(A.elem[i]==B.elem[j])

{C.elem[k]=A.elem[i];k++;i++;j++;

}

else

{C.elem[k]=B.elem[j];k++;j++;}

} } if(i

{C.elem[k]=A.elem[i];k++;i++;

} } if(j

{C.elem[k]=B.elem[j];k++;j++;} } C.length=k;} void JiaoSet(SqList A, SqList B,SqList &C){//求交集

int i,j,k;k=0;C.length=0;for(i=0,j=0;(i

{i++;}

else

{if(A.elem[i]==B.elem[j])

{C.elem[k]=A.elem[i];k++;i++;j++;

}

else

{j++;}

} } C.length=k;}

void ChaSet(SqList A, SqList B,SqList &C){//求差集

int i,j,k;int flag=0;k=0;C.length=0;for(i=0,j=0;(i

{C.elem[k]=A.elem[i];i++;k++;

}

else

{if(A.elem[i]==B.elem[j])

{i++;j++;}

else

{j++;

}

} } if(i

{C.elem[k]=A.elem[i];k++;i++;} } C.length=k;}

void InserOrder_Sq(SqList &L,ElemType e){int i,j;for(i=0;i=e)break;} for(j=L.length-1;j>=i;j--)

L.elem[j+1]=L.elem[j];L.elem[i]=e;L.length++;} 運(yùn)行結(jié)果:

3.void bing(link &p,link &h,link &q)

{//求并集

link l,s,m;int j=0,i=0;q=new LNode;q->date=NULL;q->next=NULL;s=p->next;m=q;while(s){l=new LNode;

l->date=s->date;

l->next=NULL;

s=s->next;

m->next=l;

m=l;

s=h->next;while(s){i=s->date;

j=Locate(p,i);

if(j==0){l=new LNode;

l->date=s->date;

l->next=NULL;

m->next=l;

m=l;

}

s=s->next;}

} void jiao(link &p,link &h,link &q)

{ //求交集

link l,s,t,m;int j=0;Elem i=0;q=new LNode;q->date=NULL;q->next=NULL;m=q;

s=h->next;while(s){i=s->date;

j=Locate(p,i);

if(j==1)

{l=new LNode;

l->date=s->date;

l->next=NULL;

m->next=l;

m=l;

}

s=s->next;} } void cha(link &p,link &h,link &q)

{//求差集

link l,s,t,m;int j=0;Elem i=0;q=new LNode;q->date=NULL;q->next=NULL;m=q;s=p->next;while(s){i=s->date;

j=Locate(h,i);

if(j==0){l=new LNode;

l->date=s->date;

l->next=NULL;

m->next=l;m=l;}

s=s->next;} } void shengcheng(link &p,link &h,link &q)

{ int i,j=0;Elem e;for(i=0;i<11;){if(i==0){p=new LNode;

p->date=NULL;

p->next=NULL;

h=p;q=p;i++;}

else

{e=rand()%50+1;

j=Locate(p,e);

if(j==0)

{LInsert(p,e);i++;}}}} 運(yùn)行結(jié)果:

4.void bing(link &p,link &h,link &q)

{ //并集

link l,s,m;int j=0,i=0;q=new LNode;q->date=NULL;q->next=NULL;s=p->next;m=q;while(s){l=new LNode;

l->date=s->date;

l->next=NULL;

s=s->next;

m->next=l;

m=l;} s=h->next;while(s){i=s->date;

j=Locate(p,i);

if(j==0)

{LInsert(q,i);}

s=s->next;} } void jiao(link &p,link &h,link &q)

{//交集

link l,s,t,m;int j=0;Elem i=0;q=new LNode;q->date=NULL;q->next=NULL;m=q;s=h->next;while(s){i=s->date;

j=Locate(p,i);

if(j==1)

{l=new LNode;

l->date=s->date;

l->next=NULL;

m->next=l;

m=l;}

s=s->next;} } void cha(link &p,link &h,link &q)

{//差集

link l,s,t,m;int j=0;Elem i=0;q=new LNode;q->date=NULL;q->next=NULL;m=q;s=p->next;while(s){i=s->date;

j=Locate(h,i);

if(j==0)

{l=new LNode;

l->date=s->date;

l->next=NULL;

m->next=l;

m=l;}

s=s->next;} } void shengcheng(link &p,link &h,link &q)

{int i,j=0;Elem e;for(i=0;i<11;){if(i==0)

{p=new LNode;

p->date=NULL;

p->next=NULL;

h=p;q=p;i++;}

else

{e=rand()%50+1;

j=Locate(p,e);

if(j==0)

{LInsert(p,e);i++;}}}} 運(yùn)行結(jié)果:

5.#include #include #include #define LEN sizeof(struct kill)//定義struct kill 類型長(zhǎng)度

struct kill { int num;

struct kill *next;};

struct kill *create(int m)

{struct kill *head,*p1,*p2;int i;p1=p2=(struct kill*)malloc(LEN);head=p1;

head->num=1;

for(i=1,p1->num=1;inum=i+1;

p2->next=p1;p2=p1;} p2->next=head;return head;}

struct kill *findout(struct kill *start,int n){int i;

struct kill *p;i=n;p=start;

for(i=1;inext;return p;}

struct kill *letout(struct kill *last){struct kill *out,*next;out=last->next;

last->next=out->next;next=out->next;free(out);return next;} void main()

{ int m,n,i,servive;struct kill *p1,*p2;

cout<<“請(qǐng)輸入?yún)⒓託⑷擞螒蚩側(cè)藬?shù)m:”<>m;

cout<<“要?dú)⒌舻娜说男蛱?hào)n:”<>n;if(n==1){ servive=m;} else

{ p1=p2=create(m);for(i=1;i

p2=letout(p1);p1=p2;}

servive=p2->num;free(p2);}

cout<<“幸存者是:”<

6.#include #include #include using namespace std;//定義結(jié)構(gòu)體 struct Student {int id;

//學(xué)生id int times;

//定義學(xué)生抽查數(shù)};Student stu[35];//35個(gè)學(xué)生 int cho[10];

//抽查的10個(gè)學(xué)生 int top;

//已抽查學(xué)生數(shù) int choose(){int n=rand()%35;//隨機(jī)抽取 for(int i=0;i

int n2=rand()%stu[n].times;//否則幾率按抽取的次數(shù)減小,具體為(1/抽取次數(shù))if(n2==0)return n;else return choose();} void main(){char a='Y';srand(time(0));//隨機(jī)數(shù)初始化 int i;for(i=0;i<35;i++)//學(xué)生初始化 {stu[i].id=i+1;stu[i].times=0;} while(a=='Y'||a=='y'){int tmp;top=0;for(i=0;i<10;i++)//抽取10個(gè)學(xué)生 {tmp=choose();//抽取學(xué)生 cho[top++]=tmp;stu[tmp].times++;cout<<“第”<>a;}} 運(yùn)行結(jié)果:

數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)任務(wù)二

一、任務(wù)與目的:主要考察的是棧與隊(duì)列的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)。

1、用棧,判斷一個(gè)算數(shù)表達(dá)式中的圓括弧、方括弧和花括弧是否匹配。

2、用棧,把十進(jìn)制的整數(shù)轉(zhuǎn)換為二至九之間的任一進(jìn)制

3、設(shè)計(jì)一個(gè)算法,檢測(cè)一個(gè)字符串?dāng)?shù)組是否是回文,回文是指這個(gè)字符串是否關(guān)于中心對(duì)稱。int Check(char a[],int n)

4、采用SPT規(guī)則的單機(jī)生產(chǎn)計(jì)劃問題。問題描述如下,存在一臺(tái)機(jī)器,要加工n個(gè)工件,每個(gè)工件i都有一個(gè)確定的加工時(shí)間,采用按照 遞增的順序,進(jìn)行加工,計(jì)算每個(gè)工件的完成時(shí)間(初始加工時(shí)間為0)。設(shè)計(jì)一個(gè)算法,輸入工件數(shù)量n,隨機(jī)在[1,30]的區(qū)間內(nèi)產(chǎn)生每個(gè)工件的加工時(shí)間。按照SPT規(guī)則進(jìn)行加工,輸出每個(gè)工件的完成時(shí)間。

5、采用EDD規(guī)則的單機(jī)生產(chǎn)計(jì)劃問題。問題描述如下,存在一臺(tái)機(jī)器,要加工n個(gè)工件,每個(gè)工件i都有一個(gè)確定的加工時(shí)間,同時(shí)每個(gè)工件都有一個(gè)確定的交貨期,采用按照 遞增的順序,進(jìn)行加工,計(jì)算每個(gè)工件的完成時(shí)間(初始加工時(shí)間為0)。設(shè)計(jì)一個(gè)算法,輸入工件數(shù)量n,隨機(jī)在[1,30]的區(qū)間內(nèi)產(chǎn)生每個(gè)工件的加工時(shí)間,在區(qū)間[2,20*n]內(nèi)隨機(jī)產(chǎn)生每個(gè)工件的交貨期。按照EDD規(guī)則進(jìn)行加工,輸出每個(gè)工件的完成時(shí)間,計(jì)算每個(gè)工件i完成時(shí)間和 的差值。1.void Ininstack(stack &s)

{//初始化

s.elem=new stype[SIZE];s.top=-1;s.size=SIZE;s.insize=IN;} void INsize(stack &s)

{//擴(kuò)容

stype *a;int i;a=new stype[s.size+s.insize];for(i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.size+=s.insize;} void Push(stack &s,stype e)

{ //入棧

if(s.top==(s.size-1))INsize(s);s.top++;s.elem[s.top]=e;} stype Pop(stack &s)

{//出棧

stype e;e=s.elem[s.top];s.top--;return e;} stype GetTop(stack s)

{//取棧頂

stype e;e=s.elem[s.top ];return e;} void main(){stype e,t,ch;stack s;char a[20];int i=0,n;Ininstack(s);cout<<“請(qǐng)輸入算術(shù)表達(dá)式(以$結(jié)尾):”;while(ch!='$'){cin>>ch;

a[i]=ch;i++;} n=i;for(i=0;i

{e=a[i];Push(s,e);}

if(a[i]=='}'||a[i]==']'||a[i==')'])

{t=GetTop(s);

if(a[i]=='}' && t=='{')Pop(s);

else if(a[i]==']' && t=='[')

Pop(s);else if(a[i]==')' && t=='(')

Pop(s);}} if(s.top==-1)

cout<<“括號(hào)匹配!”<

cout<<“括號(hào)不匹配!”<

2.void Ininstack(stack &s)

{ //初始化

s.elem=new stype[SIZE];s.top=-1;s.size=SIZE;s.insize=IN;} void INsize(stack &s)

{ //擴(kuò)容

stype *a;int i;a=new stype[s.size+s.insize];for(i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.size+=s.insize;} void Push(stack &s,stype e)

{//入棧

if(s.top==(s.size-1))INsize(s);s.top++;s.elem[s.top]=e;} stype Pop(stack &s)

{ //出棧

stype e;e=s.elem[s.top];s.top--;return e;} void main(){stack s;int a,b;Ininstack(s);cout<<“請(qǐng)輸入任意非負(fù)十進(jìn)制數(shù):”;cin>>a;cout<<“請(qǐng)輸入需要轉(zhuǎn)換的進(jìn)制數(shù)(進(jìn)制數(shù)為二至九):”;cin>>b;while(a){Push(s,a%b);a=a/b;} while(!(s.top==-1))cout<

運(yùn)行結(jié)果:

3.void Ininstack(stack &s)

{ //初始化

s.elem=new stype[SIZE];s.top=-1;s.size=SIZE;s.insize=IN;} void INsize(stack &s)

{ //擴(kuò)容

stype *a;int i;a=new stype[s.size+s.insize];for(i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.size+=s.insize;} void Push(stack &s,stype e)

{//入棧

if(s.top==(s.size-1))INsize(s);s.top++;s.elem[s.top]=e;} void Error(char *a)

{ cout<

stype Pop(stack &s)

{ stype e;e=s.elem[s.top];s.top--;return e;} int Check(char a[],int n,stack &s)

{//判斷

int i;char e;Pop(s);for(i=0;i

urn 0;} void main(){stack s;

r ch,a[50];t i=0,n,t;instack(s);cout<<“請(qǐng)輸入字符串(以$結(jié)尾):”;while(ch!='$'){cin>>ch;[i]=ch;ush(s,ch);+;} n=i;Check(a,n,s);if(t==1)cout<<“是回文!”<

運(yùn)行結(jié)果:

4.void chushihua(sqlist &a)

//初始化 {a.elem=new elemtype[SIZE];

a.num=new elemtype[SIZE];

a.welem=new elemtype[SIZE];

a.length=0;

a.listsize=SIZE;

a.incrementsize=INCREMENT;} void paixu(sqlist a)

//排序 { int i,j,t,m;for(i=0;ia.elem[j+1]){ t=a.elem[j];m=a.num[j];a.elem[j]=a.elem[j+1];a.num[j]=a.num[j+1];a.elem[j+1]=t;a.num[j+1]=m;}} void shuchu(sqlist &a){int i;for(i=0;i

5.typedef struct {elemtype *elem;

//加工時(shí)間

elemtype *num;

//序號(hào)

elemtype *welem;

//完成時(shí)間

elemtype *jelem;

//交貨期

elemtype *celem;

//差值

int length;

//長(zhǎng)度

int listsize;

//分配量

int incrementsize;//增補(bǔ)量 }sqlist;void chushihua(sqlist &a)

//初始化 {a.elem=new elemtype[SIZE];

a.num=new elemtype[SIZE];

a.welem=new elemtype[SIZE];

a.celem=new elemtype[SIZE];

a.jelem=new elemtype[SIZE];

a.length=0;

a.listsize=SIZE;

a.incrementsize=INCREMENT;} void paixu(sqlist a)

//排序 {int i,j,t,m,p;for(i=0;ia.jelem[j+1]){ t=a.elem[j];p=a.jelem[j];m=a.num[j];a.elem[j]=a.elem[j+1];a.jelem[j]=a.jelem[j+1];a.num[j]=a.num[j+1];a.elem[j+1]=t;a.jelem[j+1]=p;a.num[j+1]=m;}} void shuchu(sqlist &a){int i;for(i=0;i

a.welem[i]=a.elem[i];else {a.welem[i]=a.elem[i]+a.welem[i-1];} a.celem[i]=a.jelem[i]-a.welem[i];cout<

數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)任務(wù)書三:二叉樹鏈?zhǔn)酱鎯?chǔ)的基本操作

1、創(chuàng)建二叉樹

a)熟悉使用教材的先序創(chuàng)建二叉樹的方法

b)編寫一個(gè)算法,實(shí)現(xiàn)在已知二叉樹的先序序列和中序序列的情況下創(chuàng)建二叉樹。

c)如果已知二叉樹的順序表示形式,將其轉(zhuǎn)換為二叉樹的鏈?zhǔn)酱鎯?chǔ)方式。

2、二叉樹的遍歷

a)先序、中序和后序三種形式的鏈?zhǔn)酱鎯?chǔ)遞歸式算法 b)先序、中序和后序三種形式的鏈?zhǔn)酱鎯?chǔ)非遞歸式算法 c)層次遍歷的算法。

3、二叉樹一些基本操作 a)計(jì)算二叉樹的深度; b)計(jì)算二叉樹的葉子節(jié)點(diǎn)個(gè)數(shù) c)計(jì)算二叉樹的單支節(jié)點(diǎn)的個(gè)數(shù) d)計(jì)算二叉樹的雙支節(jié)點(diǎn)的個(gè)數(shù)

4、編寫一個(gè)主函數(shù)能夠測(cè)試你所設(shè)計(jì)的算法。

主函數(shù)調(diào)用教材創(chuàng)建二叉樹的創(chuàng)建教材圖7-10的二叉樹鏈?zhǔn)酱鎯?chǔ)方式。

{p=st.a[st.top];

st.top--;

cout<

data;

while(p->right!=NULL)

{st.top++;

st.a[st.top]=p->right;

q=p->right;

while(q->left!=NULL)

{st.top++;

st.a[st.top]=q->left;

q=q->left;

}

代碼:#include #include #include #define MAXSIZE 20 int d=0;int l=0;typedef struct node

//二叉樹結(jié)點(diǎn)的結(jié)構(gòu)體表示形式 {char data;struct node* left,*right;}BTree;typedef BTree *Tree;typedef struct stackelem //棧的結(jié)構(gòu)體表示形式 {BTree* a[MAXSIZE];int top;}Stack;void CreateBiTree_Rec(Tree &T)//先序創(chuàng)建二叉樹的方法 {char ch;cin>>ch;if(ch=='#')

T=NULL;else {T= new BTree;

T->data=ch;

CreateBiTree_Rec(T->left);

CreateBiTree_Rec(T->right);}} void Preorder(Tree t)//前序遍歷,遞歸的方法 {if(NULL!=t){cout<data;

Preorder(t->left);

Preorder(t->right);}} void Preorder2(Tree t)//前序遍歷的非遞歸實(shí)現(xiàn)

{Tree p;Stack st;st.top=-1;if(NULL==t){return;} else {st.top++;

st.a[st.top]=t;

while(st.top!=-1)

{p=st.a[st.top];

st.top--;

cout<

data;

if(p->right!=NULL)

{st.top++;

st.a[st.top]=p->right;}

if(p->left!=NULL)

{st.top++;

st.a[st.top]=p->left;} void Inorder(Tree t)//中序遍歷,遞歸實(shí)現(xiàn) {if(NULL!=t){Inorder(t->left);

cout<data;

Inorder(t->right);}} void Inorder2(Tree t)//中序遍歷,非遞歸實(shí)現(xiàn) {Tree p,q;Stack st;st.top=-1;if(NULL==t){return;} else {while(t!=NULL)

{st.top++;

st.a[st.top]=t;

t=t->left;

}}} 20

}

while(st.top!=-1)break;

}

}}} void Postorder(Tree t)//后序遍歷,遞歸實(shí)現(xiàn) {if(t!=NULL){Postorder(t->left);

Postorder(t->right);

cout<data;}} void Postorder2(Tree t)//后序遍歷,非遞歸實(shí)現(xiàn) {Stack st;st.top=-1;Tree m;int flag;do {while(t!=NULL)

{st.top++;

st.a[st.top]=t;

t=t->left;

}

m=NULL;

flag=1;

while(st.top!=-1 && flag)

{t=st.a[st.top];

if(t->right==m)

{cout<data;

st.top--;

m=t;} else

{t=t->right;

flag=0;

}}}

while(st.top!=-1);} int Height(Tree t)//求二叉樹的高度,遞歸實(shí)現(xiàn){int depth1,depth2;if(!t){

return 0;}

else {depth1=Height(t->left);

depth2=Height(t->right);

if(depth1>depth2)

{return(depth1+1);

}

else

{return(depth2+1);

}}} int leafs_rec(Tree t)

//葉子結(jié)點(diǎn)

{int l,r;if(t==NULL)

return 0;else if((t->left==NULL)&&(t->right==NULL))

return 1;else {l=leafs_rec(t->left);

r=leafs_rec(t->right);

return(l+r);}} int danzhi(Tree t)//單只 {if(t==NULL)

return 0;else if((t->left==NULL)&&(t->right!=NULL))

d++;else if((t->left!=NULL)&&(t->right==NULL))

d++;danzhi(t->left);danzhi(t->right);return(d);} int shuangzhi(Tree t)

//雙只

{if(t==NULL)

return 0;else if((t->left!=NULL)&&(t->right!=NULL))

l++;shuangzhi(t->left);shuangzhi(t->right);return(l);} void TraversalOfLevel(Tree t)//層次遍歷二叉樹 { Tree p,q[100];int f=0,r=0;if(t!=NULL)

{p=t;

q[r]=t;

r++;} while(f!=r){p=q[f];f++;

cout<

data;

if(p->left!=NULL)

{q[r]=p->left;

r++;

}

if(p->right!=NULL)

{q[r]=p->right;

r++;} }} void CreateBiTree_XZ(Tree &T,char a[],int la,int ra,char b[],int lb,int rb)//知先序、中序求二叉樹

{int i,lla,lra,llb,lrb,rla,rra,rlb,rrb;if(la>ra)

T=NULL;else

{T=new BTree;

T->data=a[la];

for(i=lb;i<=rb;i++)

{if(b[i]==a[la])

break;}

lla=la+1;

lra=lla+i-lb-1;

rla=lra+1;

rra=ra;llb=lb;

lrb=i-1;

rlb=i+1;

rrb=rb;

CreateBiTree_XZ(T->left,a,lla,lra,b,llb,lrb);

CreateBiTree_XZ(T->right,a,rla,rra,b,rlb,rrb);}} void CreateBiTree_SX(Tree &T,char S[],int pos,int n)//二叉樹的順序表示形式,將其轉(zhuǎn)換為二叉樹的鏈?zhǔn)酱鎯?chǔ)方式 {int i;if(S[pos]=='#')

T=NULL;else {T=new BTree;

T->data=S[pos];

if((i=2*pos+1)<=n)

CreateBiTree_SX(T->left,S,i,n);

else

T->left=NULL;

if((i=2*pos+2)<=n)

CreateBiTree_SX(T->right,S,i,n);

else

T->right=NULL;}} void main(){int n,i;char a[30],b[30],c[30];Tree s;Tree m;cout<<“請(qǐng)輸入先序:”;CreateBiTree_Rec(m);cout<>n;cout<<“請(qǐng)輸入先序:”;for(i=0;i>a[i];cout<<“請(qǐng)輸入中序:”;for(i=0;i>b[i];CreateBiTree_XZ(s,a,0,n-1,b,0,n-1);cout<<“后序遍歷:”;Postorder(s);cout<>n;cout<<“請(qǐng)輸入二叉樹訊息表形式:”;for(i=0;i>c[i];CreateBiTree_SX(s,c,0,n-1);cout<<“前序遍歷:”;Preorder(s);cout<

數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)任務(wù)書四:圖的操作

1、建立圖的存儲(chǔ)結(jié)構(gòu)

a)創(chuàng)建圖的鄰接矩陣表示方式 b)創(chuàng)建圖的鄰接表表示方式 c)實(shí)現(xiàn)兩種方式的互換

2、圖的遍歷

a)基于鄰接矩陣的深度和廣度遍歷 b)基于鄰接表的深度和廣度遍歷

3、最小生成樹,使用Prim算法實(shí)現(xiàn)從某一節(jié)點(diǎn)出發(fā)的圖的最小生成樹25

4、單源最短路徑,算法8-10

5、關(guān)鍵路徑算法。

1.代碼:

typedef enum{DG,DN,UDG,UDN}GKind;typedef enum{FALSE,TRUE}Boolean;Boolean visited[max_v];typedef int VType;typedef int EType;typedef int qtype;typedef struct { qtype *elem;int front;int rear;int qsize;int insize;}squeue;typedef struct { VType vexs[max_v];EType edges[max_v][max_v];int vnum,ednum;GKind kind;}MGraph;typedef struct ENode { int advex;struct ENode *next;int weight;}ENode;typedef struct VNode { VType vex;ENode *first;}VNode,List[max_v];typedef struct { List ver;int vnum,ednum;int kind;}AGraph;int LocatV(MGraph g,VType x){ int k;k=-1;for(k=0;(k

//鄰接矩陣 { int i,j,k,v1,v2,w;cout<<“請(qǐng)輸入頂點(diǎn)數(shù):”;cin>>g.vnum;cout<<“請(qǐng)輸入邊數(shù):”;cin>>g.ednum;cout<<“請(qǐng)輸入構(gòu)造頂點(diǎn)數(shù)組頂點(diǎn)值:”<>g.vexs[i];for(i=0;i

g.edges[i][j]=infinity;cout<<“請(qǐng)輸入構(gòu)造鄰接矩陣:”<

cin>>v1;

cout<<“請(qǐng)輸入頂點(diǎn)V2:”;

cin>>v2;

cout<<“請(qǐng)輸入權(quán)值:”;

cin>>w;

i=LocatV(g,v1);

j=LocatV(g,v2);

while((i<0)||(i>(g.vnum-1))||(j<0)||(j>(g.vnum-1)))

{ cout<<“編號(hào)超出范圍,請(qǐng)重新輸入頂點(diǎn)及權(quán)值:”<

cin>>v1;

cin>>v2;

cin>>w;

i=LocatV(g,v1);

j=LocatV(g,v2);

g.edges[i][j]=w;

g.edges[j][i]=g.edges[i][j];}} int LocatVA(AGraph g,VType x){ int k;k=-1;for(k=0;(k>g.vnum;cout<<“請(qǐng)輸入邊數(shù):”;cin>>g.ednum;cout<<“請(qǐng)輸入構(gòu)造頂點(diǎn)數(shù)組頂點(diǎn)值:”<>g.ver[i].vex;g.ver[i].first=NULL;} cout<<“請(qǐng)輸入構(gòu)造鄰接表:”<>v1;cin>>v2;i=LocatVA(g,v1);j=LocatVA(g,v2);while((i<0)||(i>(g.vnum-1))||(j<0)||(j>(g.vnum-1))){

cout<<“編號(hào)超出范圍,請(qǐng)重新輸入:”<

cin>>v1;

cin>>v2;

i=LocatVA(g,v1);

j=LocatVA(g,v2);} p=new ENode;p->advex=j;p->next=g.ver[i].first;g.ver[i].first=p;}} void DFS(AGraph g,VType i){ ENode *p;VType w;visited[i]=TRUE;cout<next){ w=p->advex;if(!visited[w])

DFS(g,w);}} void Draverse(AGraph g)

//鄰接表深度遍歷 { int i;for(i=0;i

DFS(g,i);} void MDFS(MGraph g,VType i){ VType p;visited[i]=TRUE;cout<

MDFS(g,p);}} void Mraverse(MGraph g)

//鄰接矩陣深度遍歷 { int i;for(i=0;i

MDFS(g,i);} void InQueue(squeue &q)

{ q.elem=new qtype[SIZE];q.front=q.rear=0;q.qsize=SIZE;q.insize=IN;} void INsize(squeue &q)

{ qtype *a;int i;a=new qtype[q.qsize+q.insize];for(i=0;i

{ if(((q.rear+1)%q.qsize)==q.front)INsize(q);q.elem[q.rear]=e;q.rear=(q.rear+1)%q.qsize;} void Error(char *a)

//錯(cuò) { cout<

{ qtype e;if(q.front==q.rear)Error(“循環(huán)隊(duì)列空!”);e=q.elem[q.front];q.front=(q.front+1)%q.qsize;return e;} void BFS(MGraph g)

{ int i,w,u;squeue q;

//初始化 //擴(kuò)容

//入隊(duì)

//出隊(duì)

//鄰接矩陣廣度遍歷29

for(i=0;i

cout<

EnQueue(q,i);

while(q.front!=q.rear)

{ u=DeQueue(q);

for(w=0;w

if(g.edges[u][w]&&(!visited[w]))

{ visited[w]=TRUE;

cout<

EnQueue(q,w);}}}} void MBFS(AGraph g)

//鄰接表廣度遍歷 { int i,w,u;squeue q;ENode *p;for(i=0;i

EnQueue(q,i);

while(q.front!=q.rear)

{u=DeQueue(q);

cout<

p=g.ver[u].first;

while(p)

{w=p->advex;

if(visited[w]!=TRUE)

{ visited[w]=TRUE;

EnQueue(q,w);}

p=p->next;}}}}} void MatToList(MGraph l,AGraph &g)//此函數(shù)用于實(shí)現(xiàn)將鄰接矩陣轉(zhuǎn)換成鄰接表{ int i,j;ENode *p;g.vnum = l.vnum;for(i = 0;i

g.ver[i].first = NULL;

g.ver[i].vex=l.vexs[i];} for(i=0;i

for(j = l.vnum-1;j>=0;j--)

{ if((l.edges[i][j]!= 0)&&(l.edges[i][j]!=100)){ p =(ENode*)malloc(sizeof(ENode));

p->advex = j;

p->next= g.ver[i].first;

g.ver[i].first= p;}}} void ListToMat(MGraph &g, AGraph l)//表轉(zhuǎn)矩陣 { int i,j;ENode *p;g.vnum=l.vnum;g.ednum=l.ednum;for(i = 0;i

g.edges[i][j] = 0;for(i=0;i

while(p){g.edges[i][p->advex] = 1;

p=p->next;} }} void main(){ int j=0,i;MGraph g;AGraph h;ENode *p;CreatUDN_MG(g);cout<<“n此無向圖共有”<

for(j=0;j

cout<

”;

cout<

{

p=h.ver[i].first;

while(p!=NULL)

{ cout<<“<”<advex].vex<<“>”<

p=p->next;

} } cout<

Draverse(h);cout<

MatToList(g,h);cout<<“n此無向圖共有”<

for(j=0;j

cout<

”;

cout<

{

p=h.ver[i].first;

while(p!=NULL)

{cout<<“<”<advex].vex<<“>”<

p=p->next;} }} 2.代碼:#include #define MAX 100 #define Infinity 65535 typedef int WeiType;using namespace std;struct edgeNode { int no;//邊端的序號(hào) char info;//邊端的名稱 WeiType weight;//邊的權(quán)值 struct edgeNode * next;//下一個(gè) } struct vexNode { char info;//節(jié)點(diǎn)名稱

struct edgeNode *link;//與之相連的端點(diǎn) };

//存儲(chǔ)節(jié)點(diǎn)信息

vexNode adjlist[MAX];//訪問標(biāo)志

bool visited[MAX];//lowcost[j]存儲(chǔ)從開始節(jié)點(diǎn)到節(jié)點(diǎn)j的最小花費(fèi) WeiType lowcost[MAX];//parent[j]表示節(jié)點(diǎn)j的前驅(qū)節(jié)點(diǎn) int parent[MAX];//建立鄰接表存儲(chǔ)

void createGraph(vexNode *adjlist,const int n,const int e,const int v0){ edgeNode *p1,*p2;int i,v1,v2;WeiType weight;for(i=1;i<=n;i++){ cout<<“請(qǐng)輸入節(jié)點(diǎn)”<>adjlist[i].info;adjlist[i].link = NULL;//初始化

visited[i] = false;lowcost[i] = Infinity;parent[i] = v0;} for(i=1;i<=e;i++){ cout<<“請(qǐng)輸入邊”<>v1>>v2;cout<<“此邊的權(quán)值:”;cin>>weight;p1 =(edgeNode*)malloc(sizeof(edgeNode));p2 =(edgeNode*)malloc(sizeof(edgeNode));p1->no = v1;

p1->weight = weight;p1->info = adjlist[v1].info;p1->next = adjlist[v2].link;adjlist[v2].link = p1;p2->no = v2;p2->weight = weight;p2->info = adjlist[v2].info;p2->next = adjlist[v1].link;adjlist[v1].link = p2;}} void f(int n,int e,int v){ int i,j,k;edgeNode *p,*q;WeiType sum = 0,minCost;createGraph(adjlist,n,e,v);p = adjlist[v].link;

visited[v] = true;while(p!=NULL){ lowcost[p->no] = p->weight;p = p->next;} for(i=1;i

minCost = Infinity;

int k;

for(j=1;j<=n;j++)

{

if(minCost>lowcost[j]&&!visited[j])

{ minCost = lowcost[j];

k = j;

}

}

sum += minCost;

visited[k] = true;

q = adjlist[k].link;

while(q!= NULL)

{ if(!visited[q->no]&&q->weightno])

{

lowcost[q->no] = q->weight;

parent[q->no] = k;

}

q = q->next;} } cout<<“最小生成樹的邊集為:”<

cout<<“(”<>cases;while(cases--){int n,e,v;cout<<“請(qǐng)輸入節(jié)點(diǎn)數(shù):”;cin>>n;cout<<“請(qǐng)輸入邊數(shù):”;cin>>e;cout<<“請(qǐng)輸入從哪一個(gè)節(jié)點(diǎn)開始:”;cin>>v;int i,j;f(n,e,v);

} }

7、評(píng)語(yǔ)

工作態(tài)度(認(rèn)真、一般、較差),工作量(飽滿、一般、不夠),每個(gè)任務(wù)能夠獨(dú)立(完成、基本完成、在輔導(dǎo)下完成),程序運(yùn)行結(jié)果(正確、基本正確、部分正確),實(shí)訓(xùn)報(bào)告格式(標(biāo)準(zhǔn)、一般)。創(chuàng)新意識(shí)(較強(qiáng)、一般、沒有),運(yùn)行所學(xué)知識(shí)解決實(shí)際問題的能力(強(qiáng)、一般、較差)。

? 優(yōu)(100~90):能夠熟練運(yùn)用開發(fā)工具,編程解決實(shí)際問題,創(chuàng)意新穎,功能實(shí)現(xiàn)完善。

? 良(89~80):能夠熟練運(yùn)用開發(fā)工具,編程解決實(shí)際問題,有一定創(chuàng)新,功能實(shí)現(xiàn)較好。

? 中(79~70):能夠較熟練使用開發(fā)工具,編程解決實(shí)際問題,獨(dú)立完成實(shí)訓(xùn),功能實(shí)現(xiàn)一般。

? 及格(69~60):能夠運(yùn)用開發(fā)工具,在教師輔導(dǎo)下完成實(shí)訓(xùn),實(shí)現(xiàn)部分功能。? 不及格(59~0):編程解決實(shí)際問題的能力差,功能實(shí)現(xiàn)較差。

實(shí)訓(xùn)成績(jī)?yōu)椋?分 教師簽字:

第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 封面

Harbin Institute of Technology at Weihai

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

設(shè)計(jì)題目:

系:

級(jí):

學(xué)

號(hào):

號(hào):

設(shè) 計(jì) 者:

哈爾濱工業(yè)大學(xué)(威海)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院

哈爾濱工業(yè)大學(xué)(威海)《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》報(bào)告

前 言

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)專業(yè)的必修、主干課程之一,它旨在使讀者學(xué)會(huì)分析研究數(shù)據(jù)對(duì)象的特性,學(xué)會(huì)數(shù)據(jù)的組織方法,以便選擇合適的數(shù)據(jù)邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu),以及相應(yīng)的運(yùn)算(操作),把現(xiàn)實(shí)世界中的問題轉(zhuǎn)化為計(jì)算機(jī)內(nèi)部的表示和處理,這是一個(gè)良好的程序設(shè)計(jì)技能訓(xùn)練的過程。在整個(gè)教學(xué)或?qū)W習(xí)過程中,解題能力和技巧的訓(xùn)練是一個(gè)重要的環(huán)節(jié)。

本課題設(shè)計(jì)要求學(xué)生分組進(jìn)行(每組1-2人),自行選題,選題的思想是根據(jù)實(shí)際需要進(jìn)行調(diào)研,以組為單位提交課程設(shè)計(jì)任務(wù)書,給出所選項(xiàng)目的背景和意義,由導(dǎo)師確定選題的級(jí)別,主要是以實(shí)用性為主,開發(fā)一個(gè)具有實(shí)際價(jià)值的項(xiàng)目,經(jīng)過2周的課程設(shè)計(jì)后接受課程設(shè)計(jì)組老師的解題驗(yàn)收。

第五篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

計(jì)算機(jī)科學(xué)與工程系

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

課程設(shè)計(jì)題目 迷宮 航班信息查詢系統(tǒng) 學(xué) 號(hào) 姓 名 班 級(jí)

專 業(yè) 網(wǎng)絡(luò)工程 完 成 時(shí) 間 2013-1-4 指 導(dǎo) 教 師

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

題目一

1.設(shè)計(jì)內(nèi)容 1.1問題描述

求迷宮從入口到出口的所有路徑。1.2設(shè)計(jì)要求

1.迷宮中不能使用遞歸算法查找路徑。2.試探方向限定為上、下、左、右四個(gè)方向。3.迷宮采用隨機(jī)生成和手工生成兩種方式。4.生成從迷宮入口到出口的最短和最長(zhǎng)路徑。5.迷宮的入口和出口由鍵盤輸入。

1.3開發(fā)環(huán)境

Visual C++6.0的集成化環(huán)境 1.4研究思路

對(duì)這樣的矩形迷宮,可以用N*M的矩陣來描述,N和M分別代表迷宮的行數(shù)和列數(shù)。這樣,迷宮中的每一個(gè)位置都可以用行號(hào)和列號(hào)來指定。從入口到出口的路徑則是由一個(gè)位置構(gòu)成的,每個(gè)位置上都沒有障礙,且每個(gè)位置(第一個(gè)除外)都是前一個(gè)位置的東、南、西或北的鄰居。為了描述迷宮中位置(i,j)處有無障礙,規(guī)定:當(dāng)位置(i,j)處有一個(gè)障礙時(shí),其值為1,否則為0。

經(jīng)分析,一個(gè)簡(jiǎn)單的求解方法是:從入口出發(fā),沿某一方向進(jìn)行探索,若能走通,則繼續(xù)向前走;否則沿原路返回,換一方向再進(jìn)行搜索,直到所有可能的通路都探索到為止。即所謂的回溯法。

2.設(shè)計(jì)步驟

2.1 需求分析

(1)題目:迷宮的生成與路由。生成一個(gè)N*M(N行M列)的迷宮,0和

1-1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

在該程序中,首先進(jìn)入的是菜單選擇,在菜單中有3種選擇,選1是手動(dòng)輸入迷宮函數(shù);選2是隨機(jī)自動(dòng)生成迷宮;選3是退出程序。在手動(dòng)生成迷宮時(shí),有兩種輸出方式,一是矩陣輸出,二是圖形輸出。在矩陣輸出時(shí),直接將數(shù)組中的數(shù)進(jìn)行輸出,在圖形輸出時(shí),則要判斷該點(diǎn)的情況,然后輸入迷宮的出入口,再調(diào)用mgpath()函數(shù)進(jìn)行判斷是否存在路徑,如果存在則將路徑經(jīng)過的點(diǎn)進(jìn)行輸出,并且將經(jīng)過的點(diǎn)進(jìn)入到輔助數(shù)組中(輔助數(shù)組是輔助圖形界面的輸出),并且將輔助數(shù)組初始為1,輔助數(shù)組中點(diǎn)為路徑的重新賦值為0,然后根據(jù)情況輸出圖形界面。在自動(dòng)生成迷宮時(shí),用到了c語(yǔ)言隨機(jī)函數(shù),對(duì)于其它問題,和手動(dòng)情況基本相同。

2.3 詳細(xì)設(shè)計(jì)(1)主菜單偽代碼:

while(flag1){

}

{shuru();//輸入行列數(shù)

printf(“手動(dòng)建立迷宮矩陣(0表示可通1表示障礙):n”);for(i=1;i<=m;i++)

for(j=1;j<=n;j++)scanf(“%d”,&mg[i][j]);showplay(mg);// 迷宮輸出 churukou();//迷宮出入口的輸入 x=Mazepath(mg);// 判斷路徑函數(shù)

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

和“class ‘maze’has an illegal zero-sized array”兩行錯(cuò)誤。雙擊錯(cuò)誤信息,找到出錯(cuò)的程序段,經(jīng)過查閱資料發(fā)現(xiàn),在利用順序棧時(shí),沒有定義順序棧的向量空間大小,導(dǎo)致程序出錯(cuò)。但不要對(duì)向量空間定義過大,否則會(huì)浪費(fèi)空間。

(2)算法的時(shí)空分析:

由于鏈棧實(shí)際上是運(yùn)算受限制的單鏈表。所以取棧頂元素運(yùn)算的算法、置空棧運(yùn)算的算法執(zhí)行時(shí)間與問題的規(guī)模無關(guān),則該算法的時(shí)間復(fù)雜度為O(1);而其入棧運(yùn)算的算法與出棧運(yùn)算的算法相當(dāng)于在鏈表的表尾進(jìn)行插入和刪除操作,不需要移動(dòng)元素,時(shí)間復(fù)雜度也為O(1)。建立迷宮矩陣的時(shí)間復(fù)雜度為O(x*y)。在查找路徑的過程中,最壞的情況下可能要考察每一個(gè)非障礙的位置。因此,查找路徑的時(shí)間復(fù)雜度應(yīng)為O(unblocked)。

鏈棧的入棧算法、出棧算法、取棧頂元素算法、置空棧算法執(zhí)行時(shí)所需要的空間都是用于存儲(chǔ)算法本身所用的指令、常數(shù)、變量,各個(gè)算法的空間性能均較好。只是對(duì)于存放順序棧的向量空間大小的定義很難把握好,如果定義過大,會(huì)造成不必要的空間浪費(fèi)。所以在定義時(shí)要慎重考慮。

3.用戶使用說明

運(yùn)行該程序,運(yùn)行的界面的會(huì)出現(xiàn)菜單界面,然后用戶可根據(jù)界面的提示進(jìn)行相應(yīng)的操作,生成迷宮的方式有兩種方式,手動(dòng)生成和自動(dòng)生成,手動(dòng)生成時(shí)、,用戶可根據(jù)自己的要求輸入迷宮的格式,還需輸入相應(yīng)的入出口,確認(rèn)程序就會(huì)生成相應(yīng)的路徑圖形;自動(dòng)生成只需輸入所需的行數(shù)和列數(shù),就會(huì)生成迷宮,接下來的操作和手動(dòng)操作相同了。

圖數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

圖1-2

圖1-3 退出

5.總結(jié)與心得體會(huì)

本次課程設(shè)計(jì)過程中由于掌握的知識(shí)不牢固,在編程序的過程中得到了同學(xué)的幫助和指導(dǎo),在此表示感謝。課程設(shè)計(jì)的過程中,遇到了一些問題,大部分是課本中的知識(shí)掌握的不牢固,還有就是在以前學(xué)習(xí)C++的過程中相關(guān)的知識(shí)掌握的不夠全面。在以后的學(xué)習(xí)過程中,自己一定要把各種知識(shí)掌握牢固。

{ }

mg[i][j]=1;//初始化

矩陣,將最外圍置為1

printf(“n輸入迷宮入口:n”);scanf(“%d%d”,&x1,&y1);printf(“輸入迷宮出口:n”);scanf(“%d%d”,&x2,&y2);

}mlink;mlink *stack;//定義一個(gè)棧 int m,n,x1,x2,y1,y2;//定義全局變量

}

void showplay(int mg[][M+2])//迷宮輸出

{

n“);

for(i=1;i<=m;i++){

printf(”n“);for(j=1;j<=n;j++)

printf(”%d “,mg[i][j]);

int i,j;

printf(”迷宮矩陣如下(0可通):printf(“輸入行數(shù):n”);scanf(“%d”,&m);printf(“輸入列數(shù):n”);scanf(“%d”,&n);數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

} } printf(“n迷宮圖形如下(白色for(i=1;i<=m;i++){

}

printf(”n“);for(j=1;j<=n;j++){

} if(mg[i][j]==0)printf(”

if(mg[i][j]==1)printf(“

if(mg[stack->row][stack->col+1]==

p->next=stack;

stack=p;{

p=(mlink 可通):n”);0)//下面位置可通

*)malloc(sizeof(mlink));

p->row=stack->row;p->col=stack->col+1;□“);//為0的輸出□ ■”);//為1的輸出■

//入棧

mg[stack->row][stack->col]=1;//將

} else

訪問過的標(biāo)記為1 int Mazepath(int mg[][N+2]){

mlink *p;if(mg[x1][y1]==0){ p=(mlink p->row=x1;p->col=y1;p->next=NULL;stack=p;

//將入口

mg[stack->row][stack->col]=1;/while((!(stack->row==NULL&

if(mg[stack->row][stack->col-1]==0)//上面可通

//入棧

stack=p;

p->next=stack;

{

p=(mlink *)malloc(sizeof(mlink));

*)malloc(sizeof(mlink));

p->row=stack->row;p->col=stack->col-1;放入堆棧 /標(biāo)志入口已訪問

&stack->col==NULL))&&(!(stack->row==x2&&stack->col==y2)))//循環(huán)條件直到找到輸入的出口

{

mg[stack->row][stack->col]=1;//將

訪問過的標(biāo)記為1

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

迷宮

void tonglu()//將坐標(biāo)的頂點(diǎn)輸出 {

始化

printf(“(%d%3d)n”,q->row,q->col);

情況

else printf(“□”);//0的 } q=stack;{

} for(i=0;i

for(j=0;jrow-1][q->col-1] q=q->next;

=

while(q!=NULL)//循環(huán)條件 q=q->next;for(j=0;j

情況

}

void create(int mg[][N+2])//創(chuàng)建和菜單

{

int i,j,x,choice,flag1=1;chushi();while(flag1){ }

printf(“n”);printf(“所有通道為(由下而q=stack;{ 上):n”);while(q!=NULL)//循環(huán)條件

printf(“

##

printf(”#

n“);

*********選擇菜單**********

#n”);

printf(“

##

printf(”輸入選項(xiàng):“);scanf(”%d“,&choice);switch(choice){ case 1://手動(dòng)建立迷宮

{

shuru();

printf(”手動(dòng)建立for(i=1;i<=m;i++)

n“);

printf(”# 1-手動(dòng)生成迷

2-自動(dòng)生成迷宮

3-退出

#n“);0;//將路徑中的點(diǎn)賦給輔助數(shù)組a 形的界面輸出

迷宮矩陣(0表示可通1表示障礙):n”);

for(j=1;j<=n;j++)scanf(“%d”,&mg[i][j]);

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

題目二

1.設(shè)計(jì)內(nèi)容 1.1問題描述

設(shè)計(jì)一個(gè)航班信息查詢系統(tǒng),提供信息的管理和使用功能,管理包括更新、添加、刪除功能。

1.2設(shè)計(jì)要求

(1)原始信息存儲(chǔ)在文件中,記錄不少于50條。(2)用戶界面至少包括以下功能: ? 創(chuàng)建

? 修改(插入、添加、刪除、更新)? 查詢 ? 瀏覽 ? 退出管理系統(tǒng)(3)航班信息包括:

? 航班號(hào):字符序列,具體字符表達(dá)的意思上網(wǎng)查詢 ? 起點(diǎn)站和終點(diǎn)站:字符串 ? 班期:指一周中哪些天有航班

? 起飛時(shí)間:可將時(shí)間定義成一個(gè)時(shí)、分組成的序列 ? 到達(dá)時(shí)間:可將時(shí)間定義成一個(gè)時(shí)、分組成的序列 ? 機(jī)型:字符序列,具體字符表達(dá)的意思上網(wǎng)查詢 ? 票價(jià):整型數(shù),具體值可上網(wǎng)查詢

(4)創(chuàng)建是指從文件中讀取數(shù)據(jù),并存入所定義的順序表中。

(5)可按航班號(hào)、起點(diǎn)站、終點(diǎn)站、起飛時(shí)間、到達(dá)時(shí)間等進(jìn)行查詢。查詢時(shí)要用到順序查找、二分查找方法。輸出查詢結(jié)果時(shí)必須排序。

(6)可按航班號(hào)、起點(diǎn)站、起飛時(shí)間、票價(jià)進(jìn)行刪除和更新操作,刪除的記錄存入另外的文件中,作為日志文件保存。

(7)作插入操作前,先對(duì)信息按起點(diǎn)站進(jìn)行排序。新記錄插入為起點(diǎn)站相同的最后一條記錄。

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

typedef struct node { Time rh;Time lv;}Pnode;(2)飛機(jī)結(jié)構(gòu)體: struct Plane {

};(3)靜態(tài)鏈表: typedef struct Sqlist { int length;struct Plane *plane;char key[10],sted[20],sche[10];Time rh,lv;int price;}Sqlist;2.3 詳細(xì)設(shè)計(jì)(1)主函數(shù):

do{printf(“* * * * * * * * * * * * * 航班查詢系統(tǒng)* * * * * * * * * * * * *n”);

printf(“*

1.創(chuàng)建

2.修改

3.查詢

4.瀏覽

5.表長(zhǎng)

6.文件

0.退出

*n”);

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n”);

scanf(“%d”,&opt);switch(opt){

case 1:Initlist(L);break;

case 2:handle(L);break;

case 3:search(L);break;

case 4:print(L);break;case 5:Get_Sq(L);break;case 6:File(L);break;

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

} }while(opt!=0);}

(4)文件操作: void File(Sqlist &L){

int ch;do{ printf(“* * * * * * * * * * * * * * * * * * * * * * * * *n”);

printf(“*

*n”);

printf(“* 1.保存信息到文件

2.從文件讀取信息

0 退出 *n”);

printf(“*

*n”);

printf(“* * * * * * * * * * * * * * * * * * * * * * * * *n”);

printf(“請(qǐng)輸入選項(xiàng)n”);

scanf(“%d”,&ch);

switch(ch)

{

case 1:SaveList(L);break;

} }while(ch!=0);case 2:ReadList(L);break;

case 0:printf(“退出!n”);break;}

(5)瀏覽信息:就是循環(huán)使用輸出函數(shù),在此就不必多說了

2.4 調(diào)試分析

(1)在課設(shè)過程中,遇到問題時(shí),通過與同學(xué)、老師交流,在圖書館查閱資料,使問題得以解決。

(2)算法中有許多不是很優(yōu)化的地方。3.用戶使用說明

程序運(yùn)行后用戶根據(jù)提示輸入要進(jìn)行的操作選項(xiàng)(應(yīng)先選擇創(chuàng)建選項(xiàng),這樣可以直接讀取保存好的文件),然后選擇要進(jìn)行的操作選項(xiàng)。由于主菜單中有修改、查詢和瀏覽項(xiàng)目,每個(gè)項(xiàng)目又有各自的子菜單,所以在進(jìn)行管理和使用時(shí)要注意輸入的元素是否正確,需按照提示輸入。輸入操作元素時(shí),元素之間以空格隔開。程序?qū)摧斎氲牟僮髟卣业较鄳?yīng)的算法,然后進(jìn)行處理,然后將結(jié)果打

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

圖2-2 查詢信息

圖2-3插入

圖2-4刪除

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

時(shí)就需要重新寫出一個(gè)子函數(shù),哪怕這個(gè)子函數(shù)就是在原有的一個(gè)子函數(shù)的基礎(chǔ)上改那么一丁點(diǎn)的地方,例如航班信息查詢系統(tǒng)中的查詢函數(shù),其實(shí)每個(gè)子函數(shù)只是改了一下關(guān)鍵碼而已。

6.附錄

#include #include #include typedef struct time { int hour;int min;

{ }

void search_key(Sqlist L)//按航班號(hào)查找

{ 號(hào):“);

Time rh;Time lv;

scanf(”%s“,n);int i;

printf(”此航班的航班號(hào),起點(diǎn)char n[20];

printf(“請(qǐng)輸入要查找的航班

printf(”%dn“,L.length);//表長(zhǎng)

}Time;typedef struct node {

}Pnode;struct Plane {

};typedef struct Sqlist { int length;struct Plane *plane;char key[10],sted[20],sche[10];Time rh,lv;int price;

終點(diǎn),班期,起飛時(shí)間,到達(dá)時(shí)間,票價(jià):n”);

if(strcmp(L.plane[i].key,n)==0)

ted,L.plane[i].sche,L.plane[i].lv.hour,L.{

for(i=L.length-1;i>=0;i--){

printf(“%s %s %s %d:%d %

d:%d %dn”,L.plane[i].key,L.plane[i].s}Sqlist;int get_Sq(Sqlist &L){ } void Get_Sq(Sqlist &L)return L.length;

plane[i].lv.min,L.plane

[i].rh.hour,L.plane[i].rh.min,L.plane

[i].price);

0數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

printf(“此航班的航班號(hào),起點(diǎn)

ted,{ 終點(diǎn),班期,起飛時(shí)間,到達(dá)時(shí)間,票價(jià):n”);

if(L.plane[i].lv.hour<=hour)

ted,L.plane[i].sche,L.plane[i].lv.hour,L.{

for(i=L.length-1;i>=0;i--){

printf(“%s %s %s %d:%d %

d:%d %dn”,L.plane[i].key,L.plane[i].s

L.plane[i].sche,L.plane[i].lv.hour,L.plane[i].lv.min,L.plane

[i].rh.hour,L.plane[i].rh.min,L.plane

}

void search(Sqlist L){

int i;do {

printf(“* * * * * * * * * * * }

} printf(”%s %s %s %d:%d %d:%d %dn“,L.plane[i].key,L.plane[i].s[i].price);plane[i].lv.min,L.plane [i].rh.hour,L.plane[i].rh.min,L.plane

} void search_rh(Sqlist L){

int hour;printf(”請(qǐng)輸入你所要求的最scanf(“%d”,&hour);printf(“此航班的航班號(hào),起點(diǎn) } } [i].price);

* * * * * * * * * * * * * ** * * * * * * * * * * * * * * *n”);

printf(“* 1.航班號(hào)查詢

2.起點(diǎn)終點(diǎn)查詢

3.班期查詢 4.起飛時(shí)間查詢

5.到達(dá)時(shí)間查詢

0.退出

*n”);

printf(“* * * * * * * * * *

* * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *n”);

scanf(“%d”,&i);

switch(i)

{

case 晚時(shí)間:“);終點(diǎn),班期,起飛時(shí)間,到達(dá)時(shí)間,票價(jià):n”);

if(L.plane[i].rh.hour<=hour)for(int i=L.length-1;i>=0;i--){

1:search_key(L);break;

2數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

n“);

} else { } printf(”查找不成功。

i--;if(i==0)

{

char c[20];

printf(“輸入修改后的scanf(”%s“,c);

內(nèi)容:”);

strcpy(L.plane[i].sche,c);

printf(“修改成功!n”);}break;{

int a,b;

printf(“輸入修改后的int opt;printf(”選擇修改對(duì)象:“);scanf(”%d“,&opt);switch(opt){ case 1:

printf(”修改成功!n“);printf(”修改成功!n“);{

char a[10];printf(”輸入修改后的scanf(“%s”,a);

case 4:

內(nèi)容:“);

char b[20];printf(”請(qǐng)輸入修改后scanf(“%s”,b);

scanf(“%d:%d”,&a,&b);

L.plane[i].lv.hour=a;L.plane[i].lv.min=b;printf(“修改成功!n”);航班號(hào):“);

}break;{

int a,b;

printf(”輸入修改后的strcpy(L.plane[i].key,a);}break;{

case 5: case 2:

內(nèi)容:“);

scanf(”%d:%d“,&a,&b);

L.plane[i].rh.hour=a;L.plane[i].rh.min=b;printf(”修改成功!n“);的內(nèi)容:”);strcpy(L.plane[i].sted,b);}break;

}break;{

int a;

case 6: case 3:

4數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

*n“);

printf(”* * * * * * * * * * * * * * * * * * * * * * * * *n“);

printf(”請(qǐng)輸入選項(xiàng)n“);

scanf(”%d“,&ch);

switch(ch)

{

case 1:SaveList(L);break;case 2:ReadList(L);break;

L.plane[i].sche,&L.plane[i].lv.hour,&L.plane[i].lv.min,&L.plane

[i].rh.hour,&L.plane[i].rh.min,&L.pl

}

void delet_Sq1(Sqlist &L){

char n[10];int i,j;

printf(”請(qǐng)輸入您要?jiǎng)h除的航scanf(“%s”,n);if(L.length==0){

printf(“沒有選項(xiàng)!n”);for(i=0;i

L.length++;

ane[i].price);

case 0:printf(“退出!n”);break;

}

void Initlist(Sqlist &L)//插入存儲(chǔ) {

“);

容:”);價(jià)n“);

scanf(”%s%s%s%d:%d%d:%d%d“,L.plane[i].key,L.plane[i].sted, for(i=0;i

班期

起飛時(shí)間

到達(dá)時(shí)間

票scanf(”%d“,&n);L.length=0;L.plane=(Plane if(!L.plane)exit(0);printf(”請(qǐng)輸入順序表中的內(nèi)

int i,n;printf(“輸入表中航班的數(shù)量:

} }while(ch!=0);

班號(hào):”);

if(strcmp(L.plane[i].key,n)==0)

{

printf(“所刪除的班機(jī)*)malloc((n+10000)*sizeof(Plane));的信息:n”);

printf(“n航班號(hào)

起點(diǎn)終點(diǎn)

printf(”%s %s %s %d:%d %d:%

d %dn“,L.plane[i].key,L.plane[i].sted,L.plane[i].sche,L.plane[i].lv.hour,L.plane[i].lv.min,L.plane

[i].rh.hour,L.plane[i].rh.min,L.plane

[i].price);

6數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

航班信息查詢與檢索系統(tǒng)

n”);} printf(“無法打開文件!}

}while(opt!=0);

void insert_Sq(Sqlist &L){ 數(shù)量

價(jià)n”);

for(i=0;i

printf(“* * * * * * * * * * *

scanf(”%s%s%s%d:%d%d:%d%d“,&L.plane[L.length].key,&L.plane[L.length].sted,&L.plane[L.length].sche,&L.plane[

{

int a=get_Sq(L);

printf(”請(qǐng)輸入要添加班機(jī)的scanf(“%d”,&n);

printf(“請(qǐng)輸入要添加的班機(jī)printf(”n航班號(hào)

起點(diǎn)終點(diǎn)

int i,n;

//n表示添加的fprintf(fp,“航班號(hào):%sn起點(diǎn)站:%s

終點(diǎn)站:%sn班期:%dn起飛時(shí)間:%d:%d

到達(dá)時(shí)間:%d:%dn價(jià)格:%dnn”, p.key,p.sted,p.sche,p.lv.hour,p.lv.mi

n“);} void delet_Sq(Sqlist &L){

int opt;do { fclose(fp);printf(”保存刪除的信息成功。n,p.rh.hour,p.rh.min,p.price);

數(shù)量:“);

信息:n”);

班期

起飛時(shí)間

到達(dá)時(shí)間

票* * * * * * * * * *n“);

printf(”* 1.航班號(hào)刪除

printf(“* * * * * * * * * * printf(”輸入你的選擇:“);2.路線刪除

0.退出

*n”);* * * * * * * * * * *n“);

scanf(”%d“,&opt);

switch(opt){

case 1:delet_Sq1(L);break;

case 2:delet_Sq2(L);break;

case 0:printf(”退出。}

L.length].lv.hour,&L.plane[L.length].lv.min,&L.plane[L.length].rh.hour,&L.plan

e[L.length].rh.min,&L.plane[L.length].price);

}

void handle(Sqlist &L){

}

L.length++;

n");break;

下載數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告(共五篇)word格式文檔
下載數(shù)據(jù)結(jié)構(gòu)實(shí)踐報(bào)告(共五篇).doc
將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
點(diǎn)此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

    《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì) 哈希表實(shí)現(xiàn)電話號(hào)碼查詢系統(tǒng) 一目的 利用《數(shù)據(jù)結(jié)構(gòu)》課程的相關(guān)知識(shí)完成一個(gè)具有一定難度的綜合設(shè)計(jì)題目,利用C/C++語(yǔ)言進(jìn)行程序設(shè)計(jì),并規(guī)范地完成課程......

    數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告

    數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告 班級(jí):13軟件二班 姓名:殷健 學(xué)號(hào):1345536225 子集和數(shù)問題 1:?jiǎn)栴}描述 子集和數(shù)問題1:子集和問題的為〈W,c〉。其中,W={w1,w2,...,wn}是一個(gè)正整數(shù)的集合,子集和......

    數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告

    附件: 實(shí)習(xí)報(bào)告格式,如下: 數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告 班級(jí): 姓名:xxx(20121514101) xxx(20121514101) xxx(20121514101) 指導(dǎo)教師:日期: 題目 一、問題描述(把你所選的題目及要求說一下) 二、概......

    數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告

    一、概述軟件開發(fā)的流程 二、回顧C(jī)語(yǔ)言的基本語(yǔ)法: 1、 常量(類型) 2、 變量(類型、定義) 3、 表達(dá)式(例子:三位數(shù)的拆分) 4、 控制語(yǔ)句(if條件語(yǔ)句,例子:餓了嗎?for循環(huán)語(yǔ)句,例子:做好事......

    《數(shù)據(jù)結(jié)構(gòu)》程序設(shè)計(jì)報(bào)告

    《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計(jì)報(bào)告 課程名稱: 課程設(shè)計(jì)題目:姓名: 院系: 專業(yè): 年級(jí): 學(xué)號(hào): 指導(dǎo)教師: 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì) 約瑟夫環(huán)俞曉沁 計(jì)算機(jī)學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)大二09051204王......

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

    《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計(jì)報(bào)告 1 目錄 《數(shù)據(jù)結(jié)構(gòu)》 ......................................................................................................................

    數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告

    數(shù)據(jù)結(jié)構(gòu)第六次作業(yè)p134 ——11411203張玉24. template void SeqQueue::EnQueue(const T& x){//插入函數(shù) if(IsFull==true){ maxSize=2*maxSize; elements[rear]=x; rear......

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

    青島理工大學(xué) 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告題目:宿舍管理查詢軟件院(系):計(jì)算機(jī)工程學(xué)院 學(xué)生姓名:謝茂盛 班級(jí):網(wǎng)絡(luò)121學(xué)號(hào): 201207131 起迄日期:2014.07.07-2014.07.20 指導(dǎo)教師:張艷......

主站蜘蛛池模板: 亚洲跨种族黑人xxxxx| 国产精品自产拍在线观看中文| 2021av在线无码最新| 久久精品国产久精国产爱| 少妇裸交aa大片| 色综合久久本道鬼色| 久久露脸国产精品| 人妻无码全彩里番acg视频| 国产精品亚洲二区在线观看| 国内精品久久久人妻中文字幕| 亚洲熟妇无码av不卡在线观看| 成人动漫在线观看| 亚洲国产精品无码观看久久| 日韩精品一区二区在线观看| 麻麻张开腿让我爽了一夜| 中文字幕一区二区三区日韩精品| 午夜精品国产精品大乳美女| 亚洲精品在看在线观看| 97se亚洲国产综合自在线尤物| 亚洲av乱码中文一区二区三区| 国产农村乱人伦精品视频| 国产精品国产三级在线专区| 久久久久亚洲av片无码v| 天天日天天干天天操| 亚洲国产码专区| 久久亚洲精品无码va大香大香| 久久亚洲国产精品影院| 精品久久久久久人妻无码中文字幕| 高大丰满欧美熟妇hd| 国产在线精品国自产拍影院同性| 先锋影音av资源我色资源| 成人特黄a级毛片免费视频| 久久久久女教师免费一区| 丰满无码人妻热妇无码区| 亚洲国产av最新地址| 免费无码h肉动漫在线观看| 成人欧美日韩一区二区三区| 偷自拍亚洲视频在线观看99| 国产成人av一区二区三区不卡| 麻豆视传媒官网免费观看| 久久亚洲精品无码观看网站|