list.h

#ifndef __LIST_H__
#define __LIST_H__ #include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> //定义单向链表节点
typedef struct _node
{
void *dat; //一般为结构体指针
int size; //dat指向区域的大小,一般为结构体的大小
struct _node *next; //后继节点
}node; //创建链表
extern node *createList(int size);
//插入数据到链表尾节点后
extern int insertData_toListTail(node *head,void *dat); #endif

list.cpp

#include "stdafx.h"
#include "list.h" /*************************************链表模块***************************************************/
//创建链表
node *createList(int size)
{
node *head = (node *)malloc(sizeof(node)); //给链表头结点分配内存空间
if(!head)
{
printf("listHead malloc error!\n");
return NULL;
} head->dat = NULL; //链表头结点不存储数据,故指向NULL
head->size = size; //链表的size一般为结构体的大小[size == sizeof(ticket)]
head->next = NULL; return head;
} //插入数据到链表尾节点后
int insertData_toListTail(node *head,void *dat)
{
node *tmpNode = (node *)malloc(sizeof(node)); //定义一个存储插入数据的临时节点,插入该节点就相当于插入数据了
if(!tmpNode)
{
printf("tmpNode malloc error!\n");
return NULL;
} //给临时节点的数据指针dat分配内存空间
tmpNode->dat = malloc(sizeof(head->size)); //dat的类型一般为struct *,所以不再进行(void *)的强制类型转换
if (!tmpNode->dat)
{
printf("tmpNode->dat malloc error!\n");
return NULL;
}
tmpNode->dat = dat; //将要插入的数据保存在临时节点内
tmpNode->size = head->size; node *cur = head; //定义当前节点
while(cur->next) //找到尾节点 [若链表只有一个头节点,则头节点就是尾节点]
{
cur = cur->next;
} //将保存要插入数据的临时节点,插入到尾节点后
cur->next = tmpNode;
tmpNode->next = NULL; //此时,tmpNode变为尾节点 return ;
}

ticket.h

#ifndef __TICKET_H__
#define __TICKET_H__ //定义火车票信息结构体
typedef struct _ticket
{
char number[]; //火车票的车次
char startCity[]; //火车票的出发城市
char reachCity[]; //火车票的到达城市
char takeoffTime[]; //火车票的出发时间
char reachTime[]; //火车票的到达时间
float price; //火车票的票价
int ticketNum; //火车票的剩余票数
}ticket; /*************************************预编译模块***************************************************/
#define HEADER1 "|------------------------------book ticket sys--------------------------------|\n"
#define HEADER2 "| number |start city|reach city|takeoffTime|reach time| price |ticketNum |\n"
#define HEADER3 "|-----------------------------------------------------------------------------|\n"
#define FORMAT "|%-10s|%-10s|%-10s|%-11s|%-10s|%-10.2f|%-10d|\n" //除了takeoffTime这一项,为保持上下对齐的美观,其它项数据都固定只占10位的长度 extern node *g_ticketList; //分配内存空间函数
extern void *mallocMemory(int size);
//保存链表中的数据到文件中
extern int saveData(node *head,int size);
//读取文本中的数据到链表中
extern int readData(node *head,int size);
//添加火车票,并保存在火车票信息链表中
extern int addTicket_toList(node *head);
//根据车次,修改火车票,并马上保存在火车票信息链表中
extern int modifyTicket_byNumber(node *head);
//根据车次,删除火车票,并实时更新
extern int deleteTicket_byNumber(node *head);
//显示火车票信息链表中的所有节点数据
extern int showTicketList_allData(node *head); #endif

ticket.cpp

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "man.h"
#include "ticket.h" node *g_ticketList = NULL; //分配内存空间函数
void *mallocMemory(int size)
{
if (size == sizeof(ticket))
{
ticket *tmpTicket = (ticket *)malloc(size);
return tmpTicket;
}
else if (size == sizeof(man))
{
man *tmpMan = (man *)malloc(size);
return tmpMan;
}
else
{
printf("error!\n");
return NULL;
}
} //保存链表中的数据到文件中
int saveData(node *head,int size)
{
FILE *fp;
int ret = ; if( size == sizeof(ticket) )
fp = fopen("ticket.txt","wb"); //打开一个只写的二进制文本
else if( size == sizeof(man) )
fp = fopen("man.txt","wb"); //打开一个只写的二进制文本
if(!fp)
{
printf("fopen error!\n");
return -;
} void *temp = NULL;
for(node *cur=head->next;cur!=NULL;cur=cur->next)
{
if( size == sizeof(ticket) )
temp = (ticket *)cur->dat; //获取链表节点保存的数据
else if( size == sizeof(man) )
temp = (man *)cur->dat; //获取链表节点保存的数据 ret = fwrite(temp,size,,fp); //将结构体数据写入二进制文本
if(ret != )
{
printf("fwrite error!\n");
return -;
}
} fclose(fp);
printf("fwrite success!\n"); return ;
} //读取文本中的数据到链表中
int readData(node *head,int size)
{
FILE *fp; if( size == sizeof(ticket) )
fp = fopen("ticket.txt","rb"); //打开一个只读的二进制文本
else if( size == sizeof(man) )
fp = fopen("man.txt","rb"); //打开一个只读的二进制文本
if(!fp)
{
printf("fopen error!\n");
return -;
} void *temp = NULL;
while(!feof(fp))
{
if( size == sizeof(ticket) )
temp = (ticket *)mallocMemory(sizeof(ticket)); //定义一个临时火车票结构体指针(必须定义在while内,每次读文件,都必须重新分配内存空间)
else if( size == sizeof(man) )
temp = (man *)mallocMemory(sizeof(man)); //定义一个临时订票人结构体指针(必须定义在while内,每次读文件,都必须重新分配内存空间) if( fread(temp,size,,fp) == ) //读取二进制文本的结构体数据
{
insertData_toListTail(head,temp); //插入数据到链表尾节点后
}
} fclose(fp);
printf("fread success!\n"); return ;
} /*************************************火车票模块***************************************************/
//添加火车票,并保存在火车票信息链表中
int addTicket_toList(node *head)
{
ticket *tmpTicket = (ticket *)mallocMemory(sizeof(ticket)); //定义火车票信息的临时结构体指针,并分配内存空间 printf("请输入火车票的车次:");
scanf("%s",tmpTicket->number);
printf("请输入火车票的出发城市:");
scanf("%s",tmpTicket->startCity);
printf("请输入火车票的到达城市:");
scanf("%s",tmpTicket->reachCity);
printf("请输入火车票的出发时间:");
scanf("%s",tmpTicket->takeoffTime);
printf("请输入火车票的到达时间:");
scanf("%s",tmpTicket->reachTime);
printf("请输入火车票的票价:");
scanf("%f",&tmpTicket->price);
printf("请输入火车票的剩余票数:");
scanf("%d",&tmpTicket->ticketNum); printf("add ticket success!\n");
insertData_toListTail(head,tmpTicket); //插入火车票信息数据,到火车票信息链表尾节点后
saveData(g_ticketList,sizeof(ticket)); //保存火车票链表中的信息到文件中 return ;
} //根据车次,修改火车票,并马上保存在火车票信息链表中
int modifyTicket_byNumber(node *head)
{
bool findTicket_flag = false; //找到车次对应火车票的标志位 if(!head->next) //检测链表是否只有一个节点
{
printf("list only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -;
} char t_number[];
printf("请输入要修改的火车票车次:");
scanf("%s",t_number); ticket *tmpTicket = NULL;
for (node *cur=head->next;cur!=NULL;cur=cur->next)
{
tmpTicket = (ticket *)cur->dat; //获取火车票信息链表节点保存的数据
if ( strcmp(t_number,tmpTicket->number) == ) //检查输入车次对应的火车票是否存在
{
findTicket_flag = true; printf("请重新输入火车票的车次:");
scanf("%s",tmpTicket->number);
printf("请重新输入火车票的出发城市:");
scanf("%s",tmpTicket->startCity);
printf("请重新输入火车票的到达城市:");
scanf("%s",tmpTicket->reachCity);
printf("请重新输入火车票的出发时间:");
scanf("%s",tmpTicket->takeoffTime);
printf("请重新输入火车票的到达时间:");
scanf("%s",tmpTicket->reachTime);
printf("请重新输入火车票的票价:");
scanf("%f",&tmpTicket->price);
printf("请重新输入火车票的剩余票数:");
scanf("%d",&tmpTicket->ticketNum);
cur->dat = tmpTicket; //将修改后的火车票数据保存在原节点内 printf("modify ticket success!\n");
saveData(g_ticketList,sizeof(ticket)); //保存火车票链表中的信息到文件中 break;
}
} if(!findTicket_flag)
{
printf("the number isn't exist!\n");
return -;
} return ;
} //根据车次,删除火车票,并实时更新
int deleteTicket_byNumber(node *head)
{
bool findTicket_flag = false; //找到车次对应火车票的标志位 if(!head->next) //检测链表是否只有一个节点
{
printf("list only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -;
} char t_number[];
printf("请输入要删除的火车票车次:");
scanf("%s",t_number); ticket *tmpTicket = NULL;
for (node *lastNode=head;lastNode->next!=NULL;lastNode=lastNode->next)
{
tmpTicket = (ticket *)lastNode->next->dat; //获取火车票信息链表节点保存的数据
if ( strcmp(t_number,tmpTicket->number) == ) //检查输入车次对应的火车票是否存在
{
findTicket_flag = true; node *deleteNode = lastNode->next; //“要删除节点”deleteNode,为“上个节点”lastNode的next节点
lastNode->next = deleteNode->next; //“上个节点”的next指向“要删除节点”的next,则相当于删除了“要删除节点”
free(deleteNode->dat);
free(deleteNode); //后面要用到deleteNode,所以不能释放,否则会崩溃 printf("delete ticket success!\n");
saveData(g_ticketList,sizeof(ticket)); //保存火车票链表中的信息到文件中 break;
}
} if(!findTicket_flag)
{
printf("the number isn't exist!\n");
return -;
} return ;
} //显示火车票信息链表中的所有节点数据
int showTicketList_allData(node *head)
{
if(!head->next) //检测链表是否只有一个节点
{
printf("list only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -;
} ticket *tmpTicket = NULL; //定义火车票信息的临时结构体指针
printf(HEADER1); //打印输出头信息
printf(HEADER2);
printf(HEADER3);
for(node *cur=head->next;cur!=NULL;cur=cur->next) //由于头节点不保存数据,所以从第二个节点开始显示数据
{
tmpTicket = (ticket *)cur->dat; //将节点数据取出来,赋给临时结构体指针
printf(FORMAT,tmpTicket->number,tmpTicket->startCity,tmpTicket->reachCity,tmpTicket->takeoffTime,tmpTicket->reachTime,tmpTicket->price,tmpTicket->ticketNum);
} return ;
}

man.h

#ifndef __MAN_H__
#define __MAN_H__ //定义订票人结构体
typedef struct _man
{
int ID; //ID身份证号码
char name[]; //名字
int bookNum; //订票数目
}man; extern node *g_manList; //外部声明一个全局订票人信息链表 //显示订票人信息链表中的所有节点数据
extern int showManList_allData(node *head);
//订票函数
extern int bookTicket(node *head); #endif

man.cpp

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "ticket.h"
#include "man.h" node *g_manList = NULL; //定义一个全局订票人信息链表 //显示订票人信息链表中的所有节点数据
int showManList_allData(node *head)
{
if(!head->next) //检测链表是否只有一个节点
{
printf("list only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -;
} man *tmpMan = NULL; //定义订票人信息的临时结构体指针
for(node *cur=head->next;cur!=NULL;cur=cur->next) //由于头节点不保存数据,所以从第二个节点开始显示数据
{
tmpMan = (man *)cur->dat; //将节点数据取出来,赋给临时结构体指针
printf("%d %s %d\n",tmpMan->ID,tmpMan->name,tmpMan->bookNum);
} return ;
} //订票函数
int bookTicket(node *head)
{
bool findTicket_flag = false; //找到车次对应火车票的标志位 if(!g_ticketList->next) //检测火车票信息链表是否只有一个节点
{
printf("g_ticketList only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -;
} char t_reachCity[];
printf("请输入你要去的城市:");
scanf("%s",t_reachCity); ticket *tmpTicket = NULL;
node *cur;
for (cur=head->next;cur!=NULL;cur=cur->next)
{
tmpTicket = (ticket *)cur->dat; //获取火车票信息链表节点保存的数据
if ( strcmp(t_reachCity,tmpTicket->reachCity) == ) //检查输入城市对应的火车票是否存在
{
findTicket_flag = true; printf(FORMAT,tmpTicket->number,tmpTicket->startCity,tmpTicket->reachCity,tmpTicket->takeoffTime,tmpTicket->reachTime,tmpTicket->price,tmpTicket->ticketNum);
break;
}
} if(!findTicket_flag)
{
printf("the number isn't exist!\n");
return -;
} char cmd;
printf("Do you want book ticket?(y/n): ");
getchar(); //吸收上次输入的"ENTER"
scanf("%c",&cmd);
if (cmd == 'y')
{
;
}
else if (cmd == 'n')
{
return -;
}
else
{
printf("cmd error!\n");
return -;
} man *tmpMan = (man *)mallocMemory(sizeof(man)); //定义一个临时订票人结构体指针,并分配内存空间
printf("请输入你的ID:");
scanf("%d",&tmpMan->ID);
printf("请输入你的姓名:");
scanf("%s",tmpMan->name);
printf("请输入你的订票数目:");
scanf("%d",&tmpMan->bookNum); //更新该车次火车票的剩余票数
tmpTicket->ticketNum -= tmpMan->bookNum;
cur->dat = tmpTicket; insertData_toListTail(g_manList,tmpMan); //插入订票人数据到链表尾节点后 printf("book ticket success!\n");
saveData(g_manList,sizeof(man)); return -;
}

bookTicketSys.cpp (包含主函数)

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "man.h"
#include "ticket.h" void menu()
{
printf("1. add ticket \n");
printf("2. modify ticket \n");
printf("3. delete ticket \n");
printf("4. book ticket \n");
printf("5. show ticket \n");
printf("6. show man \n");
printf("7. save \n");
} int _tmain(int argc, _TCHAR* argv[])
{
int sel = ; g_ticketList = createList(sizeof(ticket)); //创建火车票信息链表
g_manList = createList(sizeof(man)); //创建火车票信息链表
readData(g_ticketList,sizeof(ticket)); //读取火车票文件
readData(g_manList,sizeof(man)); //读取订票人文件 do
{
menu(); //显示菜单选项
printf("请输入你的选项:");
scanf("%d",&sel); switch(sel)
{
case :
{
addTicket_toList(g_ticketList); //添加火车票信息,到火车票链表中
}
break; case :
{
modifyTicket_byNumber(g_ticketList); //根据车次,修改火车票,并马上保存在火车票信息链表中
}
break; case :
{
deleteTicket_byNumber(g_ticketList); //根据车次,删除火车票,并实时更新
}
break; case :
{
bookTicket(g_ticketList); //订票
}
break; case :
{
showTicketList_allData(g_ticketList); //显示火车票信息链表中的所有节点数据
}
break; case :
{
showManList_allData(g_manList); //显示订票人信息链表中的所有节点数据
}
break; case :
{
saveData(g_ticketList,sizeof(ticket)); //保存火车票链表中的信息到文件中
}
break;
}
system("PAUSE"); //暂停
system("CLS"); //清屏
} while (sel!=); return ;
}

显示火车票信息_示意图:

C语言小项目-火车票订票系统的更多相关文章

  1. C语言课程设计——电影院订票系统

    1. 课题简介 大家都爱看电影,现请参考一个熟悉电影票预订系统,实现C语言版的订票系统.了解订票如何实现的.系统主要有2类用户:管理员用户和顾客用户. 管理员用户登录系统后,实现电影放映厅信息管理和电 ...

  2. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  3. windows API 开发飞机订票系统 图形化界面 (四)

    接下来的是录入航班.修改航班信息功能的实现: //录入航班 BOOL EntryFlight(HWND hEntryDlg){ TCHAR szDiscount[]; TCHAR szFare[],s ...

  4. 课程设计之(struts2+Hibernate)航空订票系统

    1.题目 课程设计之航空订票系统 为某家机票预订服务商开发一个机票预订和查询管理系统.该系统中的航班和机票信息由多家航空公司负责提供.客户通过上网方式查询航班时间表.机票可用信息.机票折扣信息,可以远 ...

  5. LoadRunner 自带订票系统flights 功能空白、1080端口被占用的解决办法

    LoadRunner 自带订票系统flights 功能空白.1080端口被占用的解决办法 安装LoadRunner8.1后运行Mercury Web Tours Application,点击fligh ...

  6. 【性能测试】Loadrunner12.55(二)-飞机订票系统-脚本录制

    1.1 飞机订票系统 Loadrunner 12.55不会自动安装飞机订票系统,要自己手动安装. 我们需要下载Web Tools以及一个小插件strawberry https://marketplac ...

  7. web类协议脚本-飞机订票系统示例

    以下是LR自带的飞机订票系统的Demo,希望能帮助大家. Action() { int iRand; int iTmp; char *strTmpA; char *strTmpB; char *str ...

  8. loadrunner飞机订票系统从登陆订票退票登出的脚本实现代码调试通过

    在LR自带的飞机订票系统中,完整模拟一个用户从登陆->订票->退票->登出这样一个业务流程,分解每个事务为一个Action: 进入首页->登陆->进入订票页面->选 ...

  9. loadrunner笔记(二):飞机订票系统--客户信息注册

    (一)  几个重要概念说明 集合点:同步虚拟用户,以便同一时间执行任务. 事务:事务是指服务器响应用户请求所用的时间,当然它可以衡量某个操作,如登录所需要的时间,也可以衡量一系列的操作所用的时间,如从 ...

随机推荐

  1. hunnu - 11545 小明的烦恼——找路径 (最大流)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11545 只是要求不经过相同的边,那么每次找出一条增广路T-- ...

  2. MSDN 同步部分 个人笔记

    (在知乎看到轮子哥说,掌握了MSDN上的并发部分 和 线程与进程部分就可以掌握所有语言的多线程编程,我在网上翻了一下并没有中文版,所以决定自己翻译一下...) 目录: 线程之间协同运行的方式有许多种, ...

  3. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  4. POJ 1182_食物链

    题意: 三种动物A,B,C,A吃B,B吃C,C吃A, 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是" ...

  5. 使用idea编译spring-framework5.0源码

    自从迈入java开发这个行当,从来没有好好的研究过源码,深感惭愧,话不多说,今天上一篇使用idea编译spring5.0源码. 以下在win中构建和编译过程分为 jdk环境的配置 gradle的下载和 ...

  6. 笔记:Javac编译器

    Javac编译器是把 *.java 文件转换为 *.class 文件,是一个前端编译器:对应着有一种把字节码转变为机器码的编译器,称为JIT编译器(Just In Time Compiler),比如 ...

  7. 洛谷 P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  8. Android GIS开发系列-- 入门季(12) 显示载天地图

    在项目中可以经常需要动态加载一些图层,像投影地图服务.投影地图服务器.其实网上有大量这样的服务,比如天地图官网, . 随便点开一个服务,里面有相关的信息.那如何加载这样图层服务呢. 一.首先感谢这篇博 ...

  9. Django学习系列之Form验证

    django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...

  10. andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

    近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足 ...