版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告————航空訂票系統(tǒng)1/1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:二叉樹的基本操作專業(yè):計(jì)算機(jī)科技院系:計(jì)算機(jī)學(xué)院姓名:xxxx學(xué)號(hào):xxxxxxxx20年9月22日目錄設(shè)計(jì)要求3問題描述3需求分析3詳細(xì)設(shè)計(jì)3概要設(shè)計(jì)3各模塊源代碼3用戶手冊(cè)9總結(jié)10設(shè)計(jì)要求問題描述設(shè)計(jì)一個(gè)與二叉樹基本操作相關(guān)的演示程序。需求分析創(chuàng)建二叉樹。按照用戶需要構(gòu)建二叉樹分別以先序、中序、后序遍歷二叉樹查找子節(jié)點(diǎn)元素詳細(xì)設(shè)計(jì)(附源代碼)概要設(shè)計(jì)//定義二叉樹數(shù)據(jù)結(jié)構(gòu)typedefstructTNode{ intnum; structTNode*lchild,*rchild;}TNode;2.各模塊源代碼(包含main()函數(shù))#include<stdio.h>#include<stdlib.h>#defineMaxLength100//定義二叉樹數(shù)據(jù)結(jié)構(gòu)typedefstructTNode{ intnum; structTNode*lchild,*rchild;}TNode;//聲明全局變量rootstaticTNode*root=NULL;//聲明插入新結(jié)點(diǎn)的函數(shù)(根非空)intmyInsert_Node(TNode*p,intn);//定義插入新節(jié)點(diǎn)的初始函數(shù),拆開寫的目的是遞歸時(shí)避免不必要的判斷voidInsert_Node(intn){ if(root==NULL)//如果根結(jié)點(diǎn)不存在則創(chuàng)建 { root=(TNode*)malloc(sizeof(TNode)); root->num=n; root->lchild=NULL; root->rchild=NULL; } else { myInsert_Node(root,n);//非根結(jié)點(diǎn)的插入操作 }}intmyInsert_Node(TNode*p,intn){ TNode*temp; if(n<p->num)//比當(dāng)前結(jié)點(diǎn)小,則訪問左子樹 { if(p->lchild==NULL)//左子樹為空,則插入該結(jié)點(diǎn) { temp=(TNode*)malloc(sizeof(TNode)); temp->num=n; temp->lchild=NULL; temp->rchild=NULL; p->lchild=temp; return0; } else//左子樹不為空,則與左子樹進(jìn)行比較 { myInsert_Node(p->lchild,n); } } else//右子樹同理 { if(p->rchild==NULL) { temp=(TNode*)malloc(sizeof(TNode)); temp->num=n; temp->lchild=NULL; temp->rchild=NULL; p->rchild=temp; return0; } else { myInsert_Node(p->rchild,n); } }}//前序遞歸遍歷二叉樹voidPre_travel(TNode*p){ if(p) { printf("%d",p->num); Pre_travel(p->lchild); Pre_travel(p->rchild); }}//中序遞歸遍歷二叉樹voidMid_travel(TNode*p){ if(p) { Mid_travel(p->lchild); printf("%d",p->num); Mid_travel(p->rchild); }}//后序遞歸遍歷二叉樹voidSuf_travel(TNode*p){ if(p) { Suf_travel(p->lchild); Suf_travel(p->rchild); printf("%d",p->num); }}//中序非遞歸遍歷二叉樹/* 從根節(jié)點(diǎn)開始,沿左子樹一直走到?jīng)]有左孩子的節(jié)點(diǎn)為止,并將所經(jīng)過的節(jié)點(diǎn)的地址進(jìn)棧;當(dāng)找到?jīng)]有左孩子的節(jié)點(diǎn)時(shí),從棧頂退出該節(jié)點(diǎn)并訪問它,此時(shí),此節(jié)點(diǎn)的左子樹已訪問完畢;在用上述方法遍歷該節(jié)點(diǎn)的右子樹,如此重復(fù)到??諡橹?。*/voidNRMid_travel(TNode*bitree){ TNode*stack[MaxLength]; TNode*p; inttop=-1; p=bitree; do { while(p!=NULL) { stack[++top]=p; p=p->lchild; } if(top!=-1) { p=stack[top--]; printf("%d",p->num); p=p->rchild; } }while(top!=-1||p!=NULL);}//釋放分配的空間,防止內(nèi)存泄露。//此處的root為靜態(tài)區(qū)root的拷貝,root需要單獨(dú)賦空值。voidFree_node(TNode*p){ if(p) { Free_node(p->lchild); Free_node(p->rchild); free(p); p=NULL; }}//層次遍歷二叉樹voidLevel_travel(TNode*bitree){ inti,j; TNode*array[MaxLength],*temp;//建立一個(gè)先入先出的隊(duì)列array,j標(biāo)識(shí)隊(duì)列增長(zhǎng),i控制輸出 temp=bitree; if(temp!=NULL)//初始化變量 { i=0; array[i]=temp; j=1; } while(i!=j) { temp=array[i];//控制層次遍歷順序 printf("%d",temp->num); if(temp->lchild!=NULL) { array[j]=temp->lchild;//左子樹存在,入隊(duì)列 j++; } if(temp->rchild!=NULL) { array[j]=temp->rchild;//右子樹存在,入隊(duì)列 j++; } i++; }}//聲明核心查找函數(shù)intmyNode_search(TNode*p,intkey);//二叉樹的查找,拆開寫的目的是遞歸時(shí)避免不必要的判斷intNode_search(intkey){ if(root==NULL) return0; else { if(key==root->num) return1; else { returnmyNode_search(root,key); } }}intmyNode_search(TNode*p,intkey){//printf("p.num:%dkey:%d\n",p->num,key); if(key==p->num) return1; else { if(key<p->num) { if(p->lchild!=NULL) returnmyNode_search(p->lchild,key); else return0; } else { if(p->rchild!=NULL) returnmyNode_search(p->rchild,key); else return0; } }}intmain(){system("cls");system("color1f");system("modecon:cols=78lines=35");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃㊣必做題6:樹結(jié)構(gòu)的應(yīng)用㊣┃\n");printf("┃姓名:xxxxx┃\n");printf("┃學(xué)號(hào):xxxxxxxxxxx┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); intsum,i,key; intdata[MaxLength]; printf("請(qǐng)輸入二叉樹結(jié)點(diǎn)總數(shù):"); scanf("%d",&sum); printf("請(qǐng)依次輸入結(jié)點(diǎn)數(shù)值大小(以空格或者回車隔開):\n"); for(i=0;i<sum;i++) scanf("%d",&data[i]); for(i=0;i<sum;i++) Insert_Node(data[i]); printf("先序遞歸遍歷后的結(jié)果為:\n"); Pre_travel(root); printf("\n中序遞歸遍歷后的結(jié)果為:\n"); Mid_travel(root); printf("\n后序遞歸遍歷后的結(jié)果為:\n"); Suf_travel(root); printf("\n中序非遞歸遍歷后的結(jié)果為:\n"); NRMid_travel(root); printf("\n層次遍歷后的結(jié)果為:\n"); Level_travel(root); //為便于測(cè)試,多次查找一下 printf("\n請(qǐng)輸入要查找的關(guān)鍵字(數(shù)字,非數(shù)字時(shí)終止):\n"); while(scanf("%d",&key)) { //scanf("%d",&key); if(Node_search(key)) printf("該關(guān)鍵字存在!\n"); else printf("該關(guān)鍵字不存在!\n"); } //釋放內(nèi)存 Free_node(root); root=NULL; return0;}用戶手冊(cè)(調(diào)試演示)包含主界面顯示,當(dāng)我們輸入結(jié)點(diǎn)總數(shù)為12,各結(jié)點(diǎn)元素分別為123456789101112的二叉樹,程序依次創(chuàng)建了該樹,然后依照先序、中序、后序等方式對(duì)其進(jìn)行遍歷,遍歷結(jié)束后順帶了一個(gè)查找結(jié)點(diǎn)元素的查找函數(shù)search(),結(jié)果如下圖所示:總結(jié)通過本次試驗(yàn),我對(duì)二叉樹的基本概念、樹的建立、遍歷有了進(jìn)一步深入的了解,對(duì)遞歸認(rèn)識(shí)加深。同時(shí)也發(fā)現(xiàn)自己在使用隊(duì)列操作部分知識(shí)還掌握不牢固,致使編程出現(xiàn)了些問題。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:航空客運(yùn)訂票系統(tǒng)院系計(jì)算機(jī)學(xué)院年級(jí)xxxxx學(xué)生學(xué)號(hào)xxxxxxxxxxx指導(dǎo)教師xxxxxxxxxxx起止時(shí)間目錄一、課程設(shè)計(jì)目的3二、需求分析3三、概要設(shè)計(jì)1.設(shè)計(jì)步驟42.系統(tǒng)整體結(jié)構(gòu)圖53.功能模塊及調(diào)用關(guān)系說明5四、詳細(xì)設(shè)計(jì)和源代碼1.實(shí)現(xiàn)概要設(shè)計(jì)中定義數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)62.查詢航線信息功能的算法設(shè)計(jì)73.訂票功能的算法設(shè)計(jì)94.退票功能的算法設(shè)計(jì)125.錄入功能的算法設(shè)計(jì)146.總航線預(yù)覽功能的程序源代碼15五、調(diào)試分析1.各功能的具體實(shí)例分析162.實(shí)驗(yàn)過程中出現(xiàn)的問題及解決方法20六、課程設(shè)計(jì)總結(jié)20七、參考資料21一、課程設(shè)計(jì)目的(1)熟練使用C語(yǔ)言編寫程序,解決實(shí)際問題;(2)了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;(3)初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;(4)提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問題的能力;航空訂票系統(tǒng):(1)熟練掌握鏈表存儲(chǔ)結(jié)構(gòu)及其建立過程和常用操作;(2)熟練掌握隊(duì)列的建立過程和常用操作;學(xué)會(huì)自己調(diào)試程序的方法并掌握一定的技巧。二、需求分析問題描述:航空客運(yùn)訂票的業(yè)務(wù)活動(dòng)包括:查詢航線、客票預(yù)訂和辦理退票等。試設(shè)計(jì)一個(gè)航空客運(yùn)訂票系統(tǒng),以使上述業(yè)務(wù)可以借助計(jì)算機(jī)來完成。設(shè)計(jì)任務(wù):通過此系統(tǒng)可以實(shí)現(xiàn)如下功能:錄入:可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定)查詢:可以查詢某個(gè)航線的情況(如,輸入航班號(hào),查詢起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿倉(cāng));可以輸入起飛抵達(dá)城市,查詢飛機(jī)航班情況;根據(jù)旅客提出的終點(diǎn)站名輸出下列信息:航班號(hào)、飛機(jī)號(hào)、星期幾飛行,最近一天航班的日期和余票額;訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定)根據(jù)客戶提出的要求(日期、航班號(hào)、訂票數(shù)額)查詢?cè)摵桨嗥鳖~情況,若尚有余額,則為客戶辦理訂票手續(xù),輸出座位號(hào);若已滿員或余票額少于訂票額,則需要重新詢問客戶要求。若需要,可預(yù)約登記排隊(duì)等候。如果該航班已經(jīng)無票,可以提供相關(guān)可選擇航班;退票:根據(jù)客戶提供的情況(日期、航班、退票數(shù)額),為客戶辦理退票手續(xù),然后查詢?cè)摵桨嗍欠裼腥祟A(yù)約登記,首先詢問排在第一的客戶,若所退票額能滿足他的要求,則為他辦理訂票手續(xù),否則依次詢問其他排隊(duì)預(yù)約的客戶……退票成功后修改相關(guān)數(shù)據(jù)文件??蛻糍Y料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。修改航班信息:當(dāng)航班信息改變可以修改航班數(shù)據(jù)文件要求:根據(jù)以上功能說明,設(shè)計(jì)航班信息,訂票信息的存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)程序完成功能。測(cè)試數(shù)據(jù):由學(xué)生任意指定,但報(bào)告上要求寫出多批數(shù)據(jù)測(cè)試結(jié)果。實(shí)現(xiàn)提示:每條航線應(yīng)包含的信息有:終點(diǎn)站名、航班號(hào)、飛機(jī)號(hào)、飛行日期(星期幾)、乘員定額、余票額、已訂票的客戶名單(包括姓名、訂票額、座位號(hào))和預(yù)約登記的客戶名單(包括日期、姓名、所需票額)。這最后兩項(xiàng)顯然是一個(gè)線性表和一個(gè)隊(duì)列。為查找方便、已訂票客戶的線性表應(yīng)按客戶姓名有序,并且,為插入和刪除方便,應(yīng)以鏈表作存儲(chǔ)結(jié)構(gòu)。由于預(yù)約人數(shù)無法預(yù)料,隊(duì)列也應(yīng)以鏈表作存儲(chǔ)結(jié)構(gòu)。整個(gè)系統(tǒng)需匯總各條航線的情況登錄在一張線性表上,由于航線基本不變,可采用順序存儲(chǔ)結(jié)構(gòu),并按航班有序或按終點(diǎn)站名有序。每條航線是這張表上的一個(gè)記錄,包含上述八個(gè)域,其中乘員名單域?yàn)橹赶虺藛T名單鏈表的頭指針,預(yù)約登記客戶名單域?yàn)榉謩e指向隊(duì)頭和隊(duì)尾的指針。選做內(nèi)容:當(dāng)客戶訂票要求不能滿足時(shí),系統(tǒng)可向客戶提供到達(dá)同一目的地的其它航線情況。三、概要設(shè)計(jì)1.設(shè)計(jì)步驟1)分析問題,給出數(shù)學(xué)模型,設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。提示:(1)己訂票的客戶名單可以用線性表來實(shí)現(xiàn)。為查找方便,線性表應(yīng)按照客戶姓名有序,并且為了插入和刪除的方便,應(yīng)以鏈表作為存儲(chǔ)結(jié)構(gòu)。(2)等候替補(bǔ)的客戶名單可以用隊(duì)列來實(shí)現(xiàn)。由于預(yù)約人數(shù)無法預(yù)計(jì),所以隊(duì)列也應(yīng)以鏈表作為存儲(chǔ)結(jié)構(gòu)。(3)需將輸入的航班情況登錄到一張線性表上(用順序存儲(chǔ)結(jié)構(gòu)或鏈表存儲(chǔ)結(jié)構(gòu))。為了查詢的方便,可以將航班情況按照航班有序或按照終點(diǎn)站名有序建立線性表。每條航線是這張線性表的一個(gè)記錄,包含上述8個(gè)域,其中已訂票的客戶名單域是指向己訂票的客戶名單鏈表的頭指針,等候替補(bǔ)的客戶名單域是指向隊(duì)頭和隊(duì)尾的指針。2)算法設(shè)計(jì)在已經(jīng)選擇好數(shù)據(jù)結(jié)構(gòu)的前提下,為解決問題設(shè)計(jì)算法。(1)確定所需模塊對(duì)于稍復(fù)雜的程序設(shè)計(jì),要充分利用模塊化程序設(shè)計(jì)方法,自頂向下,逐步細(xì)化,在整體思路確定的情況下,考慮所需模塊數(shù),各模塊完成功能以及模塊之間的數(shù)據(jù)聯(lián)系和調(diào)用關(guān)系。(2)各子模塊功能描述給出主要模塊的算法描述,用流程圖或偽代碼表示。(3)模塊之間的調(diào)用關(guān)系3)源程序清單為了提高工作效率,充分利用上機(jī)調(diào)試程序的時(shí)間,要求學(xué)生在上機(jī)之前給出源程序清單。4)用測(cè)試數(shù)據(jù)去驗(yàn)證算法及程序的正確性5)算法分析經(jīng)過上機(jī)調(diào)試,源程序運(yùn)行正確,并且實(shí)現(xiàn)算法要求的功能,解決課程設(shè)計(jì)題目中給出的問題后,分析算法的時(shí)間復(fù)雜度和空間復(fù)雜度。2.系統(tǒng)整體結(jié)構(gòu)圖(功能模塊圖)主菜單menu()1.總航線信息預(yù)覽display()2.查詢單條航線信息Search()3.辦理訂票業(yè)務(wù)Book()4.辦理退票業(yè)務(wù)tuipiao()5.錄入航班信息CreatPlane0.退出系統(tǒng)圖1.系統(tǒng)整體結(jié)構(gòu)圖3.功能模塊及調(diào)用關(guān)系說明(1)總航線信息預(yù)覽:通過調(diào)用display()預(yù)覽已經(jīng)建立的全部航線的相關(guān)信息(航班號(hào)、飛機(jī)號(hào)、終點(diǎn)站、飛行日期、定額、余票數(shù)、排隊(duì)等候人數(shù)),預(yù)覽完返回主菜單。(2)查詢單條航線信息:根據(jù)乘客提出的終點(diǎn)站名或航班號(hào)調(diào)用Search()函數(shù)來查詢并輸出此條航線的相關(guān)信息(航班號(hào)、飛機(jī)號(hào)、終點(diǎn)站、飛行日期、定額、余票數(shù)、已訂票乘客名單、排隊(duì)等候乘客名單)。并且查詢完后詢問乘客是否訂票,是就調(diào)用訂票Book()函數(shù)來為乘客進(jìn)行訂票,否就返回主菜單。(3)辦理訂票業(yè)務(wù):客戶先輸入的終點(diǎn)站名、訂票數(shù)、姓名信息再來調(diào)用訂票Book()函數(shù),Book()函數(shù)根據(jù)客戶提供的終點(diǎn)站名查詢到該航線信息,若客戶訂票額末超過余票量,訂票成功并登記信息,在訂票乘員名單鏈表中添加乘客的信息;如果暫時(shí)余票數(shù)不足是,詢問客戶是否要排隊(duì)等侯,如果是,則在排隊(duì)等候的隊(duì)列中增加該乘客的訂票信息。(4)辦理退票業(yè)務(wù):調(diào)用tuipiao()查詢函數(shù),根據(jù)客戶提供的航線進(jìn)行搜索根據(jù)客戶提供的姓名到訂票客戶名單域進(jìn)行查詢。退票成功后,重新將航線名單域指向訂票單鏈表的頭指針。根據(jù)隊(duì)列中從出的客戶信息判斷是否滿足要求,如果滿足,則將該客戶的信息插入到乘客信息鏈表中。(5)錄入航班信息:調(diào)用CreatPlane()函數(shù),根據(jù)輸入的航班的相關(guān)的信息(航班號(hào)、飛機(jī)號(hào)、終點(diǎn)站、飛行日期、定額、余票數(shù)),將此航班加入到原來的航班組中。(6)退出系統(tǒng)四、詳細(xì)設(shè)計(jì)和源代碼1.實(shí)現(xiàn)概要設(shè)計(jì)中定義數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)(1)已訂票乘客信息(單鏈表)typedefstructCust //已訂票乘客信息{ charName[15]; //乘客姓名charnumber[10]; //乘客所乘飛機(jī)航班號(hào)charend[15]; //乘客終點(diǎn)站(2)排隊(duì)等候的乘客信息typedefstructwaitNode //排隊(duì)等候客戶信息{charname[15]; //乘客姓名 intticket; //乘客的訂票數(shù) structwaitNode*next;}waitNode,*waitlink;typedefstruct{ waitlinkfront; waitlinkrear;}waitQueue;(3)航班信息typedefstructPlane //航班信息{ charnumber[10]; //航班號(hào) intplanenum; //飛機(jī)號(hào) charend[15]; //終點(diǎn)站 chardate[10]; //飛行日期 intdinge; //成員定額inttick; //剩余票數(shù) intk; //排隊(duì)等候的人數(shù) Customer*first; //鏈接已訂票客戶 waitQueueQ; //鏈接候補(bǔ)客戶}PlaneLink;2.查詢單條航線信息功能的算法設(shè)計(jì)(Search()函數(shù)功能實(shí)現(xiàn)的源代碼)intSearch(PlaneLink*p,intN){inti=0,Q; cout<<"===========================================\n";cout<<"1.按終點(diǎn)站名查詢\n"; cout<<"2.按航班號(hào)查詢\n"; cout<<"___________________________________________\n"; cout<<">>>>>>\n"; cout<<"請(qǐng)選擇查詢方式(1/2):";cin>>Q; if(Q==1) { charend[10]; cout<<"請(qǐng)您輸入要查詢的航班的終點(diǎn)站名:";//按站點(diǎn)名查詢航班信息 cin>>end;while(i<N) { if(strcmp(p[i].end,end)==0)//先查看是否存在到該站點(diǎn)的航班 { cout<<"\n*****************您所查詢的航班信息如下******************\n"; cout<<"_________________________________________________________\n"; cout<<"航班號(hào)飛機(jī)號(hào)終點(diǎn)站飛行日期余票數(shù)\n"; cout<<""<<p[i].number<<setw(7)<<p[i].planenum<<setw(12)<<p[i].end<<setw(10)<<p[i].date<<setw(10)<<p[i].tick<<endl; cout<<"\n=========================================================\n"; break; } i++; } } elseif(Q==2) { charnum[10];cout<<"請(qǐng)您輸入要查詢的航班的航班號(hào):";//按站點(diǎn)名查詢航班信息 cin>>num;while(i<N) { if(strcmp(p[i].number,num)==0)//查看是否存在該航班號(hào)的航班 { cout<<"\n*****************您所查詢的航班信息如下:****************\n"; cout<<"_________________________________________________________\n"; cout<<"航班號(hào)終點(diǎn)飛行日期余票數(shù)\n"; cout<<""<<p[i].number<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(12)<<p[i].tick<<endl; cout<<"\n=========================================================\n"; break; } i++; } } display_s(p,i,N);//調(diào)用display_s()函數(shù)輸出該航班的已訂票乘客和排隊(duì)等候乘客的名單信息 if(i<N)//如果存在該航班,詢問客戶是否要預(yù)定該航班的機(jī)票 { intj; cout<<"是否需要預(yù)定該航班的票(1/0):";cin>>j; if(j==1) { charname[10];intticket; cout<<"請(qǐng)輸入訂票數(shù)目、姓名:"; cin>>ticket>>name; Book(p,p[i].end,ticket,name,N); } } else{cout<<"很抱歉,沒有您查詢的航班信息!\n";}return0;}3.訂票功能的算法設(shè)計(jì)(Book()函數(shù)功能實(shí)現(xiàn)源代碼)intBook(PlaneLink*p,charend[],intticket,charname[],intN){ inti; for(i=0;i<N;i++) { if(strcmp(p[i].end,end)==0)//先找出是否存在要訂票的航班 {if(p[i].tick>=ticket)//查看余票數(shù)是否>=訂票客戶訂票數(shù) { p[i].tick-=ticket; Customer*t=(Customer*)malloc(sizeof(Customer)); t->ticket=ticket; strcpy(t->Name,name); strcpy(t->number,p[i].number); strcpy(t->end,p[i].end); t->next=p[i].first;p[i].first=t;//此使用的是頭插法將訂票乘客的信息放入到鏈表中/ cout<<"您訂票成功!\n"; cout<<"您的航班信息如下:\n"; cout<<"__________________________________________________\n"; cout<<"航班號(hào)飛機(jī)號(hào)終點(diǎn)站飛行日期定額\n"; cout<<"__________________________________________________\n"; cout<<""<<setw(9)<<p[i].number<<setw(6)<<p[i].planenum<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(10)<<p[i].dinge<<endl; cout<<"==================================================\n\n"; break; } elseif(p[i].dinge<ticket)//訂票數(shù)超出航班的定額時(shí),不能訂票,也不能無法排隊(duì)等候了 {cout<<"您預(yù)訂的票數(shù)超過了航班定額,無法為您訂票!\n";break;} else//余票數(shù)不足時(shí),詢問乘客是否排隊(duì)等候 { charz; cout<<"該航班剩余票數(shù)為:"<<p[i].tick<<endl; cout<<"很抱歉,剩余的票數(shù)不夠!\n";cout<<"您是否需要排隊(duì)等候(Y(y)/N(n)):";cin>>z; if(z=='Y'||z=='y'){ Queue(p,end,ticket,name,N,i);}//調(diào)用入隊(duì)列函數(shù),將乘客信息插入排隊(duì)等候的人后面 break; } } } if(i>=N){cout<<"很抱歉,沒有您所需要的航班!\n";} return0;}intdisplay_s(PlaneLink*p,inti,intN)//輸出已定票及排隊(duì)乘客的名單信息{ if(p[i].first!=NULL)//p[i].first!=NULL說明已訂票鏈表不為空,輸出已訂票乘客的名單信息 { cout<<"****該航班的已訂票乘客名單如下:****\n"; cout<<"____________________________________\n"; cout<<"姓名訂票量\n"; Customer*t=p[i].first; while(t) { cout<<setw(10)<<t->Name<<""<<setw(7)<<t->ticket<<endl; t=t->next; } } if(i<N&&p[i].Q.front!=NULL)//p[i].Q.front!=NULL,輸出正在排隊(duì)等候乘客的名單信息 { cout<<"****該航班等候訂票的乘客名單如下:****\n"; cout<<"姓名訂票量\n"; waitlinkS=p[i].Q.front; while(S!=NULL) { cout<<setw(10)<<S->name<<""<<setw(7)<<S->ticket<<endl; S=S->next;} cout<<"=====================================\n"; } return0;}附:入隊(duì)函數(shù)Queue()的源代碼intQueue(PlaneLink*p,charend[],intticket,charname[],intN,inti)//入隊(duì)函數(shù),將等候排隊(duì)的乘客放入原來的隊(duì)列中{ system("cls"); system("color2e"); waitlinkq=(waitlink)malloc(sizeof(waitNode));//將要的入隊(duì)的結(jié)點(diǎn),存儲(chǔ)將要入隊(duì)乘客的信息 strcpy(q->name,name); q->ticket=ticket; q->next=NULL; if(p[i].Q.front==NULL) { p[i].Q.front=p[i].Q.rear=q; p[i].k++;//p[i].k用來記錄排隊(duì)人數(shù) } else { p[i].Q.rear->next=q; p[i].Q.rear=q;p[i].k++; } cout<<"已為您登記,請(qǐng)耐心等候!\n"; return0; }4.退票功能的算法設(shè)計(jì)(tuipiao()函數(shù)實(shí)現(xiàn)的源代碼)inttuipiao(PlaneLink*p,intN){inti;Customer*R,*S; charnumber[10],Name[15]; cout<<">>>>>>\n"; cout<<"請(qǐng)輸入您的航班號(hào)與姓名:"; cin>>number>>Name; for(i=0;i<N;i++) { if(strcmp(p[i].number,number)==0&&p[i].first!=NULL) { if(strcmp(p[i].first->Name,Name)==0) { p[i].tick=p[i].tick+p[i].first->ticket; p[i].first=p[i].first->next; cout<<"您已成功退票!\n\n"; } else {R=p[i].first;S=p[i].first->next; while(S!=NULL) { if(strcmp(S->Name,Name)==0) { p[i].tick=p[i].tick+S->ticket; R->next=S->next; cout<<"您已經(jīng)成功退票!\n\n";break; } R=R->next;S=S->next; } if(S==NULL)cout<<"很抱歉,在該航班上沒有找到您的姓名,請(qǐng)核實(shí)信息!\n\n"; } if(p[i].Q.front!=NULL) { waitlinkQ=p[i].Q.front,q; while(Q!=NULL) { if(p[i].tick>=Q->ticket) { if(Q==p[i].Q.front) { cout<<"正在為等候的乘客"<<Q->name<<"辦理訂票!\n"; Book(p,p[i].end,Q->ticket,Q->name,N); if(p[i].Q.front==p[i].Q.rear) { p[i].Q.front=p[i].Q.rear=NULL; Q=Q->next; } else {p[i].Q.front=p[i].Q.front->next; Q=Q->next; } } else { cout<<"正在為等候的乘客"<<Q->name<<"辦理訂票!\n"; Book(p,p[i].end,Q->ticket,Q->name,N); q->next=Q->next;Q=Q->next; } } else{ q=Q;Q=Q->next;} } } break; } if(strcmp(p[i].number,number)==0&&p[i].first==NULL) { cout<<"很抱歉,該航班目前沒有已訂票的乘客,無法為你退票,請(qǐng)核實(shí)信息!\n\n";break; } } if(i>=N)cout<<"很抱歉,沒有該航班信息,無法為你退票,請(qǐng)核實(shí)信息!\n\n"; return0;}5.錄入功能的算法設(shè)計(jì)(CreatPlane()函數(shù)的源代碼)voidCreatPlane(PlaneLink*p,intn,intN){ inti,j; for(i=N;i<N+n;i++) { p[i].first=NULL;//帶頭結(jié)點(diǎn)的單鏈表為空時(shí)的條件 p[i].Q.front=p[i].Q.rear=NULL;//隊(duì)列為空時(shí)的條件 cout<<">>>>>>\n";cout<<"請(qǐng)輸入航班號(hào):";cin>>p[i].number; cout<<"輸入終點(diǎn)站名:";cin>>p[i].end; for(j=0;j<N;j++) { if(strcmp(p[i].number,p[j].number)==0)//查看該航班號(hào)是否已經(jīng)存在 { cout<<"已經(jīng)存在該航班號(hào)!\n";break; } if(strcmp(p[i].end,p[j].end)==0)//查看是否存在到改站點(diǎn)的航班 { cout<<"已經(jīng)有到該站點(diǎn)的航班!\n";break; } } if(j==N) { cout<<"飛機(jī)號(hào)、飛行日期、成員定額:\n"; cin>>p[i].planenum>>p[i].date>>p[i].dinge; p[i].tick=p[i].dinge;p[i].k=0; cout<<"錄入完成!\n"; } }}6.總航線預(yù)覽功能的算法設(shè)計(jì)(display()函數(shù)的源代碼)intdisplay(PlaneLink*p,intN)//N為當(dāng)前的航班數(shù){ cout<<"==============================================================================\n"; cout<<"航班號(hào)飛機(jī)號(hào)終點(diǎn)站飛行日期定額余票數(shù)排隊(duì)等候人數(shù)\n"; cout<<"______________________________________________________________________________\n"; for(inti=0;i<N;i++) { cout<<setw(9)<<p[i].number<<setw(6)<<p[i].planenum<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(10)<<p[i].dinge<<setw(10)<<p[i].tick<<setw(10)<<p[i].k<<endl; } cout<<"==============================================================================\n"; return0;}五、調(diào)試分析1)各功能的具體實(shí)例分析為了調(diào)試分析方便,在程序中已經(jīng)初始放入了三個(gè)航班信息,如下:1.系統(tǒng)主菜單界面2.總航線預(yù)覽功能界面3.查詢單條航線功能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級(jí)下冊(cè)口算和筆算練習(xí)題
- 第三節(jié) 水資源的合理利用 統(tǒng)一教案
- 《量身高》大班數(shù)學(xué)教案
- 人教版二年級(jí)數(shù)學(xué)上冊(cè)教案【全冊(cè)】
- 班組建設(shè)與領(lǐng)導(dǎo)力提升
- 廣告公司門衛(wèi)聘用合同
- 燃料消耗數(shù)據(jù)分析
- S版三年級(jí)語(yǔ)文下冊(cè)教案
- 國(guó)際狩獵場(chǎng)硬裝施工合同
- 廚房改造翻新協(xié)議
- 遼寧省盤錦市第一完全中學(xué)2023-2024學(xué)年八年級(jí)上學(xué)期期中數(shù)學(xué)試卷
- 機(jī)動(dòng)車鑒定評(píng)估師(中級(jí))技能鑒定理論試題及答案
- DB13-T 5958-2024 金屬非金屬露天礦山采場(chǎng)邊坡安全監(jiān)測(cè)技術(shù)規(guī)范
- 阿里巴巴國(guó)際站:2024年珠寶眼鏡手表及配飾行業(yè)報(bào)告
- 二年級(jí)數(shù)學(xué)看錯(cuò)數(shù)字問題專項(xiàng)練習(xí)
- 醫(yī)院康復(fù)科培訓(xùn)課件:《平衡功能評(píng)定及訓(xùn)練》
- 2025屆高三數(shù)學(xué)一輪復(fù)習(xí)策略講座
- 職能科室對(duì)醫(yī)技科室醫(yī)療質(zhì)量督查記錄表(檢驗(yàn)科、放射科、超聲科、功能科、內(nèi)鏡室)
- 2024至2030年中國(guó)機(jī)器人行業(yè)市場(chǎng)競(jìng)爭(zhēng)狀況及發(fā)展趨向分析報(bào)告
- 國(guó)家義務(wù)教育質(zhì)量監(jiān)測(cè)科學(xué)復(fù)習(xí)試題及答案
- 2025屆新高考語(yǔ)文熱點(diǎn)沖刺復(fù)習(xí)議論文標(biāo)題
評(píng)論
0/150
提交評(píng)論