數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告城市鏈表學(xué)生通訊錄管理系統(tǒng)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告城市鏈表學(xué)生通訊錄管理系統(tǒng)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告城市鏈表學(xué)生通訊錄管理系統(tǒng)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告城市鏈表學(xué)生通訊錄管理系統(tǒng)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告城市鏈表學(xué)生通訊錄管理系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(2023——2023年度第一學(xué)期)課程名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目一:2.2學(xué)生通訊錄管理系統(tǒng)題目二:城市鏈表院系:計(jì)算機(jī)科學(xué)系班級(jí):10級(jí)軟件本(一)姓名:學(xué)號(hào):指導(dǎo)教師:成績(jī):2023年月日成績(jī)?cè)u(píng)定一、指導(dǎo)教師評(píng)語(yǔ)二、成績(jī)成績(jī)備注指導(dǎo)教師:日期:年月日設(shè)計(jì)題目<一>:2.2學(xué)生通訊錄管理系統(tǒng)一、設(shè)計(jì)要求1.問(wèn)題描述紙質(zhì)的通訊錄系統(tǒng)已經(jīng)不能滿足大家的要求,容易丟失、查找困難等問(wèn)題是紙質(zhì)通訊錄所不能克服的缺點(diǎn)。“學(xué)生通訊管理系統(tǒng)”是為了幫助老師、同學(xué),或者其他一些需要使用通訊錄的人員進(jìn)行管理和分析的一種應(yīng)用程序。需求分析(1)輸入數(shù)據(jù)建立通訊錄(2)查詢通訊錄系統(tǒng)中滿足要求的信息(3)插入新的通訊錄信息(4)刪除不需要的通訊錄信息(5)查看所有通訊錄信息二、概要設(shè)計(jì)為了實(shí)現(xiàn)需求分析的功能,可以從三個(gè)方面著手設(shè)計(jì)。主界面設(shè)計(jì)為了實(shí)現(xiàn)學(xué)生通訊錄管理系統(tǒng)各功能的管理,設(shè)計(jì)一個(gè)含有多個(gè)菜單項(xiàng)的主控菜單子程序以鏈接系統(tǒng)的各項(xiàng)子功能,方便用戶使用本系統(tǒng)。本系統(tǒng)主控菜單運(yùn)行界面如圖2-3所示。圖2-3“學(xué)生通訊錄管理系統(tǒng)”主菜單存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)本系統(tǒng)主要采用鏈表結(jié)構(gòu)類型來(lái)表示存儲(chǔ)在“學(xué)生通訊錄管理系統(tǒng)”中的信息。其中,鏈表結(jié)點(diǎn)由四個(gè)分量構(gòu)成:通訊錄成員學(xué)號(hào)、通訊錄成員姓名、通訊錄成員號(hào)碼、指向該結(jié)構(gòu)體的指針。此外,本系統(tǒng)還設(shè)置了一個(gè)全局變量seat,表示通訊錄中成員的序號(hào)。系統(tǒng)功能設(shè)計(jì)本系統(tǒng)設(shè)置了5個(gè)子功能菜單,5個(gè)子功能的設(shè)計(jì)描述如下。建立通訊錄系統(tǒng)??梢砸淮屋斎攵鄠€(gè)成員通訊錄的信息,建立通訊錄。該功能由creatIncreLink()函數(shù)實(shí)現(xiàn)。插入通訊記錄。每次可以插入一個(gè)成員通訊錄的信息。如果要連續(xù)插入多個(gè)成員通訊錄信息必須多次選擇該功能。該功能有insertYouXu()函數(shù)實(shí)現(xiàn)。查詢通訊記錄??梢园磧煞N方式查詢所需要的通訊錄成員記錄,一是按學(xué)號(hào)查詢,二是按姓名查詢。分別由seartNum()和seartName()函數(shù)實(shí)現(xiàn)。刪除通訊記錄??梢詫?duì)通訊錄中不再需要的信息進(jìn)行刪除。有三種刪除方式:按序號(hào)進(jìn)行刪除,按學(xué)號(hào)進(jìn)行刪除和按姓名進(jìn)行刪除。分別由deleteElem()函數(shù),delNum()函數(shù)和delName()函數(shù)實(shí)現(xiàn)。顯示通訊錄系統(tǒng)。可以查看通訊錄中所有的通訊錄成員記錄。該功能由printList()函數(shù)實(shí)現(xiàn)。三、模塊設(shè)計(jì)模塊設(shè)計(jì)本程序包含兩個(gè)模塊:主程序模塊和鏈表操作模塊。其調(diào)用關(guān)系如圖2-4所示。主程序模塊主程序模塊鏈表操作模塊圖2-4模塊調(diào)用示意圖系統(tǒng)子程序及功能設(shè)計(jì)本系統(tǒng)共設(shè)置10個(gè)子程序,各程序的函數(shù)名及功能說(shuō)明如下,其中大部分函數(shù)都是鏈表的基本操作函數(shù)。LinkListcreatIncreLink()//鏈表的創(chuàng)建deleteElem(LinkListL,inti)//從通訊錄中按序號(hào)刪除第i個(gè)元素delName(LinkListL,charn[])//按姓名刪除通訊錄記錄delNum(LinkListL,intn)//按學(xué)號(hào)刪除通訊錄記錄voidinsertYouXu(LinkListL,LinkListElem)//插入一條通訊錄printList(LinkListL)//打印指針地址為L(zhǎng)的通訊錄prior(LinkListL,LinkListp)//查找位于當(dāng)前地址元素的前一元素的地址searchName(LinkListL,intn)//按姓名查找通訊錄記錄intsearchNum(LinkListL,intn)//按學(xué)號(hào)查找查找通訊錄記錄voidmain()//主函數(shù)。設(shè)定界面的顏色和大小,調(diào)用鏈表操作模塊函數(shù)主要調(diào)用關(guān)系圖本系統(tǒng)10個(gè)子程序之間的主要調(diào)用關(guān)系如圖2-5所示。圖中數(shù)字是各函數(shù)的編號(hào)。圖2-5系統(tǒng)函數(shù)調(diào)用關(guān)系圖如下所示:四、詳細(xì)設(shè)計(jì)1.?dāng)?shù)據(jù)類型定義本系統(tǒng)采用鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)通訊錄結(jié)點(diǎn)。結(jié)點(diǎn)定義如下:typedefstructLNode{ intnumber; doubletelenum; charname[20]; structLNode*next;}LNode,*Linklist;系統(tǒng)主要子程序詳細(xì)設(shè)計(jì)建立鏈表的函數(shù),主要用來(lái)建立通訊錄。LinklistcreateIncreLink(){//創(chuàng)建一個(gè)存放通訊錄成員的非遞減有序表,返回頭結(jié)點(diǎn)地址 LinklistL=(Linklist)malloc(LEN); L->next=NULL; Linklistp; intnum=1,number; doubletelenum; charname[20]; printf("請(qǐng)輸入學(xué)生學(xué)號(hào)、姓名和號(hào)碼,建立通訊錄,以'-1'為輸入結(jié)束標(biāo)志\n");printf("請(qǐng)輸入學(xué)號(hào)%d:",num); scanf("%d",&number); printf("請(qǐng)輸入姓名%d:",num);chartemp=getchar(); gets(name); printf("請(qǐng)輸入號(hào)碼%d:",num); scanf("%1f",&telenum); while(number>=0) { p=(Linklist)malloc(LEN); p->number=number;p->telenum=telenum; strcpy(p->name,name); insertYouXu(L,P); num++; printf("請(qǐng)輸入學(xué)號(hào)%d:",num);scanf("%d",&number); printf("請(qǐng)輸入姓名%d:",num); temp=getchar(); gets(name);printf("請(qǐng)輸入號(hào)碼%d:",num); scanf("%1f",&telenum); } return(L);}顯示鏈表中所有結(jié)點(diǎn)的信息,用查看通訊錄所有的記錄。voidprintList(LinkListL){//打印頭結(jié)點(diǎn)地址為L(zhǎng)的通訊錄 printf("\n ----------------\n"); printf(" 學(xué)號(hào) 姓名 號(hào)碼\n"); printf(" ----------------\n"); LinkListp=L; intn=1; if(L==NULL||L->next==NULL)printf("該通訊錄中沒(méi)有元素\n"); //判斷通訊錄是否為空 else while(p->next!=NULL) { printf(" %2d%-9d",n,p->next->number); printf(" %-5s%.0f\n",p->next->name,p->next->telenum); p=p->next; n++; } printf("--------------------\n"); return;}測(cè)試分析系統(tǒng)運(yùn)行主界面如圖2-3所示。各子功能測(cè)試運(yùn)行結(jié)果如下。通訊錄的建立在主菜單下,用戶輸入1并回車,然后按照提示建立通訊錄,分別輸入通訊錄成員的學(xué)號(hào),姓名,號(hào)碼,運(yùn)行結(jié)果如圖2-6所示。圖2-6通訊錄的建立2.插入通訊錄記錄在主菜單下,用戶輸入2并回車,可以插入一個(gè)新的通訊錄成員的信息,依次輸入學(xué)號(hào),姓名和號(hào)碼,運(yùn)行結(jié)果如圖2-7所示。圖2-7插入通訊錄3.查詢通訊錄記錄在主菜單下,用戶輸入3并回車,可以按照兩種方式查詢通訊錄。一種是按學(xué)號(hào)查詢,另一種方式是按姓名查詢。可按照提示操作,運(yùn)行結(jié)果如圖2-8所示。圖2-8查詢通訊記錄刪除通訊錄記錄在主菜單下,用戶輸入4并回車,進(jìn)行通訊錄記錄的刪除??梢园慈N方式進(jìn)行刪除操作:按序號(hào)、按學(xué)號(hào)和按姓名。圖2-9是按學(xué)號(hào)刪除的運(yùn)行結(jié)果。圖2-9刪除通訊記錄顯示通訊錄信息在主菜單下,用戶輸入5并回車,可以查看通訊錄中的所有成員信息。運(yùn)行結(jié)果如圖2-10所示。圖2-10顯示通訊錄信息用戶手冊(cè)本程序執(zhí)行文件為“學(xué)生通訊錄管理系統(tǒng).exe”。進(jìn)入本系統(tǒng)之后,隨即顯示系統(tǒng)主菜單界面,用戶可在該界面下輸入各子菜單前對(duì)應(yīng)的數(shù)字并按回車鍵,執(zhí)行相應(yīng)子菜單命令。本系統(tǒng)沒(méi)有提供直接修改通訊錄信息的功能,可通過(guò)刪除和插入操作完成修改功能。七、調(diào)試報(bào)告調(diào)試過(guò)程中insertYouXucreateIncreLink未聲明變量。后來(lái)把對(duì)函數(shù)定義提到程序初始定義。發(fā)現(xiàn)直接將數(shù)值在調(diào)用的函數(shù)里定義、輸入、輸出,避免在主函數(shù)里傳輸數(shù)據(jù),其這樣就不易出現(xiàn)錯(cuò)誤。查找算法,運(yùn)行結(jié)果由于字母出錯(cuò)出現(xiàn)死循環(huán)。通過(guò)這次課程設(shè)計(jì)使自己深刻認(rèn)識(shí)到自身的不足。對(duì)線性表的插入、刪除、查找等算法的實(shí)現(xiàn)有了更深一步的理解,受益多多。八、程序清單#include<stdio.h>#include<stdlib.h>#include<string.h>#defineNULL0#defineLENsizeof(LNode)intseat;//通訊錄成員的序號(hào)typedefstructLNode{//用于通訊錄結(jié)點(diǎn) intnumber; doubletelenum; charname[20]; structLNode*next;}LNode,*LinkList;//1.創(chuàng)建鏈表voidinsertYouXu(LNode*pn,LinkListp);LinkListcreateIncreLink(){//創(chuàng)建一個(gè)存放通訊錄成員的非遞減有序表,返回頭結(jié)點(diǎn)地址 LinkListL=(LinkList)malloc(LEN);//頭結(jié)點(diǎn) L->next=NULL; LinkListp; intnum=1,number; doubletelenum; charname[20]; printf("請(qǐng)輸入學(xué)生學(xué)號(hào)、姓名和號(hào)碼,建立通訊錄,以'-1'為輸入結(jié)束標(biāo)志\n");printf("請(qǐng)輸入學(xué)號(hào)%d:",num); scanf("%d",&number); printf("請(qǐng)輸入姓名%d:",num);chartemp=getchar(); gets(name); printf("請(qǐng)輸入號(hào)碼%d:",num); scanf("%1f",&telenum); while(number>=0) { p=(LinkList)malloc(LEN);//新結(jié)點(diǎn) p->number=number;p->telenum=telenum; strcpy(p->name,name); insertYouXu(L,p);//有序地插入新結(jié)點(diǎn) num++; printf("請(qǐng)輸入學(xué)號(hào)%d:",num);scanf("%d",&number); printf("請(qǐng)輸入姓名%d:",num); temp=getchar(); gets(name);printf("請(qǐng)輸入號(hào)碼%d:",num); scanf("%1f",&telenum); } return(L);}//2.從通訊錄中刪除第i個(gè)元素voiddeleteElem(LinkListL,inti){LinkListp=L; intj=0; while(p->next&&j<i-1) { p=p->next;j++; } if(!(p->next))//判斷i是否合法,i不能大于元素的個(gè)數(shù),也不能小于等于0 { printf("第%d個(gè)元素刪除失敗\n",i);return; }LinkListq=p->next; p->next=q->next; free(q);//釋放刪除的結(jié)點(diǎn)}//3.按姓名刪除通訊者intdelName(LinkListL,charn[]){ intflag=0;//判斷要?jiǎng)h除的通訊者和通訊錄中的姓名是否匹配LinkListp=L->next; seat=1; if(L->next==NULL)printf("該鏈表中沒(méi)有元素,查找失敗\n"); else { while(p!=NULL) { if(!strcmp(p->name,n))//比較輸入的姓名和通訊錄中的姓名 { flag=1;//輸入姓名匹配 printf("%s",p->name); p=p->next; deleteElem(L,seat); } else{p=p->next;seat++;}//輸入姓名不匹配,指針移到下一個(gè)通訊者 } if(flag)printf("被刪除\n"); } returnflag;}//4.按學(xué)號(hào)刪除通訊錄intdelNum(LinkListL,intn){ intflag=0;//判斷要?jiǎng)h除的通訊者LinkListp=L->next; seat=1; if(L->next==NULL) printf("該鏈表中沒(méi)有元素,刪除失敗\n"); else { while(p!=NULL) { if(p->number<=n) { if(p->number==n) { flag=1;//輸入學(xué)號(hào)匹配 printf("%d",p->number); p=p->next; deleteElem(L,seat); } } else{p=p->next;seat++;} } printf("被刪除\n"); } returnflag;}//6.打印頭結(jié)點(diǎn)地址為L(zhǎng)的通訊錄voidprintList(LinkListL){//打印頭結(jié)點(diǎn)地址為L(zhǎng)的通訊錄 printf("\n ----------------\n"); printf(" 學(xué)號(hào) 姓名 號(hào)碼\n"); printf(" ----------------\n"); LinkListp=L; intn=1; if(L==NULL||L->next==NULL)printf("該通訊錄中沒(méi)有元素\n"); //判斷通訊錄是否為空 else while(p->next!=NULL) { printf(" %2d%-9d",n,p->next->number); printf(" %-5s%.0f\n",p->next->name,p->next->telenum); p=p->next; n++; } printf("--------------------\n"); return;}//7.找到位于當(dāng)前地址元素的前一個(gè)元素的地址LinkListprior(LinkListL,LinkListp){ if(L->next==NULL)return(L); LinkListp_prior=L; while(p_prior->next!=p) p_prior=p_prior->next; return(p_prior);}//8.按姓名查找通訊者intsearchName(LinkListL,charn[]){ intflag=0;//標(biāo)志要查找的通訊者和通訊錄中的姓名是否匹配 LinkListp=L->next; seat=1; if(L->next==NULL||L==NULL)printf("該通訊錄中沒(méi)有元素,查找失敗\n"); else { while(p!=NULL) { if(!strcmp(p->name,n))//比較要查找的姓名是否和當(dāng)前通訊錄所指姓名匹配 { flag=1;//輸入姓名匹配 printf("要查找的是第%d位通訊者:\n",seat); printf("Number:%dName:%sTeleNo.:%.of\n",p->number, p->name,p->telenum); } p=p->next;seat++;//!!!!! } } returnflag;}//9.按學(xué)號(hào)查找通訊者intsearchNum(LinkListL,intn){ intflag=0;//標(biāo)志要查找的通訊者和通訊錄中的學(xué)號(hào)是否匹配 LinkListp=L->next; seat=1; if(L->next==NULL)printf("該鏈表中沒(méi)有元素,查找失敗\n"); else { while(p!=NULL) { if(p->number<=n) if(p->number==n) { flag=1;//輸入學(xué)號(hào)匹配 printf("要查找的是第%d位通訊者:\n",seat); printf("學(xué)號(hào):%d姓名:%s號(hào)碼.:%.of\n",p->number, p->name,p->telenum); } p=p->next;seat++; } } returnflag;}//10.主函數(shù)。設(shè)定界面的顏色大小,調(diào)用工作區(qū)模塊函數(shù)voidmain(){ system("color1f");//設(shè)置界面顏色 LinkListL=NULL; printf("\n*****************^@^歡迎使用通訊錄系統(tǒng)***********\n"); printf(" *1通訊錄的建立*\n"); printf(" *2插入通訊記錄*\n"); printf(" *3查詢通訊記錄*\n"); printf(" *4刪除通訊記錄*\n"); printf(" *5顯示通訊記錄信息*\n"); printf(" *0退出管理系統(tǒng)*\n"); printf("\n*****************^@^歡迎使用通訊錄系統(tǒng)***********\n"); intflag=0;//通訊錄是否建立 intmenu;//菜單選項(xiàng) printf("請(qǐng)選擇0-5:"); printf("%d",&menu); while(menu!=0) { switch(menu)//用于調(diào)用菜單的語(yǔ)句 { case1: { L=creatIncreLink();//調(diào)用函數(shù)實(shí)現(xiàn)通訊錄的建立 printf("建立通訊錄:"); printList(L);flag=1; break; } case2: { if(flag==1) { intnumber,telenum; charname[20]; printf("請(qǐng)輸入通訊者的學(xué)號(hào)和姓名:\n"); printf("請(qǐng)輸入學(xué)號(hào):"); scanf("%d,&number"); printf("請(qǐng)輸入姓名:"); chartemp=getchar(); gets(name); printf("請(qǐng)輸入號(hào)碼:"); scanf("%d",&telenum); LinkListp=(LinkList)malloc(LEN);//新結(jié)點(diǎn) p->number=number; strcpy(p->name,name); p->telenum=telenum; insertYouXu(L,p);//有序的插入新結(jié)點(diǎn) printf("插入后:"); printfList(L); } elseprintf("\nERROR:通訊錄還沒(méi)有建立,請(qǐng)先建立通訊錄\n"); break; } case3: { intway,n,s;//查找方式 charna[20]; if(L!=NULL) { if(flag)//通訊錄已建立 { printf("選擇查找方式:\n"); printf("1.按學(xué)號(hào)2.按姓名"); scanf("%d",&way); if(way==1) { printf("\n請(qǐng)輸入學(xué)號(hào):"); scanf("%d",&n); s=searchNum(L,n);//查找通訊錄成員 if(s==0)printf("無(wú)此通訊者,查找失??!\n"); } elseif(way==2) { printf("\n請(qǐng)輸入姓名:"); chartemp=getchar(); gets(na); s=searchName(L,na); if(s==0)printf("無(wú)此通訊者,查找失??!\n"); } elseprintf("通訊錄中無(wú)記錄!\n"); } break; } elseprintf("通訊錄中無(wú)記錄!\n"); break; } case4: { intway;//刪除方式 printf("請(qǐng)選擇刪除方式:1.按序號(hào)2.按學(xué)號(hào)3.按姓名\n"); scanf("%d",&way); if(way==1) { intn; printf("請(qǐng)輸入通訊錄序號(hào):");scanf("%d",&n); printf("刪除后:\n");deleteElem(L,n);//按序號(hào)刪除 printfList(L); } elseif(way==2) { intn,f; printf("請(qǐng)輸入學(xué)號(hào):");scanf("%d",&n); f=delNum(L,n); if(f!=0) { printf("刪除后:\n"); printfList(L); } elseprintf("無(wú)該學(xué)號(hào),刪除失?。n"); } elseif(way==3); { charna[20]; intf; printf("請(qǐng)輸入姓名:"); chartemp=getchar(); f=delName(L,na); if(f!=0) { printf("刪除后:\n"); printfList(L); } elseprintf("無(wú)該學(xué)號(hào),刪除失?。n"); } elseprintf("ERROR??!\n"); break; } case5: { printf("當(dāng)前通訊錄記錄內(nèi)容如下:\n"); printfList(L); break; } case0:exit(0);default:printf("\n沒(méi)有此功能,重新輸入\n"); } printf("選擇功能:"); scanf("%d",&menu); } }

設(shè)計(jì)題目<二>:城市鏈表設(shè)計(jì)要求1.問(wèn)題描述將各個(gè)城市的信息存入一個(gè)帶頭結(jié)點(diǎn)的單鏈表。結(jié)點(diǎn)中的城市信息包括城市名、位置坐標(biāo)。要求能夠利用城市名和位置坐標(biāo)進(jìn)行有關(guān)查找、插入、刪除更新等操作。需求分析輸入城市信息,建立城市鏈表根據(jù)城市名或者位置對(duì)城市進(jìn)行查找向城市鏈表中加入新的城市根據(jù)城市名或位置刪除城市鏈表中的城市更新城市鏈表中城市的信息搜索離某點(diǎn)距離為d的城市,并輸出它的信息查看城市鏈表中所以城市的信息二、概要設(shè)計(jì)1.主界面設(shè)計(jì)為了實(shí)現(xiàn)城市鏈表的各種功能,為了方便用戶使用本系統(tǒng)。本系統(tǒng)主控菜單運(yùn)行界面如圖2-1所示。圖2-1“城市鏈表”主菜單存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)本系統(tǒng)采用帶頭節(jié)點(diǎn)的鏈表結(jié)構(gòu)來(lái)儲(chǔ)存“城市鏈表”中的信息。鏈表節(jié)點(diǎn)有4個(gè)成員:城市名、城市的橫坐標(biāo)、城市的縱坐標(biāo),指向該結(jié)構(gòu)體的指針。系統(tǒng)功能設(shè)計(jì)本系統(tǒng)設(shè)置了9個(gè)子功能菜單,9個(gè)子功能的設(shè)計(jì)描述如下。(1)建立城市鏈表。由函數(shù)creatLink()實(shí)現(xiàn),該功能實(shí)現(xiàn)城市結(jié)點(diǎn)的輸入以及連接??梢猿跏蓟湵?,輸入城市名“end”時(shí)表示建立結(jié)束。(3)插入鏈表記錄。由函數(shù)insert()實(shí)現(xiàn)。該功能實(shí)現(xiàn)按坐標(biāo)由小到大的順序?qū)⒔Y(jié)點(diǎn)插入到鏈表中。(4)查詢鏈表記錄。由searchName()函數(shù)和searchPos()函數(shù)實(shí)現(xiàn)。其中searchName()實(shí)現(xiàn)按照城市名查詢的操作,searchPos()實(shí)現(xiàn)按照城市坐標(biāo)查詢的操作。(5)刪除鏈表記錄。由delName()函數(shù)和delPos()函數(shù)實(shí)現(xiàn)。其中delName的操作。(6)顯示鏈表記錄。由printList()函數(shù)實(shí)現(xiàn)。該功能實(shí)現(xiàn)格式化的鏈表輸出操作,可以顯示修改后的鏈表狀態(tài)。(7)更新鏈表信息。由update()函數(shù)實(shí)現(xiàn)。該功能實(shí)現(xiàn)按照城市名更新城市的坐標(biāo)信息。(8)輸出鏈表。由函數(shù)PrintLn()來(lái)實(shí)現(xiàn)。輸出鏈表里所有城市的信息。(9)城市搜索。由函數(shù)Search()來(lái)實(shí)現(xiàn)。給定一個(gè)位置,搜索距離它d的城市,并輸出他們的信息。三、模塊設(shè)計(jì)1.模塊設(shè)計(jì)本程序包含兩個(gè)模塊:主程序模塊和鏈表操作模塊。調(diào)用關(guān)系如圖(2)所示。主程序模塊主程序模塊鏈表操作模塊圖2-2模塊調(diào)用示意圖系統(tǒng)子程序及功能設(shè)計(jì)本系統(tǒng)共設(shè)置3個(gè)子程序,各程序的函數(shù)名及功能說(shuō)明如下:(1)LinklistcreatLink() //創(chuàng)建一個(gè)城市鏈表,返回頭結(jié)點(diǎn)地址(2)printList(LinklistL) //打印頭結(jié)點(diǎn)地址為L(zhǎng)的城市鏈表(3)intsearchName(LinklistL,charname[]) //以城市名查找(4)intsearchPos(LinklistL,intpx,intpy) //以城市坐標(biāo)查找(5)intinsert(LinklistL,Linklistcity) //插入(6)intdelName(LinklistL,charname[]) //利用城市名稱刪除(7)intdelPos(LinklistL,intpx,intpy) //利用坐標(biāo)刪除(8)intupdate(LinklistL,charname[]) //更新(9)intgetPos(LinklistL,charname[]) //給定一個(gè)城市名,返回城市坐標(biāo)(10)intgetCity(LinklistL,intpx,intpy,intd) //給定一個(gè)城市坐標(biāo)P,返回距離小于等于d的城市(11)voidmain() //主函數(shù),實(shí)現(xiàn)鏈表各項(xiàng)操作的選擇函數(shù)主要調(diào)用關(guān)系圖本系統(tǒng)3個(gè)子程序之間的主要調(diào)用關(guān)系如圖2-3所示。圖中數(shù)字是各函數(shù)的編號(hào)。1128967543102222211main()四、詳細(xì)設(shè)計(jì)1.?dāng)?shù)據(jù)類型定義(1)數(shù)據(jù)類型定義typedefstructLNode{//城市結(jié)點(diǎn) charname[20]; intposx;//橫坐標(biāo) intposy;//縱坐標(biāo) structLNode*next;}LNode,*Linklist;系統(tǒng)主要子程序詳細(xì)設(shè)計(jì)(1)建立城市鏈表LinklistcreatLink()//創(chuàng)建一個(gè)城市鏈表,返回頭結(jié)點(diǎn)地址{ LinklistL=(Linklist)malloc(LEN);//頭結(jié)點(diǎn) L->next=NULL; Linklistp; charname[20]; intpx; intpy; charend[4]="end"; printf("請(qǐng)輸入城市名稱、橫坐標(biāo)和縱坐標(biāo),建立城市鏈表,以'end'為輸入結(jié)束標(biāo)志\n"); printf("請(qǐng)輸入城市名稱:"); scanf("%s",name); while(strcmp(name,end)) { printf("請(qǐng)輸入橫坐標(biāo)x:"); scanf("%d",&px); printf("請(qǐng)輸入縱坐標(biāo)y:"); scanf("%d",&py); p=(Linklist)malloc(LEN);//新結(jié)點(diǎn) strcpy(p->name,name); p->posx=px; p->posy=py; insert(L,p);//插入新結(jié)點(diǎn) printf("請(qǐng)輸入城市名稱:"); scanf("%s",name); } return(L);}(2)插入鏈表記錄intinsert(LinklistL,Linklistcity){//插入 Linklistp=L->next; Linklistp_prior=L; while(p!=NULL&&city->posx>=p->posx) { if(p->posx==city->posx&&p->posy==city->posy) { printf("重復(fù)輸入!\n");return0; } p=p->next; }//確定city插入的位置 while(p_prior->next!=p) { p_prior=p_prior->next; } if(p==NULL) { p=p_prior; city->next=NULL; p->next=city; } else//若為空表,插到頭結(jié)點(diǎn)之后 { p=p_prior; city->next=p->next; p->next=city; } return1;}(3)按名稱刪鏈表記錄intdelName(LinklistL,charname[20]){//利用城市名稱刪除 intflag=0; intseat=1; Linklistp=L; if(p->next==NULL) printf("該鏈表中沒(méi)有元素,刪除失敗\n"); else { while(p->next!=NULL) { if(!strcmp(p->next->name,name)) { flag=1; printf("城市%s被刪除\n",name); Linklistq=p->next; p->next=q->next; free(q); } else{p=p->next;} } } returnflag;}測(cè)試分析系統(tǒng)運(yùn)行主界面如圖2-1所示。各子功能測(cè)試運(yùn)行結(jié)果如下。1.城市鏈表建立主菜單下輸入1并回車,根據(jù)提示輸入鏈表信息,輸入“end”結(jié)束建立。運(yùn)行結(jié)果如圖2-3所示。圖2-3城市鏈表的建立2.插入鏈表主菜單下輸入2并回車,可以進(jìn)行鏈表插入,運(yùn)行結(jié)果如圖2-4所示。圖2-4插入鏈表3.查找鏈表主菜單下輸入3并回車可以查找鏈表,再根據(jù)提示選擇按城市名查找還是城市位置坐標(biāo)查找。運(yùn)行結(jié)果如圖2-5所示。圖2-5查找鏈表4.刪除鏈表主菜單下輸入4并回車可以刪除鏈表。運(yùn)行結(jié)果如圖2-6所示圖2-6刪除鏈表5.顯示當(dāng)前鏈表記錄主菜單下輸入5并回車可以顯示當(dāng)前鏈表。運(yùn)行結(jié)果如圖2-7所示。圖2-7當(dāng)前鏈表顯示6.更新鏈表記錄主菜單下輸入6并回車可以更新鏈表記錄。運(yùn)行結(jié)果如圖2-8所示圖2-8鏈表更新記錄7.返回城市坐標(biāo)記錄主菜單下輸入7并回車可以顯示當(dāng)前鏈表。運(yùn)行結(jié)果如圖2-9所示圖2-9返回鏈表記錄查看當(dāng)前坐標(biāo)p小于等于d的城市主菜單下輸入8并回車可以查看坐標(biāo)p小于等于d的城市。運(yùn)行結(jié)果如圖2-10所示用戶手冊(cè)(1)本程序執(zhí)行文件為“城市鏈表.exe”。(2)進(jìn)入本系統(tǒng)后,可以選擇菜單功能項(xiàng),首先選擇功能1建立城市鏈表的基本數(shù)據(jù)后方可進(jìn)行2-8的功能。(3)在查詢和刪除鏈表記錄中,均可以根據(jù)需要按照兩種方式執(zhí)行鏈表操作,一種是按照城市的名稱,一種則是按照城市的坐標(biāo)實(shí)現(xiàn)。調(diào)試報(bào)告while后多出分號(hào)導(dǎo)致查找鏈表時(shí)出現(xiàn)死循環(huán),通過(guò)這次的編寫(xiě)調(diào)試,細(xì)心和耐心是最最重要的,而對(duì)于線性表的每一個(gè)功能都需反復(fù)測(cè)試。由于自己能力不夠,對(duì)之前所學(xué)的數(shù)據(jù)結(jié)構(gòu)與算法有所遺忘,在編寫(xiě)程序中對(duì)算法的理解有點(diǎn)吃力,最后重新預(yù)習(xí)下課本,最終完成該鏈表,對(duì)鏈表的插入、刪除,查找等算法的操作有了更深的認(rèn)識(shí)與理解。受益匪淺。如果有n個(gè)城市結(jié)點(diǎn),時(shí)間復(fù)雜度為0(n)。程序清單#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#defineLENsizeof(LNode)typedefstructLNode{ charname[20]; intposx;//橫坐標(biāo) intposy;//縱坐標(biāo) structLNode*next;}LNode,*Linklist;//用于城市結(jié)點(diǎn)intinsert(LinklistL,Linklistcity);LinklistcreatLink()//創(chuàng)建一個(gè)城市鏈表,返回頭結(jié)點(diǎn)地址{ LinklistL=(Linklist)malloc(LEN);//頭結(jié)點(diǎn) L->next=NULL; Linklistp; charname[20]; intpx; intpy; charend[4]="end"; printf("請(qǐng)輸入城市名稱、橫坐標(biāo)和縱坐標(biāo),建立城市鏈表,以'end'為輸入結(jié)束標(biāo)志\n"); printf("請(qǐng)輸入城市名稱:"); scanf("%s",name); while(strcmp(name,end)) { printf("請(qǐng)輸入橫坐標(biāo)x:"); scanf("%d",&px); printf("請(qǐng)輸入縱坐標(biāo)y:"); scanf("%d",&py); p=(Linklist)malloc(LEN);//新結(jié)點(diǎn) strcpy(p->name,name); p->posx=px; p->posy=py; insert(L,p);//插入新結(jié)點(diǎn) printf("請(qǐng)輸入城市名稱:"); scanf("%s",name); } return(L);}voidprintList(LinklistL){//打印頭結(jié)點(diǎn)地址為L(zhǎng)的城市鏈表 printf("\n------------------------\n"); printf("城市\(zhòng)t坐標(biāo)\n"); printf("-------------------------\n"); Linklistp=L->next; intn=1; if(L->next==NULL)printf("該鏈表中沒(méi)有元素\n"); else while(p!=NULL) { printf("%s",p->name); printf("\t(%d,%d)\n",p->posx,p->posy); p=p->next; } printf("-------------------------\n"); return;}intsearchName(LinklistL,charname[20]){//以城市名查找 intflag=0; Linklistp=L->next; if(L->next==NULL)printf("該鏈表中沒(méi)有元素,查找失敗\n"); else { while(p!=NULL){ if(!strcmp(p->name,name)) { flag=1; printf("您要查找的是%s城市\(zhòng)n",p->name); printf("該城市坐標(biāo)為(%d,%d)\n",p->posx,p->posy); } p=p->next; } } returnflag;}intsearchPos(LinklistL,intpx,intpy){//以城市坐標(biāo)查找 intflag=0; Linklistp=L->next; if(L->next==NULL)printf("該鏈表中沒(méi)有元素,查找失敗\n"); else { while(p!=NULL){ if(p->posx==px&&p->posy==py) { flag=1; printf("您要查找城市坐標(biāo)為(%d,%d)\n",p->posx,p->posy); printf("該城市是%s\n",p->name); } p=p->next; } } returnflag;}intinsert(LinklistL,Linklistcity){//插入 Linklistp=L->next; Linklistp_prior=L; while(p!=NULL&&city->posx>=p->posx) { if(p->posx==city->posx&&p->posy==city->posy) { printf("重復(fù)輸入!\n");return0; } p=p->next; }//確定city插入的位置 while(p_prior->next!=p) { p_prior=p_prior->next; } if(p==NULL) { p=p_prior; city->next=NULL; p->next=city; } else//若為空表,插到頭結(jié)點(diǎn)之后 { p=p_prior; city->next=p->next; p->next=city; } return1;}intdelName(LinklistL,charname[20]){//利用城市名稱刪除 intflag=0; intseat=1; Linklistp=L; if(p->next==NULL) printf("該鏈表中沒(méi)有元素,刪除失敗\n"); else { while(p->next!=NULL) { if(!strcmp(p->next->name,name)) { flag=1; printf("城市%s被刪除\n",name); Linklistq=p->next; p->next=q->next; free(q); } else{p=p->next;} } } returnflag;}intdelPos(LinklistL,intpx,intpy){//利用坐標(biāo)刪除 intflag=0; Linklistp=L; if(p->next==NULL) printf("該鏈表中沒(méi)有元素,刪除失敗\n"); else { while(p->next!=NULL) { if(p->next->posx==px&&p->next->posy==py) { Linklistq=p->next; p->next=q->next; free(q); flag=1; printf("坐標(biāo)為(%d,%d)的城市被刪除\n",px,py); } else{p=p->next;} } } returnflag;}intupdate(LinklistL,charname[20]){//更新 intflag=0; Linklistp=L->next; if(L->next==NULL||L==NULL)printf("該鏈表中沒(méi)有元素,更新失敗\n"); else { while(p!=NULL){ if(!strcmp(p->name,name)) { flag=1; printf("您要更新的是%s城市\(zhòng)n",p->name); printf("請(qǐng)輸入橫坐標(biāo)x:"); scanf("%d",&p->posx); printf("請(qǐng)輸入縱坐標(biāo)y:"); scanf("%d",&p->posy); } p=p->next; } } returnflag; }intgetPos(LinklistL,charname[20]){//給定一個(gè)城市名,返回城市坐標(biāo) intflag=0; Linklistp=L->next; if(L->next==NULL||L==NULL)printf("該鏈表中沒(méi)有元素,返回坐標(biāo)失敗\n"); else { while(p!=NULL){ if(!strcmp(p->name,name)) { flag=1; printf("您要查看的是%s城市\(zhòng)n",p->name); printf("該城市坐標(biāo)為:(%d,%d)\n",p->posx,p->posy); } p=p->next; } } returnflag;}intgetCity(LinklistL,intpx,intpy,intd){//給定一個(gè)城市坐標(biāo)P,返回距離小于等于d的城市 intflag=0; doubledistance; Linklistp=L->next; if(L->next==NULL||L==NULL)printf("該鏈表中沒(méi)有元素,返回坐標(biāo)失敗\n"); else { while(p!=NULL){ distance=sqrt((p->posx-px)^2+(p->posy-py)^2); if(distance<=d) { flag=1; printf("該城市為:%s",p->name); } p=p->next; } } printf("\n"); returnflag;}voidmain(){ LinklistL=NULL; printf("\n**************歡迎使用城市鏈表系統(tǒng)***************\n"); printf("*1建立城市鏈表*\n"); printf("*2插入鏈表記錄*\n"); printf("*3查詢鏈表記錄*\n"); printf("*4刪除鏈表記錄*\n"); printf("*5顯示鏈表記錄*\n"); printf("*6更新鏈表信息*\n"); printf("*7返回城市坐標(biāo)*\n"); printf("*8查看與坐標(biāo)P距離小于等于D的城市*\n"); printf("*9退出鏈表系統(tǒng)*\n"); printf("*************歡迎使用城市鏈表系統(tǒng)****************\n"); intmain_flag=0; intflag; intmenu; printf("請(qǐng)選擇1-9:"); scanf("%d",&menu); while(menu) { switch(menu) { case1://建立城市鏈表 { L=creatLink(); printf("建立城市鏈表:"); printList(L); main_flag=1; break; } case2://插入鏈表記錄 { if(main_flag==1) { charname[20]; intpx,py; printf("請(qǐng)輸入城市名稱:"); scanf("%s",name); printf("請(qǐng)輸入橫坐標(biāo)x:"); scanf("%d",&px); printf("請(qǐng)輸入縱坐標(biāo)y:"); scanf("%d",&py); Linklistp=(Linklist)malloc(LEN);//新結(jié)點(diǎn) strcpy(p->name,name); p->posx=px; p->posy=py; insert(L,p);//有序的插入新結(jié)點(diǎn) printf("插入后的城市鏈表為:"); printList(L

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論