城市链表-数据结构课程设计(共18页).doc
精选优质文档-倾情为你奉上设计题目<一>: 2.4.3城市链表查询系统 一、设计要求1问题描述将若干个城市的信息,存入一个带头结点的单链表。结点中的城市信息包含城市名和城市的位置坐标。要求能够利用城市名和位置坐标进行相关查找、插入、删除、更新等操作。2需求分析(1)、创建一个城市链表,能够输入城市信息,即城市名和城市位置坐标;(2)、能够根据城市名查询其位置坐标;(3)、根据离中心坐标距离查询城市名;(4)、能够插入城市信息;(5)、能够删除城市信息;(6)、能够更新城市信息;(7)、执行完毕,退出程序。二、概要设计1主界面设计为了实现串基本操作演示系统各功能的管理,本系统设计一个含有多个菜单项的主控单,方便用户使用。本系统主控菜单运行界面如图1所示。图1 城市链表操作系统主菜单2存储结构设计typedef struct CityListchar CityName10;float X,Y;struct CityList *Next; CityList, *LHead; / 结点类型,指针类型3系统功能设计(1)创建城市链表。有函数void Create()实现。调用主函数main()和插入函数Insert()来完成创建操作。(2)查找操作。有函数void FindCity()和函数void FindCityDistance()实现。在创建链表的基础上正向和反向查找城市的信息。(3)插入操作。有函数void Insert()实现。根据用户的输入,系统自动在原有的链表中插入新的信息。(4)删除操作。有函数void Delete()实现。根据用户的输入,系统自动判断是否存在该信息,若存在,就给出提示进行删除操作,否则提示不存在输入的信息。(5)更新操作。有函数void UpdateCity()实现。根据用户的输入,系统自动判断是否存在该信息,若存在,就给出替换信息,否则提示不存在该信息并返回。(6)退出操作。当用户选择7时即退出本系统,有主函数中的选择函数switch来实现。三、模块设计1模块设计 本程序包含8个函数模块,其调用关系如图2所示。子功能模块主程序模块图2模块调用关系示意图2系统子程序及功能设计(1) typedef struct CITYLIST CityList; / 定义结构类型(2) void Init(CityList *LHead); /初始化函数操作(3) void Insert(CityList *LHead); /插入函数(4) void Delete(CityList *LHead); /删除函数(5) void Create(CityList *LHead); /创建函数(6) void FindCity(CityList* LHead); /查找城市操作(7) void FindCityDistance(CityList* LHead); /根据中心坐标和距离进行的查找操作(8) void UpdateCity(CityList* L /更新函数3函数主要调用关系图main()42765183图3 系统函数调用关系图四、详细设计1数据类型定义(1)源程序文件名清单:#include<stdlib.h> #include<stdio.h> #include<string.h> /字符串处理函数的头文件#include<malloc.h> /动态存储分配实现单元#include <conio.h>(2)结构类型构造typedef struct CityListchar CityName10;float X,Y;struct CityList *Next; CityList, *LHead; / 结点类型,指针类型2系统主要子程序详细设计(1)./*插入操作 void Insert(CityList *LHead) CityList* newNode; /定义指针结构为cityList型char m;newNode = (CityList*)malloc(sizeof(CityList); /生成新结点if(newNode = NULL) /验证空间申请是否成功printf("内存分配失败n");return; /若分配内存不成功,则返回继续分配。 printf("请输入城市名称并回车:");scanf("%s",newNode->CityName); /指针的数据域printf("请输入城市坐标x,y并回车:"); scanf("%f%c%f",&newNode->X,&m,&newNode->Y); /将城市信息填入新节点中while(LHead->Next != NULL) LHead = LHead->Next; /如果非空,HLead指针的位置向后移printf("已成功插入新城市信息!n");newNode->Next = LHead->Next;LHead->Next = newNode; /将新节点插入链表(2)./*删除操作 void Delete(CityList *LHead)char delCity10;printf("请输入要删除的城市名称并回车:");scanf("%s",delCity);if(LHead->Next = NULL)printf("您删除的城市不存在,请先创建城市!n");return;while(strcmp(LHead->Next->CityName,delCity ) /从LHead指向得头结点的下一个结点开判断结点中的城市名与输入城市名是否相等。LHead = LHead->Next; /不相等则指针LHead下移,继续查找LHead ->Next = LHead->Next->Next; /相等则删除此节点printf("以成功删除此城市信息!n");(3). /*更新操作 void UpdateCity(CityList* LHead)char CityName10;printf("请输入您要更新的城市名称并回车:");scanf("%s",CityName);if(LHead->Next = NULL)printf("您要更新的城市不存在,请先创建城市!n");return;while(strcmp(LHead->Next->CityName,CityName) /从LHead指向得头结点的下一个结点开判断结点中的城市名与输入城市名是否相等。LHead = LHead->Next; /当不相等则指针LHead下移,继续查找 printf("请输入城市新信息.n"); /输入城市新信息printf("请输入城市新名并回车:");scanf("%s",LHead->Next->CityName);printf("请输入城市新坐标并回车:");scanf("%f",&LHead->Next->X);scanf("%f",&LHead->Next->Y);printf("已成功更新城市信息!n");(4). /*正向查找操作 void FindCity(CityList* LHead)char CityName30;int j=0;printf("请输入您要查找的城市名称并回车:");scanf("%s",CityName);while(LHead->Next != NULL && strcmp(LHead->Next->CityName,CityName)LHead = LHead->Next;if(LHead->Next = NULL)printf("您要查找的城市不存在,请先创建城市!n");return;printf("已找到该城市,坐标为:%.2f,%.2fn",LHead->Next->X,LHead->Next->Y);(5). /*反向查找操作 void FindCityDistance(CityList* LHead) /给定坐标和距离返回城市名char m;float x;float y;float distance;printf("请输入中心坐标x,y:");scanf("%f%c%f",&x,&m,&y);printf("请输入距离:");scanf("%f",&distance);if(LHead->Next = NULL)printf("您要查找的城市不存在,请先创建城市!n");return;LHead = LHead->Next;while(LHead != NULL)if(x-LHead->X)*(x-LHead->X) + (y-LHead->Y)*(y-LHead->Y) <= distance*distance)printf("已找到该城市,名称为:%sn",LHead->CityName);printf("已找到该城市,坐标为:%.2f,%.2fn",LHead->X,LHead->Y);LHead = LHead->Next;五、测试分析系统运行主界面如图1所示。各子系统测试运行结果如下。1. 创建城市链表在主菜单下,输入1并回车,根据提示进行创建城市信息。运行结果如图4所示。图4 城市链表的创建2. 查询操作然后返回主菜单,输入2并回车,根据提示输入查找的城市信息。运行结果如图5所示。图5 城市查询运行界面3. 根据位置坐标和距离查询城市在主菜单下,输入3并回车,根据提示输入查找的城市信息。运行结果如图6所示。图6 根据位置坐标和距离进行查询4.插入操作在主菜单下,输入4并回车,根据提示插入城市信息。运行结果如图7所示。图7 城市信息的插入4. 删除操作在主菜单下,输入5并回车,根据提示进行删除城市信息操作。运行结果如图8所示。图8 城市信息的删除5. 更新操作在主菜单下,输入6并回车,根据提示进行城市信息的修改。运行结果如图9所示。图9 城市信息的更新6 退出。在主菜单下,输入7并回车,即可退出本程序。六、用户手册 (1)本程序执行文件为“城市链表操作系统.exe”。(2)进入本系统之后,随即显示系统主菜单界面。用户可在该界面下按提示信息输入命令。七、调试报告(1) 错误分析调试时while(strcmp(LHead->Next->CityName,CityName)出现错误,显示错误为cannot convert parameter 1 from 'char' to 'const char *'前一个是char类型不能用于strcmp函数,后将char CityName10(2) 创建城市链表时,输入城市信息较为麻烦,每个城市信息输入完后,若还想输入其它城市信息,则输入任意键继续,否则输入END退出,所以在输入信息时需注意输入步骤,以免发生输入混乱。(3)花了一个礼拜来弄这个程序,结果做完后,虽然能成功运行,但还是有很多bug,反复的调试,修改,我头都晕了,程序员真的很难做啊。八、程序清单#include<stdlib.h> #include<stdio.h> #include<string.h> /字符串处理函数的头文件#include<malloc.h> /动态存储分配实现单元#include <conio.h>/*结构类型构造typedef struct CityListchar CityName10;float X,Y;struct CityList *Next; CityList, *LHead; / 结点类型,指针类型/*初始化操作void Init(CityList *LHead) /建立一个带头结点的单链线性表,LHead指向头结点LHead->Next = NULL; /*插入操作 void Insert(CityList *LHead) CityList* newNode; /定义指针结构为cityList型char m;newNode = (CityList*)malloc(sizeof(CityList); /生成新结点if(newNode = NULL) /验证空间申请是否成功printf("内存分配失败n");return; /若分配内存不成功,则返回继续分配。 printf("请输入城市名称并回车:");scanf("%s",newNode->CityName); /指针的数据域printf("请输入城市坐标x,y并回车:"); scanf("%f%c%f",&newNode->X,&m,&newNode->Y); /将城市信息填入新节点中while(LHead->Next != NULL) LHead = LHead->Next; /如果非空,HLead指针的位置向后移printf("已成功插入新城市信息!n");newNode->Next = LHead->Next;LHead->Next = newNode; /将新节点插入链表 /*删除操作 void Delete(CityList *LHead)char delCity10;printf("请输入要删除的城市名称并回车:");scanf("%s",delCity);if(LHead->Next = NULL)printf("您删除的城市不存在,请先创建城市!n");return;while(strcmp(LHead->Next->CityName,delCity ) /从LHead指向得头结点的下一个结点开判断结点中的城市名与输入城市名是否相等。LHead = LHead->Next; /不相等则指针LHead下移,继续查找LHead ->Next = LHead->Next->Next; /相等则删除此节点printf("以成功删除此城市信息!n");/*创建选择项操作 void Create(CityList *LHead)char sign20; /定义输入信息类型及长度printf("【输入任意值后并回车,开始创建城市链表】or【输入END返回主菜单】n"); /当输入END时,在任意输入,则退出此操作scanf("%s",sign);while(strcmp(sign,"END") /当输入END时,再任意输入,则退出此操作Insert(LHead);printf("【输入任意值后并回车,开始创建城市链表】or【输入END返回主菜单】n");scanf("%s",sign);/*更新操作 void UpdateCity(CityList* LHead)char CityName10;printf("请输入您要更新的城市名称并回车:");scanf("%s",CityName);if(LHead->Next = NULL)printf("您要更新的城市不存在,请先创建城市!n");return;while(strcmp(LHead->Next->CityName,CityName) /从LHead指向得头结点的下一个结点开判断结点中的城市名与输入城市名是否相等。LHead = LHead->Next; /当不相等则指针LHead下移,继续查找 printf("请输入城市新信息.n"); /输入城市新信息printf("请输入城市新名称并回车:");scanf("%s",LHead->Next->CityName);printf("请输入城市新坐标并回车:");scanf("%f",&LHead->Next->X);scanf("%f",&LHead->Next->Y);printf("已成功更新城市信息!n"); /*正向查找操作 void FindCity(CityList* LHead)char CityName30;int j=0;printf("请输入您要查找的城市名称并回车:");scanf("%s",CityName);while(LHead->Next != NULL && strcmp(LHead->Next->CityName,CityName)LHead = LHead->Next;if(LHead->Next = NULL)printf("您要查找的城市不存在,请先创建城市!n");return;printf("已找到该城市,坐标为:%.2f,%.2fn",LHead->Next->X,LHead->Next->Y);/*反向查找操作 void FindCityDistance(CityList* LHead) /给定坐标和距离返回城市名char m;float x;float y;float distance;printf("请输入中心坐标x,y:");scanf("%f%c%f",&x,&m,&y);printf("请输入距离:");scanf("%f",&distance);if(LHead->Next = NULL)printf("您要查找的城市不存在,请先创建城市!n");return;LHead = LHead->Next;while(LHead != NULL)if(x-LHead->X)*(x-LHead->X) + (y-LHead->Y)*(y-LHead->Y) <= distance*distance)printf("已找到该城市,名称为:%sn",LHead->CityName);printf("已找到该城市,坐标为:%.2f,%.2fn",LHead->X,LHead->Y);LHead = LHead->Next;/*主函数,设定界面void main()system("color 0E");CityList* LHead;CityList* Store;char choice3 = 1,2,3;LHead = (CityList*)malloc(sizeof(CityList);Init(LHead); /建立空表 Store = LHead; while(strcmp(choice,"7") /操作界面 printf("*n"); printf("|=欢迎使用城市链表操作系统=|n"); printf("|_|n"); printf("|* 1.创建城市链表 *|n"); printf("|* 2.根据城市名查询城市 *|n"); printf("|* 3.根据离中心坐标距离查询城市 *|n"); printf("|* 4.插入新城市信息 *|n"); printf("|* 5.删除城市信息 *|n"); printf("|* 6.更新城市信息 *|n"); printf("|* 7.退出 *|n"); printf("|* 【小辉辉 制作 QQ-】 *|n"); printf("n"); printf("请看菜单输入您的选择并回车:"); scanf("%s",&choice); switch(choice0) case '1': Create(Store); /构造并创建城市信息链表break;case '2':FindCity(Store); /根据城市名查找城市位置break;case '3':FindCityDistance(Store); /根据所给中心坐标和距离值,返回小于等于所给距离值得节点信息。break;case '4':Insert(Store); /插入新结点break;case '5':Delete(Store); /删除结点break;case '6':UpdateCity(Store); /更新结点信息break; case '7': /退出break;default:printf("您的输入错误,请看菜单选择n");break; system("PAUSE");return ;专心-专注-专业