要求
1.实现以下按键功能
5.下面是我的Tick火车票模块的源代码我这个只能实现显示输出最后一次输入的火车票信息,大家帮我看一下,怎么改实现显示每一次输入的火车票都可以显示。
Tick.cpp文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "man.h"
#include "tick.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 = NULL;
int ret = 0;
if (size == sizeof(ticket))
fopen_s(&fp, "ticket.txt", "wb"); //打开一个只写的二进制文本
else if (size == sizeof(man))
fopen_s(&fp, "man.txt", "wb"); //打开一个只写的二进制文本
if (!fp)
{
printf("fopen error!\n");
return -1;
}
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, 1, fp); //将结构体数据写入二进制文本
if (ret != 1)
{
printf("fwrite error!\n");
return -1;
}
}
fclose(fp);
printf("fwrite success!\n");
return 0;
}
//读取文本中的数据到链表中
int readData(node* head, int size)
{
FILE* fp = NULL;
if (size == sizeof(ticket))
fopen_s(&fp, "ticket.txt", "rb"); //打开一个只读的二进制文本
else if (size == sizeof(man))
fopen_s(&fp, "man.txt", "rb"); //打开一个只读的二进制文本
if (!fp)
{
printf("fopen error!\n");
return -1;
}
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, 1, fp) == 1) //读取二进制文本的结构体数据
{
insertData_toListTail(head, temp); //插入数据到链表尾节点后
}
}
fclose(fp);
printf("fread success!\n");
return 0;
}
/**********************************
List.cpp源文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "tick.h"
#include "man.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;
struct node* cur = head; //定义当前节点
while (cur->next=NULL) //找到尾节点 [若链表只有一个头节点,则头节点就是尾节点]
{
node*cur =(node*)cur->next;
}
//将保存要插入数据的临时节点,插入到尾节点后
cur->next = tmpNode;
tmpNode->next = NULL; //此时,tmpNode 变为尾节点
saveData(g_ticketList, sizeof(ticket));
return 0;
}
6.还有一个问题就是怎么实现在用户模式中,用户购票时,根据目的地进行查找时,可以显示所有是这个目的地的车票信息。以下是我的订票这块的代码,想看看怎么更改可以实现。
//订票函数
int bookTicket(node* head)
{
bool findTicket_flag = false; //找到车次对应火车票的标志位
if (!g_ticketList->next) //检测火车票信息链表是否只有一个节点
{
printf("g_ticketList only have one node,error!\n"); //链表只有一个节点,则打印错误信息,并返回
return -1;
}
char t_reachCity[10];
printf("请输入你要去的城市:");
scanf_s("%s", t_reachCity, 10);
ticket* tmpTicket = NULL;
node* cur;
for (cur = head->next; cur != NULL; cur = cur->next)
{
tmpTicket = (ticket*)cur->dat; //获取火车票信息链表节点保存的数据
if (strcmp(t_reachCity, tmpTicket->reachCity) == 0 ) //检查输入城市对应的火车票是否存在,````始发,终点
{
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 -1;
}
char cmd;
printf("Do you want book ticket?(y/n): ");
getchar(); //吸收上次输入的"ENTER"
scanf_s("%c", &cmd, 10);
if (cmd == 'y')
{
;
}
else if (cmd == 'n')
{
return -1;
}
else
{
printf("cmd error!\n");
return -1;
}
man* tmpMan = (man*)mallocMemory(sizeof(man)); //定义一个临时订票人结构体指针,并分配内存空间
printf("请输入你的 ID:");
scanf_s("%d", &tmpMan->ID);
printf("请输入你的姓名:");
scanf_s("%s", tmpMan->name, 10);
printf("请输入你的订票数目:");
scanf_s("%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 -1;
}
7.还有个问题,就是那个Tick.cpp里面有个将链表信息保存到txt文本中,那个文本是自己创建的吗,可以自己先输入火车票信息在文本中还是只能在代码中运行后自己输入火车票信息通过程序保存进去,这个也是根据teacher提供的base代码实现的,自己也不太明白,希望指点一下!
【以下回答由 GPT 生成】
问题标签: C语言
问题内容:
要求:
实现以下按键功能(具体功能未提供)
要建立的文件(缺少文件描述)
要使用的函数以及结构体变量的定义,可自行增加函数或者结构体及变量(缺少具体定义)
结果图,要实现增加的火车票全部显示出来(目前只能显示每一次输入的火车票,需要修改)
全局变量(缺少全局变量定义)
(缺少代码)
请帮我优化以上问题,添加必要的描述和提示,以便ChatGPT更好地理解我的问题。
我想根据链表的数据结构来实现一个火车票订票系统,但目前存在一些问题。以下是问题的要求和现状:
要求:
我需要优化以上问题并提供必要的描述和提示,以便更好地理解我的问题。
请问有哪些实际需要解决的问题?你期望得到什么样的帮助?