# 基于C语言的物流配送管理信息系统
# 一 需求分析
系统需要实现的功能如下:
**(一)各种基本数据的录入 **
- 配送路线基本信息录入
- 路线经停站点基本信息录入
- 站点经停车辆基本信息录入
- 其它信息录入
**(二)各种基本数据的修改**
即:允许对已经录入的数据重新进行编辑、修改。
- 修改某路线经停站点基本信息(修改2级链表中的结点)
**(三)各种基本数据的插入**
- 在某配送路线经停站点基本信息链(2级链)中插入一条新记录(按经停先后序)
**(四)各种基本数据的删除**
- 除配送路线基本信息链中结点。算法如下(删除1级链表中的结点)
- 遍历配送路线基本信息链,找到对应结点;(1级链表遍历)
- 遍历该结点指向的经停站点基本信息链;(2级链表遍历)
- 对链中的每一个结点,删除其指向的经停配送车辆基本信息链;(3级链表结点删除)
- 再删除该经停站点基本信息链;(2级链表结点删除)
- 最后删除配送路线基本信息链中的对应结点。(1级链表结点删除)
**(五)基于各种数据的查询**
- 查询经停某站点的所有路线
- 查询耗时最长及最短的路线
- 查询路线公里数最长及最短的路线
- 查询指定路线的所有经停站点
- 查询经停某站点,且剩余可载货容量为指定重量的车辆
- 查询指定司机的配送清单
- 查询指定车辆的司机联系方式
- 查询指定车辆的配送路线(要求能够处理配送路线涉及多条固定路线的情况)
**(六)基于各种基本数据的统计计算(报表)**
根据需要展示的数据内容设计表格表头、栏目、色块、数字、统计图等,并输出。
- 为每辆车生成当前设计的配送计划图,按站点序给出路线中各经停站点以及站点所卸载货物的编号
- 统计(求和)所有车辆当前配送路线(不是固定路线)的各项指标信息,包括总里程数、最长路线里程数、最短路线里程数、平均里程数、总耗时(假设所有车一起出发,从出发时间起到最后一辆车回来止的时间)、最短耗时、最长耗时、平均耗时、总载货量、最大载货量、最小载货量和平均载货量等(加分项:可自行设计指标,如评价当前配送路线效率的指标)
# 二 程序设计
系统的数据结构采用十字交叉链表,如下图所示:

# 三 程序实现
```c
# include <stdio.h>
# include <ListTool.h>
# include <stdlib.h>
# include <conio.h>
# include <windows.h>
# include <wincon.h>
# include <windef.h>
# include "shlobj.h"
# include <wingdi.h>
route * initData();
void printSomeSpace(int num);
void printSomeG(int num);
void printFronPage();
void printPowerBy();
void printRoutePage(route * routeHeadP);
void printSitePage(route *routeP, route * routeHeadP);
void printCarPage(site * siteP);
void quickQuery(route * routeHeadP);
void addRoute(route * routeHeadP);
car* addCar(car * carHeadP);
site* addSite(site * siteHeadP, char* routeIDIN, route * routeHeadP);
int changeSite(site * siteSpecific, int notFirst, site * siteHeadP);
int changeRoute(route * routeSpecial);
int changeCar(car * carSpecific);
void updateCarsFILE(car * carHeadP, char * fileName);
void updateRoutesFILE(route* routeHeadP);
void updateSitesFILE(site * siteHeadP);
char* noNfgets(char * Buffer, int MaxConut, FILE* Stream);
void changeOldRouteID(route * routeSpecific);
int changeSaveName(char* old, char* new);
void updateSitesCount(route * routeSpecific);
void initConsole();
void makeCsv(route * routeHeadP);
float totalTime(route *routeP);
float getMile(char *routeIDThis, route * routeHeadP);
float totalMile(route *routeP);
void updateAlld2S(site * siteP);
//主函数,同时展示主界面
int main() {
route* routeHeadP;
routeHeadP = initData();//初始化数据入链表
char *url = malloc(sizeof(char) * 20);//开辟空间待使用
int space = 60;
initConsole();
//主函数里包含了第一层信息展示
while (1) {
printFronPage();
int input1 = 0;
scanf("%d%*c", &input1);
if (input1 == 1) {
int isRoutePage = 1;
while (isRoutePage) {
printRoutePage(routeHeadP);//输出路线页的信息
int input2 = 0; scanf("%d%*c", &input2);
int seq = 0;
if (input2 == 1) {
printSomeSpace(space);printf("想详细查看第几条路线的站点信息:");
seq = 0; scanf("%d%*c", &seq);
route * routeSpecific = getRoutePointer(routeHeadP, seq - 1);
if (routeSpecific != NULL){
printSitePage(getRoutePointer(routeHeadP, seq - 1), routeHeadP);//进入该函数内部
} else {
printSomeSpace(space);printf("错误输入\n");
}
} else if (input2 == 2) {
printSomeSpace(space);printf("想修改第几条路线:");
seq = 0; scanf("%d%*c", &seq);
changeRoute(getRoutePointer(routeHeadP, seq-1));
updateRoutesFILE(routeHeadP);
MessageBox(NULL, TEXT("成功修改路线"), TEXT("操作成功"), MB_OK);
system("cls");
} else if (input2 == 3) {
printSomeSpace(space);printf("想删除第几条路线:");
seq = 0; scanf("%d%*c", &seq);
//删除对应的存档文件 TODO:深层筛选未重复站点删除
strcpy(url, "save/");
strcat(url, getRoutePointer(routeHeadP, seq - 1)->routeID);
strcat(url, ".txt");
remove(url);
//再更新路线合集存档
routeHeadP = DelRoutePos(routeHeadP, seq-1);
updateRoutesFILE(routeHeadP);
MessageBox(NULL, TEXT("成功删除路线"), TEXT("操作成功"), MB_OK);
system("cls");
} else if (input2 == 4) {
addRoute(routeHeadP);
updateRoutesFILE(routeHeadP);
MessageBox(NULL, TEXT("成功增添路线\n建议继续进入该路线详细信息界面添加站点信息"), TEXT("操作成功"), MB_OK);
system("cls");
} else if (input2 == 5) {
//快速查询命令
quickQuery(routeHeadP);
system("cls");
} else if (input2 == 6){
makeCsv(routeHeadP);//生成统计报表
system("cls");
} else if (input2 == 7){
isRoutePage = 0;
system("cls");
}
}
} else if (input1 == 2) {
printPowerBy();
continue;
} else {
system("cls");
printSomeSpace(space);printf("输入错误指令\n");
}
}
free(url);
return 0;
}
//快速查询实现逻辑
void quickQuery(route * routeHeadP){
route * routeP = routeHeadP;
system("cls");
printSomeSpace(60);system("date /T");
printSomeSpace(60);printf("-------------------快速查询----------------------\n");
printSomeSpace(60);printf("|\t1.查询指定司机的载货卸货情况\t\t|\n");
printSomeSpace(60);printf("|\t2.查询指定车辆的司机联系方式\t\t|\n");
printSomeSpace(60);printf("|\t3.查询指定车辆的配送路线\t\t|\n");
printSomeSpace(60);printf("|\t4.查询经停某站点的所有路线\t\t|\n");
printSomeSpace(60);printf("|\t5.查询耗时最长的路线\t\t\t|\n");
printSomeSpace(60);printf("|\t6.查询耗时最短的路线\t\t\t|\n");
printSomeSpace(60);printf("|\t7.查询公里数最长的路线\t\t\t|\n");
printSomeSpace(60);printf("|\t8.查询公里数最短的路线\t\t\t|\n");
printSomeSpace(60);printf("-------------------------------------------------\n");
int seq = 0;printSomeSpace(60);scanf("%d%*c",&seq);
char input[21];
float tempFloat = 0;
int isSuccessful = 0;
printf("\n");
printSomeSpace(60);
switch (seq){
case 1:
printf("请输入司机姓名:");
noNfgets(input, 20, stdin);
l4:while (routeP != NULL){
site* siteP = routeP->firstSite;
while (siteP != NULL){
car* carP = siteP->carHeadP;
while (carP