项目:用链表实现飞机订票系统

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <string.h>
#include<time.h>
#define HEAD1 "******************************************************************\n"
#define HEAD2 "|航班号|出发地|目的地|    起飞时间   |     到达时间     |  价格   |    折扣     |  剩余票数   |\n"
#define HEAD3 "|------|------|------|---------------|------------------|---------|-------------|--------------|\n"


#define FORMAT  "%4s%-14s%-14s%-14s%-19s%-16f%-8s%6d\n"
#define DATA pst->stData.acFlight,pst->stData.acOrigin,pst->stData.acDest,pst->stData.acTakeOffTime,pst->stData.acReverveTime,pst->stData.fPrice,pst->stData.acDiscount,pst->stData.iNum
struct AirPlane
{
	char acFlight[10];//航班号
	char acOrigin[10];//出发地
	char acDest[10];//目的地
	char acTakeOffTime[10];//起飞时间
	char acReverveTime[10];//降落时间
	float fPrice;//票价
	char acDiscount[4];//折扣
	int iNum;//剩余票数
};
struct Man
{
	char acName[20];//姓名
	char acID[20];//身份证号
	char acSex[10];//性别
	int iBookNum;//购票数量
	char acBookFlight[10];//订购航班号
};

//定义机票信息节点的结构体
struct PlaneNode
{
	struct AirPlane stData;//数据域
	struct PlaneNode* pstNext;//指针域
};
struct ManNode
{
	struct Man stData;//数据域
	struct ManNode* pstNext;//指针域
};
int iSave = 0;//作为数据是否改动的标志
int Init(struct PlaneNode* pstPlaneNodeHead, struct ManNode* pstManNodeHead)//整个系统只读取一次
{
	//第一步:先加载飞机机票信息
	FILE* pfPlane;//定义飞机机票信息文件指针
	struct PlaneNode* pstPlaneNodeTemp, * pstPlaneNodeCur;
	pstPlaneNodeCur = pstPlaneNodeHead;
	pstPlaneNodeTemp = NULL;

	pfPlane = fopen("plane.txt", "ab+");//打开以进行读取和追加,如果文件不存在则创建
	if (pfPlane == NULL)
	{
		printf("cant'topen plane.txt!\n");
		return -1;
	}
	else
	{
		//把文件数据读入链表中
		while (!feof(pfPlane))//只要没有到文件末尾  就一直读取
		{
			pstPlaneNodeTemp = (struct PlaneNode*)malloc(sizeof(struct PlaneNode));
			if (fread(pstPlaneNodeTemp, sizeof(struct PlaneNode), 1, pfPlane) == 1)//将文件数据读取到链表中
			{
				pstPlaneNodeTemp->pstNext = NULL;//尾巴置为空
				pstPlaneNodeCur->pstNext = pstPlaneNodeTemp;//链起来
				pstPlaneNodeCur = pstPlaneNodeTemp;//pstPlaneNodeCur向后走一步
			}
		}
		free(pstPlaneNodeTemp);
		fclose(pfPlane);
	}
	//第二步:加载订购人的信息
	FILE* pfMan;
	struct ManNode* pstManNodeTemp, * pstManNodeCur;
	pstManNodeCur = pstManNodeHead;
	pstManNodeTemp = NULL;
	pfMan = fopen("man.txt", "ab+");//打开以进行读取和追加,如果文件不存在则创建
	if (pfMan == NULL)
	{
		printf("cant'topen man.txt!\n");
		return -1;
	}
	else
	{
		//将文件读取到链表中
		while (!feof(pfMan))//只要没有到文件末尾  就一直读取
		{
			pstManNodeTemp = (struct ManNode*)malloc(sizeof(struct ManNode));
			if (fread(pstManNodeTemp, sizeof(struct ManNode), 1, pfMan) == 1)//将文件数据读取到链表中
			{
				pstManNodeTemp->pstNext = NULL;//尾巴置为空
				pstManNodeCur->pstNext = pstManNodeTemp;//链起来
				pstManNodeCur = pstManNodeTemp;//pstManNodeCur向后走一步
			}
		}
		free(pstManNodeTemp);
		fclose(pfMan);
	}
	return 0;
}
void Menu()
{
	puts("*******************************************************");
	puts("*                欢迎进入机票信息系统                 *");
	puts("---------------------------------------------------  --");
	puts("*                  选择以下操作(0-9)                *");
	puts("* 1.添加机票                       2.查询机票         *");
	puts("* 3.预定机票                       4.修改机票         *");
	puts("* 5.显示机票                       6.推荐机票         *");
	puts("* 7.退订机票                       8.显示
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的飞机订票系统链表实现C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Seat { int seatNumber; char* passengerName; struct Seat* next; } Seat; typedef struct Flight { char* flightNumber; int totalSeats; Seat* seatsList; } Flight; Flight* createFlight(char* flightNumber, int totalSeats) { Flight* newFlight = (Flight*) malloc(sizeof(Flight)); newFlight->flightNumber = (char*) malloc(strlen(flightNumber) + 1); strcpy(newFlight->flightNumber, flightNumber); newFlight->totalSeats = totalSeats; newFlight->seatsList = NULL; return newFlight; } void reserveSeat(Flight* flight, int seatNumber, char* passengerName) { if (seatNumber > flight->totalSeats) { printf("The seat number is invalid.\n"); return; } Seat* currentSeat = flight->seatsList; while (currentSeat != NULL) { if (currentSeat->seatNumber == seatNumber) { printf("The seat is already reserved.\n"); return; } currentSeat = currentSeat->next; } Seat* newSeat = (Seat*) malloc(sizeof(Seat)); newSeat->seatNumber = seatNumber; newSeat->passengerName = (char*) malloc(strlen(passengerName) + 1); strcpy(newSeat->passengerName, passengerName); newSeat->next = flight->seatsList; flight->seatsList = newSeat; printf("Seat %d is reserved for %s.\n", seatNumber, passengerName); } void printFlight(Flight* flight) { printf("Flight Number: %s\n", flight->flightNumber); printf("Total Seats: %d\n", flight->totalSeats); printf("Reserved Seats:\n"); Seat* currentSeat = flight->seatsList; while (currentSeat != NULL) { printf("%d: %s\n", currentSeat->seatNumber, currentSeat->passengerName); currentSeat = currentSeat->next; } } void deleteFlight(Flight* flight) { Seat* currentSeat = flight->seatsList; while (currentSeat != NULL) { Seat* nextSeat = currentSeat->next; free(currentSeat->passengerName); free(currentSeat); currentSeat = nextSeat; } free(flight->flightNumber); free(flight); } int main() { Flight* myFlight = createFlight("ABC123", 10); reserveSeat(myFlight, 1, "John"); reserveSeat(myFlight, 2, "Mary"); reserveSeat(myFlight, 1, "Tom"); printFlight(myFlight); deleteFlight(myFlight); return 0; } ``` 在这个代码中,`Seat` 结构体代表一个座位,包含座位号 `seatNumber` 和乘客姓名 `passengerName`,以及指向下一个座位的指针 `next`。 `Flight` 结构体代表一个航班,包含航班号 `flightNumber`、总座位数 `totalSeats`,以及指向已预订座位链表的指针 `seatsList`。 在 `createFlight` 函数中,我们为航班动态分配内存,并将航班号、总座位数和已预订座位链表初始化为 `NULL`。 在 `reserveSeat` 函数中,我们首先检查座位号是否有效,然后遍历已预订座位链表,检查该座位是否已被预订。如果该座位已被预订,则输出错误信息;否则,为该座位动态分配内存,并将该座位加入已预订座位链表中。 在 `printFlight` 函数中,我们输出航班信息,包括航班号、总座位数和已预订座位信息。 在 `deleteFlight` 函数中,我们释放已预订座位链表和航班所占用的内存。 在 `main` 函数中,我们创建一个航班对象,预订几个座位,输出航班信息,然后释放航班对象和相关内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值