C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文

上傳人:痛*** 文檔編號(hào):114539816 上傳時(shí)間:2022-06-29 格式:DOC 頁(yè)數(shù):60 大?。?9KB
收藏 版權(quán)申訴 舉報(bào) 下載
C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文_第1頁(yè)
第1頁(yè) / 共60頁(yè)
C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文_第2頁(yè)
第2頁(yè) / 共60頁(yè)
C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文_第3頁(yè)
第3頁(yè) / 共60頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文》由會(huì)員分享,可在線閱讀,更多相關(guān)《C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文(60頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì)正文 第一篇:C++數(shù)據(jù)結(jié)構(gòu) 大作業(yè)課程設(shè)計(jì) C++/數(shù)據(jù)結(jié)構(gòu) 大作業(yè)/課程設(shè)計(jì)——【校園導(dǎo)游咨詢】【停車場(chǎng)管理】娃娃們可以收著以后用 絕對(duì)純手工打造 內(nèi)含類模塊/一維指針數(shù)組(謹(jǐn)以此程序供大家參考。運(yùn)行結(jié)果后面有貼圖) 目錄 【1】校園導(dǎo)游咨詢 程序設(shè)計(jì)源代碼 及 截圖 【2】停車場(chǎng)管理——方案一 程序設(shè)計(jì)源代碼 及 截圖 【3】停車場(chǎng)管理——方案二 程序設(shè)計(jì)源代碼 及 截圖 【1】【【校園導(dǎo)游咨詢】】 ###### (ps:該校園導(dǎo)游咨詢系統(tǒng)沒有輸入值,所有信息是都在class MGraph的構(gòu)造函數(shù)中傳輸?shù)?,且校園景點(diǎn)信息皆為【【上海電力學(xué)院】

2、】景點(diǎn)信息。請(qǐng)大家注意,直接從文章copy到visual stutio中會(huì)出現(xiàn)中文字符,注意刪除,推薦大家在一行語句的分號(hào)后面,點(diǎn)出光標(biāo),按一下delete鍵,然后按一下enter鍵,完成visual stutio的自動(dòng)對(duì)齊,這樣程序看起來一目了然,更易于操作和更改) 【問題描述】 設(shè)計(jì)一個(gè)校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)。 【基本要求】 (1)設(shè)計(jì)你所在學(xué)校的校園平面圖,所含景點(diǎn)不少于10個(gè)。以圖中頂點(diǎn)表示校內(nèi)各景點(diǎn),存放景點(diǎn)名稱、代號(hào)、簡(jiǎn)介等信息;以邊表示路徑,存放路徑長(zhǎng)度等相關(guān)信息。 (2)為來訪客人提供圖中任意景點(diǎn)相關(guān)信息的查詢。 (3)為來訪客人提供圖中任意景點(diǎn)的

3、問路查詢,即查詢?nèi)我鈨蓚€(gè)景點(diǎn)之間的一個(gè)最短的簡(jiǎn)單路徑。 【選作內(nèi)容】 (6)擴(kuò)充每個(gè)景點(diǎn)的鄰接景點(diǎn)的方向等信息,使得路徑查詢結(jié)果能提供詳盡的導(dǎo)向信息。 **************************【以下為類的定義】******************************** #include #include using namespace std; const int MaxSize=18; const int INFINITY=65535;//最大值無窮 class direction; template class MGraph; template class Verte

4、xNode//定義頭結(jié)點(diǎn) { friend class MGraph; public: int vex;//頂點(diǎn)名稱 T vexname;//頂點(diǎn)名稱 T vexinf;//頂點(diǎn)信息 direction dir;//存放頂點(diǎn)方位信息的direction類的dir。 }; class direction { public: int ln;//存放在方向圖中的橫坐標(biāo),表示東西 int col;//存放在方向圖中的縱坐標(biāo),表示南北 }; template class MGraph//定義無向圖的鄰接矩陣 { public: MGraph(); //構(gòu)造函數(shù),初始化具有n個(gè)頂點(diǎn)的圖 voi

5、d printvexname();//顯示所有景點(diǎn)及景點(diǎn)代號(hào) void printvexinf(int i);//顯示代號(hào)為i景點(diǎn)的名稱及信息 void printroad(int i,int j);//顯示景點(diǎn)i~j的最短路徑方案信息 void printdir(int i,int j);//顯示景點(diǎn)i到j(luò)的方向信息,如“向東100m,向南2021” VertexNode adjlist[MaxSize]; //存放景點(diǎn)全部信息的 景點(diǎn)類數(shù)組 int vertexNum,arcNum; //圖的頂點(diǎn)數(shù)和邊數(shù) void Root(int p,int q);//遞歸尋找pq間的最短路徑

6、 int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//創(chuàng)建Path和Dist分別存放兩點(diǎn)間最短路徑的前驅(qū)節(jié)點(diǎn),兩點(diǎn)間最短路徑長(zhǎng)度 int Line[MaxSize];//Line存放路徑 int kkk;//Line[]數(shù)組的標(biāo)記 private: T vertex[MaxSize]; //存放圖中頂點(diǎn)的數(shù)組 int arc[MaxSize][MaxSize];//存放圖中邊的數(shù)組 }; *************************【以下為類的實(shí)現(xiàn) 即類函數(shù)的定義】*********************************

7、** template MGraph::MGraph()//a[]為景點(diǎn)代號(hào),b[]為景點(diǎn)名稱,c[]為景點(diǎn)信息,d[]為景點(diǎn)方位信息的橫坐標(biāo),e[]為景點(diǎn)方位信息的縱坐標(biāo) //s[]為存放景點(diǎn)鄰接矩陣信息的一維數(shù)組,根據(jù)其對(duì)稱性可以用公式賦值給二維數(shù)組arc[][] { int s[]={0, 1,0, 0,2,0, 0,0,2,0, 0,0,2,3,0, 0,0,0,4,2,0, 0,0,0,0,2,3,0, 0,0,0,0,2,3,1,0, 0,0,2,0,2,0,0,2,0, 4,0,2,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,2,0, 1,0,0,0,0,

8、0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,3,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0}; int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; char* b[]={"南門","實(shí)驗(yàn)樓","南圖","大活","睿思樓"

9、,"大禮堂", "南4教","知行樓","國(guó)交樓","南3教","南2教","南1教", "北圖","北3教","北4教","北2教","北1教","北門"}; char* c[]={"南校區(qū)正門","物理實(shí)驗(yàn)樓","南校區(qū)圖書館","大學(xué)生活動(dòng)中心", "教師辦公樓、醫(yī)務(wù)室及留學(xué)生公寓","大禮堂,用于舉辦各種文藝演出","南校區(qū)第4教學(xué)樓","實(shí)習(xí)基地,計(jì)算機(jī)房等", "國(guó)際交流中心,教職工餐廳","南校區(qū)第3教學(xué)樓","南校區(qū)第2教學(xué)樓","南校區(qū)第1教學(xué)樓", "北校區(qū)圖書館","北校區(qū)第3教學(xué)樓","北校區(qū)第4教學(xué)樓","北校區(qū)第2教學(xué)樓", "北校區(qū)第1教學(xué)樓","北校區(qū)正門"};

10、 int d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8}; int e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2}; int i,j; vertexNum=18; arcNum=30; for(i=0;i for (j=0; j void MGraph::printvexname() { int i; for(i=0;i template void MGraph::printvexinf(int i) { cout0)//即j在i的東邊 cout0) { Root(p,Path[p][q]); Root(Pa

11、th[p][q],q); } else { Line[kkk]=q; kkk++; } } template void MGraph::printroad(int i,int j) { int p,q,m,k,item1,item2; for(p=0;p0) for(q=0;q0) if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q)) { Dist[p][q]=Dist[p][k]+Dist[k][q]; Path[p][q]=k; } cout""choice; return choice; } voi

12、d main() { MGraph mg; int funcchoice(); int fc; while(1) { fc=funcchoice(); if(fc==1) { int i; for(i=0;i>i; mg.printvexinf(i); } else if(fc==3) { int i,j; mg.printvexname(); cout>i>>j; mg.printroad(i,j); } else if(fc==4) break; else couti) stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出棧的元素?cái)?shù)組逐個(gè)賦給臨時(shí)棧 pop

13、stacknumber=p.number;//將這個(gè)車牌號(hào)信息傳給int popstacknumber() popstacktime=p.time;//將該車的時(shí)間信息傳給double popstacktime() cs.top--;//棧頂指針回到原來位置 while(stemp.top>=0) cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//臨時(shí)棧出棧的元素逐個(gè)賦給原棧,完成先退再進(jìn)的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,

14、返回隊(duì)內(nèi)位置 { car *p,*countp; int count(1);//count用于記錄車在過道上的位置信息,因隊(duì)列為鏈?zhǔn)降?,所以進(jìn)行循環(huán)累加 p=new car;//創(chuàng)建一個(gè)car類型的指針 p->number=cnum; p->time=ctime; p->next=NULL;//首先將指向存放car類型元素的數(shù)組初始地址置空 if (cq.front==NULL)//第一次入隊(duì)要判斷頭結(jié)點(diǎn)是否為空 { cq.front=cq.rear=p; } else {//尾插法插入元素 p->next=(cq.rear)->next; (cq.rear)->next=p; cq.re

15、ar=(cq.rear)->next; } countp=(cq.front)->next; while(countp!=NULL) { count++; countp=countp->next; }//count即車在過道上的位置,【從1開始計(jì)!!!】 return count; } int parkingmanagement::popqueue(carqueue &cq)//出隊(duì),隊(duì)內(nèi)進(jìn)行調(diào)整,返回汽車車牌號(hào) { car p; p.number=((cq.front)->next)->number;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的車牌號(hào)賦給car類型的車信息 p.ti

16、me=((cq.front)->next)->time;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的時(shí)刻 //賦給car類型的車信息 p.next=((cq.front)->next)->next;//cq隊(duì)里,從cq.front開始指向下一個(gè)元素的指針 //賦給car類型的車信息的下一個(gè)元素的指針 return p.number; cq.front=(cq.front)->next; } void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double ctime) //車輛到達(dá),根據(jù)輸入的車牌號(hào)、到

17、達(dá)時(shí)間,變更函數(shù)參數(shù);并cout車位信息 { int pos; if(!(cs.full()))//如果棧未滿,車輛停入停車場(chǎng) { int fl(0),i;//定義一個(gè)從0開始的標(biāo)記fl for(i=0;inext; if(p->number==cnum)//在過道中找到要出去的車,則在隊(duì)列中刪除該car。 //后面的車輛依然順序排列,補(bǔ)足空位 { deletequeue(cq,count); if(count>Max) { coutnext) coutnext; p->next=q->next; delete q; } } *******************************【以

18、下是主程序】************************************ void print() { coutacc>>carnum>>cartime; if(acc=='A') park.arrival(cars,carq,carnum,cartime); else if(acc=='D') park.leave(cars,carq,carnum,cartime); else if(acc=='E') break; else coutcarnum=cnum; s->next=NULL; if(front==NULL)//空隊(duì)列,【【【新結(jié)點(diǎn)既是隊(duì)頭,又是隊(duì)尾】】】關(guān)鍵是!fro

19、nt指向第一個(gè)結(jié)點(diǎn) { front=rear=s; } else { rear->next=s;//將結(jié)點(diǎn)s插入到隊(duì)尾 rear=s; } p=front; while(p!=NULL) { i++; p=p->next; }//i即車在過道上的位置,【從1開始計(jì)?。?!】 return i; } template T carQueue::DeQueue() { Node *p; if (front==NULL) coutnext;//將隊(duì)頭元素所在結(jié)點(diǎn)摘鏈 } return p->carnum; delete p;//將出隊(duì)進(jìn)棧的車從隊(duì)列里刪除 } template bool carQ

20、ueue::Empty()//判斷是否為空,為空則返回1,不為空則返回0 { return front==NULL; } template carStack::carStack()//構(gòu)造棧算法 :top(-1) {//建立一個(gè)最大尺寸為size的空棧 S=new carinfo[MaxSize];//創(chuàng)建存儲(chǔ)棧的數(shù)組 if(S==NULL) //分配不成功 { cerri) Stemp.S[++Stop]=S[top--]; hour=outctime-S[top].cartime; return hour; top--; while(Stop>=0) S[++top]=Stemp.

21、S[Stop--]; } template bool carStack::full() { return top==MaxSize-1; } template void carQueue::deletequeue(int i) { Node *p,*q; int j(1); p=front; while(p && jnext; j++; }//找到第i-1個(gè)結(jié)點(diǎn)(結(jié)點(diǎn)位置從1開始) if(!p||!p->next) coutnext=q->next; delete q; } } ******************************【以下為主函數(shù)】********************

22、******************* void outputpark()//系統(tǒng)功能選擇頁(yè)面,輸入泊車信息 { cout>arrive>>carnum>>cartime; if(arrive=='A') { if(cs.top!=MaxSize-1)//停車場(chǎng)內(nèi)有空位可以駛?cè)? { cs.Pushcar(carnum,cartime); coutcarnum==carnum) { flagde=1; break; } pos++; p=p->next; } if(flagde) { coutdata);//輸出學(xué)生信息和成績(jī)信息 pNodeScore=pNodeScore->next;

23、 } } void Add() { p_node_score pNodeScore; // 定義一個(gè)節(jié)點(diǎn) pNodeScore=(p_node_score)malloc(sizeof(node_score));//為節(jié)點(diǎn)分配存儲(chǔ)空間 printf("請(qǐng)輸入學(xué)號(hào):"); scanf("%s",pNodeScore->data.Number); printf("請(qǐng)輸入姓名:"); scanf("%s",pNodeScore->data.Name); printf("請(qǐng)輸入語文成績(jī):"); scanf("%s",pNodeScore->data.Chinese); printf("請(qǐng)輸入英語成

24、績(jī):"); scanf("%s",pNodeScore->data.English); printf("請(qǐng)輸入高數(shù)成績(jī):"); scanf("%s",pNodeScore->data.Math); if(headScore==NULL) { //如果頭結(jié)點(diǎn)為空 headScore=pNodeScore; pNodeScore->next=NULL; } else { //如果頭結(jié)點(diǎn)不為空 pNodeScore->next=headScore; headScore=pNodeScore;//將頭結(jié)點(diǎn)新結(jié)點(diǎn) } } void Input() { int n,i; printf("輸入幾

25、個(gè)學(xué)生的數(shù)據(jù):"); scanf("%d",&n); for(i=0;i Add(); printf("輸入成功!"); } int Delete() { p_node_score pNodeScore,p1; //p1為pNodeScore的前驅(qū) p1=headScore; if(p1==NULL) { printf("成績(jī)表中沒有數(shù)據(jù)!請(qǐng)先添加數(shù)據(jù)!\n"); return 0; } char DeleteNumber[2021 printf("請(qǐng)數(shù)入要?jiǎng)h除的學(xué)生學(xué)號(hào):"); scanf("%s",DeleteNumber); if(strcmp(p1->data.Number,

26、DeleteNumber)==0) { //如果要?jiǎng)h除的結(jié)點(diǎn)在第一個(gè) headScore=p1->next; pNodeScore=p1; printf("學(xué)號(hào)為%s的學(xué)生信息已經(jīng)刪除!\n",DeleteNumber); return 0; } else { pNodeScore=p1->next; while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,DeleteNumber)==0) { p1->next=pNodeScore->next; printf("學(xué)號(hào)為%s的學(xué)生信息已經(jīng)刪除!\n",D

27、eleteNumber); return 0; } else { //否則,結(jié)點(diǎn)向下一個(gè),p1仍為pNodeScore的前驅(qū) p1=pNodeScore; pNodeScore=pNodeScore->next; } } } printf("沒有此學(xué)號(hào)的學(xué)生!"); } int Change() { p_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf("成績(jī)表中沒有數(shù)據(jù)!請(qǐng)先添加數(shù)據(jù)!\n"); return 0; } char EditNumber[2021 prin

28、tf("請(qǐng)輸入你要修改的學(xué)生學(xué)號(hào):"); scanf("%s",EditNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,EditNumber)==0) { //用strcmp比較兩字符串是否相等,相等則返回0 printf("原來的學(xué)生成績(jī)信息如下:\n"); //輸出原來的成績(jī)信息 printf(" 學(xué)號(hào) | 姓名 | 語文成績(jī) | 英語成績(jī)| 高數(shù)成績(jī)\n"); PrintScore(pNodeScore->data); printf("語文新成績(jī):"); scanf("%s"

29、,pNodeScore->data.Chinese); printf("英語新成績(jī):"); scanf("%s",pNodeScore->data.English); printf("高數(shù)新成績(jī):"); scanf("%s",pNodeScore->data.Math); printf("成績(jī)已經(jīng)修改!"); return 0; } pNodeScore=pNodeScore->next; //如果不相等,pNodeScore則指向下一個(gè)結(jié)點(diǎn) } printf("沒有此學(xué)號(hào)的學(xué)生!\n"); //如果找到最后都沒有,則輸出沒有此學(xué)號(hào)的學(xué)生 } int Find() { p

30、_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf("成績(jī)表中沒有數(shù)據(jù)!請(qǐng)先添加數(shù)據(jù)!\n"); return 0; } char FindNumber[2021 printf("請(qǐng)輸入你要查找的學(xué)生學(xué)號(hào):"); scanf("%s",FindNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,FindNumber)==0) { printf("你要查找的學(xué)生成績(jī)信息如下:\n"); printf

31、(" 學(xué)號(hào) | 姓名 | 語文成績(jī) | 英語成績(jī)| 高數(shù)成績(jī)\n"); PrintScore(pNodeScore->data); return 0; } pNodeScore=pNodeScore->next; } printf("沒有此學(xué)號(hào)的學(xué)生!\n"); } int main() //主函數(shù) { int choice=0; headScore=NULL; int c; do { system("color 2f"); //運(yùn)行環(huán)境背景顏色. printf("\n\n\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\t

32、\t"); printf("\n\t\t\t 學(xué)生成績(jī)管理系統(tǒng) \t\t\t"); printf("\n\n\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\t\t"); printf("\n\t\t\t1.輸入成績(jī)信息\n\t\t\t2.輸出成績(jī)信息\n\t\t\t3.添加成績(jī)信息\n\t\t\t"); printf("4.修改成績(jī)信息\n\t\t\t5.刪除成績(jī)信息\n\t\t\t6.查詢成績(jī)信息\n\t\t\t7.退出"); printf("\n\n\t\t\t請(qǐng)選擇:"); scanf("%d",&c); switch(c)

33、{ case 1:system("cls");Input();break; case 2:system("cls");View();break; case 3:system("cls");Add();break; case 4:system("cls");Change();break; case 5:system("cls");Delete();break; case 6:system("cls");Find();break; case 7:system("cls");exit(0); } }while(1); return 0; } 運(yùn)行界面如下: 第三篇:數(shù)據(jù)結(jié)構(gòu)課程

34、設(shè)計(jì) 二○一三 ~二○一四 學(xué)年第 二 學(xué)期 信息科學(xué)與工程學(xué)院 綜合設(shè)計(jì)報(bào)告書 課程名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 班 級(jí): 學(xué) 號(hào): 姓 名: 指導(dǎo)教師: 二○一四 年 六 月 一、實(shí)驗(yàn)內(nèi)容 (一)、單鏈表:將若干城市的信息存入一個(gè)帶頭的單鏈表中,結(jié)點(diǎn)中城市信息包括城市的位置坐標(biāo),要求:給定一個(gè)城市名,返回其位置坐標(biāo);給定一個(gè)位置坐標(biāo)P和一個(gè)距離D,返回所有與P的距離小于等于D的城市。 (二)、回文判斷:試寫出一個(gè)算法,判斷依次讀入的一個(gè)以@為結(jié)束符的字母序列,是否形如“序列1&序列2”模式的字符序列。其中序列1和序列2中都不含有字符“&”,且序列2是序列1的逆序列。例如,“a+

35、b&b+a”是屬于該模式的字符序列。 (三)、樹和二叉樹:建立一棵用二叉鏈表方式存儲(chǔ)的二叉樹,并對(duì)其進(jìn)行遍歷(先序,中序,后序)。打印輸出遍歷結(jié)果。 二、實(shí)驗(yàn)過程 (一)、城市信息 1、根據(jù)題目,我們認(rèn)為我們所編的程序需要實(shí)現(xiàn)以下功能: (1)、創(chuàng)建一個(gè)城市鏈表,能夠輸入城市信息,即城市名和城市位置坐標(biāo); (2)、能夠根據(jù)城市名查詢其位置坐標(biāo); (3)、根據(jù)離中心坐標(biāo)距離查詢城市名; (4)、能夠插入城市信息; (5)、能夠刪除城市信息; (6)、能夠更新城市信息; (7)、執(zhí)行完畢,退出程序。 2、演示程序以用戶和計(jì)算機(jī)的對(duì)話方式執(zhí)行,即在在計(jì)算機(jī)終端上顯示“提示信息”之后,由用戶

36、在鍵盤上輸入演示程序中規(guī)定的運(yùn)算命令;輸入相應(yīng)的數(shù)據(jù)(濾去輸入中非法字符),運(yùn)算結(jié)果顯示在其后。`測(cè)試數(shù)據(jù) 1)、輸入”1”調(diào)用函數(shù) Create(); 新建城市信息: fujian(1.1,2.2) beijing(3.3,4.4) shanghai(5,6) tianjing(7,8) nanjing(910,910) hangzhou(11,12) 輸入END鍵,退出. 2)、輸入”2”,調(diào)用函數(shù)FindCity(); 當(dāng)鍵入城市名時(shí),返回其城市坐標(biāo): 如:鍵入城市名”fujian”,返回坐標(biāo):1.10.2.2021)、輸入“3”調(diào)用函數(shù) FindCityDistance()

37、; 如:當(dāng)給定坐標(biāo)P(3.3,4.4)時(shí),距離5時(shí),就輸出所有與P的距離小于等于5的城市信息。 4)、輸入”4”,調(diào)用函數(shù)Insert().進(jìn)行插入新城市信息操作; 如:插入城市信息:hainan(5,8),當(dāng)進(jìn)行查找時(shí),能看到插入城市的信息.證明插入成功. 5)、輸入”5”,調(diào)用函數(shù)Delete(),進(jìn)行刪除操作: 6)、輸入”6”,調(diào)用函數(shù)UpdateCity(Store),進(jìn)行更新操作; 7)、輸入”7”,退出. 3、源程序代碼: void Init(CityList *LHead) { LHead->Next = NULL; } //建立一個(gè)帶頭結(jié)點(diǎn)的單鏈線性表,LHead指向

38、頭結(jié)點(diǎn)。 void Insert(CityList *LHead) { CityList* newNode; //定義指針結(jié)構(gòu)為cityList型 char m; newNode = (CityList*)malloc(sizeof(CityList)); //生成新結(jié)點(diǎn) if(newNode == NULL) //驗(yàn)證空間申請(qǐng)是否成功 { printf("內(nèi)存分配失敗\n"); return; //若分配內(nèi)存不成功,則返回繼續(xù)分配。 } printf("請(qǐng)輸入城市名\n"); scanf("%s",newNode->CityName);//指針的數(shù)據(jù)域 printf("請(qǐng)輸入城

39、市坐標(biāo)x,y\n"); scanf("%f%c%f",&newNode->X,&m,&newNode->Y); //將城市信息填入新節(jié)點(diǎn)中 while(LHead->Next != NULL) { LHead = LHead->Next; }//如果非空,HLead指針的位置向后移 newNode->Next = LHead->Next; LHead->Next = newNode; } //將新節(jié)點(diǎn)插入鏈表 void Delete(CityList *LHead) { char delCity[10]; printf("請(qǐng)輸入要?jiǎng)h除的城市名\n"); scanf("%s",delCit

40、y); while(strcmp(LHead->Next->CityName,delCity ))//從LHead指向得頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)開判斷結(jié)點(diǎn)中的城市名與輸入城市名是否相等。 { LHead = LHead->Next; //不相等則指針LHead下移,繼續(xù)查找 } LHead ->Next = LHead->Next->Next; //相等則刪除此節(jié)點(diǎn) } void Create(CityList *LHead) { char sign[2021 //定義輸入信息類型及長(zhǎng)度 printf("輸入END退出,輸入其余值繼續(xù)\n"); //當(dāng)輸入END時(shí),在任意輸入,則退出此操作

41、 scanf("%s",sign); while(strcmp(sign,"END")) ////當(dāng)輸入END時(shí),再任意輸入,則退出此操作 { Insert(LHead); printf("輸入END退出,輸入其余值繼續(xù)\n"); scanf("%s",sign); } } void FindCity(CityList* LHead) { char CityName[30]; int j=0; printf("請(qǐng)輸入您要搜索的城市名\n"); scanf("%s",CityName); while(LHead->Next != NULL && strcmp(LHead->Next-

42、>CityName,CityName)) { LHead = LHead->Next; } if(LHead->Next == NULL) { printf("您要搜索的城市不存在\n"); return; } printf("城市坐標(biāo)為%.2f,%.2f\n",LHead->Next->X,LHead->Next->Y); } void UpdateCity(CityList* LHead) { char CityName[10]; printf("請(qǐng)輸入您要更新的城市名\n"); scanf("%s",CityName); while(strcmp(LHead->Next->Cit

43、yName,CityName)) //從LHead指向得頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)開判斷結(jié)點(diǎn)中的城市名與輸入城市名是否相等。 { LHead = LHead->Next; // 當(dāng)不相等則指針LHead下移,繼續(xù)查找 } printf("請(qǐng)輸入城市新信息:\n"); printf("請(qǐng)輸入城市新名\n"); scanf("%s",LHead->Next->CityName); printf("請(qǐng)輸入城市新坐標(biāo)\n"); scanf("%f",&LHead->Next->X); scanf("%f",&LHead->Next->Y); } //輸入城市新信息 void FindCityDista

44、nce(CityList* LHead) { char m; float x; float y; float distance; printf("請(qǐng)輸入中心坐標(biāo)x,y\n"); scanf("%f%c%f",&x,&m,&y); printf("請(qǐng)輸入距離:"); scanf("%f",&distance); LHead = LHead->Next; while(LHead != NULL) { if((x-LHead->X)*(x-LHead->X) + (y-LHead->Y)*(y-LHead->Y)CityName); printf("城市坐標(biāo)為%.2f,%.2f\n",LHead

45、->X,LHead->Y); } LHead = LHead->Next; }} void main() { CityList* LHead; CityList* Store; char choice[3] = {1,2,3}; LHead = (CityList*)malloc(sizeof(CityList)); Init(LHead);//建立空表 Store = LHead; while(strcmp(choice,"7")){ //當(dāng)所選擇等于7時(shí),進(jìn)行以下操作 printf("***************************\n"); printf("*******

46、********************\n"); printf(" 歡迎使用本系統(tǒng) \n"); printf("***************************\n"); printf("***************************\n"); printf("1.創(chuàng)建城市鏈表\n"); printf("2.根據(jù)城市名查詢城市\(zhòng)n"); printf("3.根據(jù)離中心坐標(biāo)距離查詢城市\(zhòng)n"); printf("4.插入新城市信息\n"); printf("5.刪除城市信息\n"); printf("6.更新城市信息\n"); printf("7.退出\n"); //以上相當(dāng)于

47、一個(gè)選擇菜單,皆為提示信息 printf("==========================\n"); printf("請(qǐng)輸入:"); scanf("%s",&choice); switch(choice[0]){ case '1': //相當(dāng)于選擇1 Create(Store); //構(gòu)造并創(chuàng)建城市信息鏈表 break; case '2': FindCity(Store);//根據(jù)城市名查找城市位置 break; case '3': FindCityDistance(Store);//根據(jù)所給中心坐標(biāo)和距離值,返回小于等于所給距離值得節(jié)點(diǎn)信息。 break; ca

48、se '4': Insert(Store);//插入新結(jié)點(diǎn) break; case '5': Delete(Store);//刪除結(jié)點(diǎn) break; case '6': UpdateCity(Store);//更新結(jié)點(diǎn)信息 break; case '7'://退出 break; default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n"); break; } } system("PAUSE"); return ; } (二)、回文判斷 1、需求分析: (1)輸入測(cè)試數(shù)據(jù)組數(shù),接著分組輸入字符串,以@結(jié)尾。 (2)輸入序列總長(zhǎng)不超過 (MAX_N = 1000

49、5)/2 個(gè)。將序列1先入棧,接著處理序列2,同時(shí)出棧判斷。 (3)將序列1全部入棧,接著輸入序列2,同時(shí)出棧判斷。 (4)如果序列滿足題目要求,則輸出“回文序列”;否則,輸出“非回文序列”。 12 a+b&b+a@ a&b@ a&a@ 2、(1)數(shù)據(jù)結(jié)構(gòu): typedef struct Stack{ int top,size; char str[MAX_N>>1]; }; 使用結(jié)構(gòu)體,內(nèi)部定義數(shù)組模擬棧。top為棧頂指針,指向當(dāng)前元素的下一個(gè)位置,size表示棧內(nèi)的元素個(gè)數(shù)。 (2)函數(shù)介紹: void st_init(Stack *st); //棧的初始化 bool s

50、t_push(Stack *st,const char *temp); //入棧 bool st_top(Stack *st,char *temp); //出棧 3、源程序代碼: #include #include #include const int MAX_N = 10005; typedef struct Stack{ int top,size; char str[MAX_N>>1]; }; void st_init(Stack *st) { st->size=MAX_N>>1; st->top=0; } bool st_push(Stack *st,const char *t

51、emp) { if( st->top>st->size ) return false; st->str[st->top++] = *temp; return true; } bool st_pop(Stack *st) { if( st->top==0 ) return false; st->top--; return true; } bool st_top(Stack *st,char *temp) { if( st->top==0 ) return false; *temp = st->str[st->top-1]; return true; } int main() { char

52、str[MAX_N],c; int i,j,cas,len; Stack st; bool flag; // freopen("pal.txt","r",stdin); printf("請(qǐng)輸入測(cè)試組數(shù):\n"); scanf("%d",&cas); getchar(); j=0; while( cas-- ) { ++j; printf("\n第 %d 組數(shù)據(jù)??\n",j); printf("\n請(qǐng)輸入數(shù)據(jù)(字符串1&字符串2@):\n"); for( i=0; 1; i++ ) { str[i]=getchar(); if( str[i]=='@' ) { str[i]='\0';

53、 break; } } getchar(); flag = true; len = strlen(str); st_init(&st); if( !len&1 ) flag = false; else { for( i=0; i if( str[i]=='&' ) break; st_push(&st,&str[i]); } for( ++i; i st_top(&st,&c); flag = st_pop(&st); if( c!=str[i] || !flag) { flag = false; break; } } if( st.top>0 ) flag = fals

54、e; } printf("\nCase : %d\n",j); if( flag ) printf("回文序列。\n"); else printf("非回文序列。\n"); printf("\n"); } printf("輸入結(jié)束。By changning.huang"); // while( true ); return 0; } (三)、二叉樹 1、算法思想: 定義二叉樹結(jié)構(gòu)體類型時(shí),也定義了一個(gè)順序棧結(jié)構(gòu)體類型,用以輔助完成二叉樹的非遞歸遍歷。 由鍵盤輸入二叉樹先序序列,用擴(kuò)展線序序列函數(shù)接受并創(chuàng)建二叉鏈表。 遍歷前先判斷二叉樹是否為空,若為空,執(zhí)行空操作;否則依次執(zhí)行各

55、遍歷函數(shù)相應(yīng)操作。 先序遍歷,先訪問根節(jié)點(diǎn),然后按先序遍歷左子樹,再按先序遍歷右子樹。 中序遍歷,先按中序遍歷左子樹,再訪問根節(jié)點(diǎn),然后按中序訪問右子樹。 后序遍歷,先按后序遍歷左子樹,接著按中序遍歷右子樹,然后訪問根節(jié)點(diǎn)。 2、測(cè)試數(shù)據(jù): ABCффDEфGффFффф(其中ф表示空格字符) 輸出結(jié)果為: 先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA 3、源程序代碼: #include #include typedef struct tnode { char data; struct tnode *lchild; struct tnode *rchild;

56、}tnode; tnode *Tree_creat(tnode *t) { char ch; ch=getchar(); if(ch==' ') t=NULL; else { if(!(t=(tnode *)malloc(sizeof(tnode)))) printf("Error!"); t->data=ch;//printf("[%c]",t->data); t->lchild=Tree_creat(t->lchild); t->rchild=Tree_creat(t->rchild); } return t; } void preorder(tnode *t) { if(t!=NULL

57、) { printf("%c ",t->data); preorder(t->lchild); preorder(t->rchild); } } void main() { tnode *t=NULL; t=Tree_creat(t); preorder(t); } 三、心得體會(huì): 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)是大一學(xué)過c語言實(shí)驗(yàn)的深化,難度增加了很多。但本次實(shí)驗(yàn)三個(gè)部分主要涉及單鏈表、棧、隊(duì)列的知識(shí)。我覺得這些計(jì)算機(jī)中的線性存儲(chǔ)結(jié)構(gòu)原理比較好理解,但是當(dāng)自己來編寫程序的時(shí)候難度大大增加了,這其中涉及到一些指針、結(jié)構(gòu)體等c語言基礎(chǔ)的東西。開始做實(shí)驗(yàn)的時(shí)候,由于對(duì)上述知識(shí)不太熟悉,感覺很困難,后來通過復(fù)

58、習(xí)c語言相關(guān)內(nèi)容和上網(wǎng)查閱資料,逐步理解代碼,一點(diǎn)點(diǎn)掌握了技巧。 總之,這次實(shí)驗(yàn)自己感覺對(duì)用c語言寫程序的掌握又進(jìn)一步強(qiáng)化了,實(shí)驗(yàn)中遇到的困難也都解決了,能力得到了鍛煉。 第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 課 程 設(shè) 計(jì) 任 務(wù) 書 信息 學(xué)院 信息管理與信息系統(tǒng) 專業(yè) 09級(jí)1班 班 孫鵬 一、 二、 課程設(shè)計(jì)題目: 迷宮求解、一元多項(xiàng)式 課程設(shè)計(jì)主要參考資料: 數(shù)據(jù)結(jié)構(gòu)(C語言版) 嚴(yán)蔚敏、吳偉民 編著 數(shù)據(jù)結(jié)構(gòu)題集(C語言版) 嚴(yán)蔚敏、吳偉民、米寧 編著 數(shù)據(jù)結(jié)構(gòu)課件 三、 設(shè)計(jì)應(yīng)解決下列各主要問題: 1.實(shí)現(xiàn)迷宮的路徑求解,并輸出最終路徑,標(biāo)記走過卻未選擇的路徑和最終選擇

59、的路徑 2.對(duì)一元多項(xiàng)式實(shí)現(xiàn)加法,減法,乘法,求導(dǎo)的計(jì)算,并按指數(shù)由大到小排序輸出 四、 課程設(shè)計(jì)相關(guān)附件(如:圖紙、軟件等): 五、命題發(fā)出日期:2021-3-15 設(shè)計(jì)應(yīng)完成日期: 2021-6-2021 設(shè)計(jì)指導(dǎo)教師(簽章): 系主任(簽章): 指導(dǎo)教師對(duì)課程設(shè)計(jì)的評(píng)語 指導(dǎo)教師(簽章): 年 月 日 山東科技大學(xué)學(xué)生課程設(shè)計(jì) 課程設(shè)計(jì)1 迷宮問題 一、 需求分析: 1. 2. 3. 4. 以二維數(shù)組Maze[][]表示迷宮 用戶輸入迷宮的數(shù)據(jù):構(gòu)建迷宮,行數(shù)m,列數(shù)n 迷宮的入口位置和出口位置可由用戶隨時(shí)設(shè)定 若設(shè)定的迷宮存在通路,則以長(zhǎng)方陣形式將迷宮及其通

60、路輸出到標(biāo)準(zhǔn)輸出文件(即終端)上,其中,字符“#”表示障礙,字符“*”表示路徑上的位置,字符“@”表示“死胡同”,即曾經(jīng)途徑然而不能到達(dá)出口的位置,余者用空格符印出。若設(shè)定的迷宮不存在通路,則報(bào)告相應(yīng)信息。 5. 本程序只求出一條成功的通路。然而,只需要對(duì)迷宮求解的函數(shù)做小量修改,便可求得全部路徑。 二、 概要設(shè)計(jì): 抽象數(shù)據(jù)類型線性表的定義如下: ⒈ 設(shè)計(jì)棧的抽象數(shù)據(jù)類型定義: ADT Stack { 數(shù)據(jù)對(duì)象:D={ai:|ai∈PositionSet,i=1?n,n≥0} 數(shù)據(jù)關(guān)系:R1={|ai-1,ai∈d,i=2,?n} 基本操作: 的初始化S GetTop(S,&e)

61、素 Push(&S,e) Pop(&S,e) 返回其值 }ADT Stack; ⒉ 迷宮的抽象數(shù)據(jù)類型定義: ADT Maze{ 數(shù)據(jù)對(duì)象:D:={aij,Start,end|aij,Start,end∈{} 0≤i≤m+2,0≤j≤n+2,m,n≥0} 數(shù)據(jù)關(guān)系:R={ROW.COL} Row={|ai-1,aij∈D i=1,?,m+2,j=1,?,n+2} 第1頁(yè) 操作結(jié)果 構(gòu)造一個(gè)空棧,完成棧用e返回棧S的棧頂元將新的元素e壓入棧頂 刪除棧頂元素,并用eInitStack(&S) 山東科技大學(xué)學(xué)生課程設(shè)計(jì) Col={|aijaij-1∈D} 基本操作: masepa

62、th (int i,int j,int m,int n,sqstack &s) 初始條件:已知目前迷宮狀態(tài), 傳過起始位置,和終止位置 操作結(jié)果:搜索迷宮,用sqstack s返回搜索所得路徑。如不存在,返回2 }ADT MAZE 三、 詳細(xì)設(shè)計(jì): #include #include #include #define OVERFLOW -2 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define STACK_INIT_SIZE 100 //存儲(chǔ)空間初始量 #define STACK_INCREMENT 10//

63、存儲(chǔ)空間初始增量 typedef int Status; typedef struct { int r; int c; }PostType;//坐標(biāo)位置 迷宮的r行c列 typedef struct { int ord;//通道塊在路徑上的序號(hào) PostType seat;//通道塊的當(dāng)前坐標(biāo)位置 int di;//通道塊指向下一通道塊的方向 }SElemType;//棧元素的類型 typedef struct { SElemType *base;//棧底指針 SElemType *top;//棧頂指針 int stacksize;//棧的最大容量 }Stack;//棧的類型

64、第2頁(yè) 山東科技大學(xué)學(xué)生課程設(shè)計(jì) Status InitStack(Stack &S)//初始化棧 { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW);//存儲(chǔ)分配失敗; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }//InitStack Status StackEmpty(Stack S) //判斷棧是否為空,如果為空返回TRUE,否則返回FALSE { if(S.top==S.base)

65、 return TRUE; return FALSE; }//StackEmpty Status Push(Stack &S,SElemType e) //插入元素為e的棧頂元素 { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACK_INCREMENT; }

66、 *S.top++=e; return OK; }//Push Status Pop(Stack &S,SElemType &e) //刪除棧頂元素存入e { if(S.top==S.base) return ERROR; e=*--S.top; 第3頁(yè) 山東科技大學(xué)學(xué)生課程設(shè)計(jì) return OK; }//Pop Status DestroyStack(Stack &S) //銷毀棧 { free(S.base); S.top=S.base; return OK; }//DestroyStack //maze.cpp #define MAXLEN 2021迷宮包括外墻最大行列數(shù)目 typedef struct{ int r; int c; char adr[MAXLEN][MAXLEN];//可取' ''*' '@' '#' }MazeType; //迷宮類型 Status InitMaze(MazeType &maze){ //初始化迷宮若成功返回TRUE,否則返回FALSE int m,n,i,j,k=1; printf("輸入迷口的行數(shù)和列數(shù): ");

展開閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!