#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
typedef struct user
{
char name[20] ;
char sex[10] ;
char phone_number[20] ;
char Id_card[20] ;
char line_num[10] ; //航班号
char start_time[10] ; //起飞时间
char end_time[10] ; //降落时间
char start_place[20] ; //起始地点
char end_place[20] ; //目的地
int seat_num ; //座位号
int count ;
struct user * next ;
} User ;
typedef struct airline
{
char line_num[10] ; //航班号
char start_place[20] ; //起飞地
char end_place[20] ; //目的地
char start_time[10] ; //起飞时间
char end_time[10] ; //降落时间
int total ; //座位总数
int left ; //剩余座位
int count;
struct airline * next ; //下一个结点
} Airline ;
int strip(char * s)
{
int b , k , m ;
m = strlen(s) ;
while(m > 0 && (s[m - 1] == 0x07 || s[m - 1] == 0x0a || s[m - 1] == 0x0d || s[m - 1] == 0x20)) {
s[m - 1] = 0x00 ;
m -- ;
}
if(m > 0) {
b = 0 ;
while(b < m && (s[b] == 0x07 || s[b] == 0x0a || s[b] == 0x0d || s[b] == 0x20)) b ++ ;
if(b > 0 && b < m) {
for(k = b ; k < m ; k ++) s[k - b] = s[k] ;
s[m - b] = 0x00 ;
m -= b ;
}
}
return m ;
}
Airline * find_airline(Airline * A , char * line_num)
{
Airline * x , * ret ;
ret = NULL ;
x = A ;
while(x) {
if(! strcmp(x -> line_num , line_num)) {
ret = x ;
break ;
}
x = x -> next ;
}
return ret ;
}
User * find_user(User * U , char * ID)
{
User * x , * ret ;
ret = NULL ;
x = U ;
while(x) {
if(! strcmp(x -> Id_card , ID)) {
ret = x ;
break ;
}
x = x -> next ;
}
return ret ;
}
//**利用尾插法进行数据输入**//
Airline * input_airline_information(Airline * A)
{
Airline * ax , * as ;
char line_num[10] , s[258] ;
printf("\n\t\t******** 现在开始录入航班信息 ********\n") ;
for(;;) {
printf("\t\t 请输入航班号:\t") ;
fflush(stdin) ;
fgets(s , 256 , stdin) ;
if(! strip(s)) {
break ;
} else {
strcpy(line_num , s) ;
if(A == NULL || find_airline(A , line_num) == NULL) {
if((as = (Airline *) malloc(sizeof(Airline))) != NULL){
printf("\t\t 请输入出发地:\t") ;
scanf("%s" , as -> start_place) ;
printf("\t\t 请输入目的地:\t") ;
scanf("%s" , as -> end_place) ;
printf("\t\t请输入起飞时间:\t") ;
scanf("%s" , as -> start_time) ;
printf("\t\t请输入降落时间:\t") ;
scanf("%s" , as -> end_time) ;
printf("\t\t请输入座位总数:\t") ;
scanf("%d" , & as -> total) ;
strcpy(as -> line_num , line_num) ;
as -> left = as -> total ;
as -> count = 0 ;
as -> next = NULL ;
if(A == NULL) {
A = as ;
} else {
ax = A ;
while(ax -> next) ax = ax -> next ;
ax -> next = as ;
}
printf("\n\t\t航班信息录入成功\n\n") ;
} else {
fprintf(stderr , "\n\t\t分配内存失败!\n\n") ;
break ;
}
} else {
fprintf(stderr , "\n\t\t该航班已经存在\n\n") ;
}
}
}
return A ;
}
User * input_user_information(Airline * A , User * U)
{
User * us , * ux ;
Airline * ax ;
char line_num[10] , Id_card[20] , s[258] ;
bool f ;
if(A != NULL) {
printf("\n\t\t******** 现在开始录入乘客信息 ********\n") ;
for(;;) {
printf("\t\t请输入航班号:\t") ;
fflush(stdin) ;
fgets(s , 256 , stdin) ;
if(! strip(s)) {
break ;
} else {
strcpy(line_num , s) ;
if((ax = find_airline(A , line_num)) != NULL) {
if (ax -> left > 0) {
f = true ;
for(;;) {
printf("\t\t请您输入乘客身份证号:\t") ;
fflush(stdin) ;
fgets(s , 256 , stdin) ;
if(! strip(s)) {
f = false ;
break ;
} else {
strcpy(Id_card , s) ;
if(U == NULL || find_user(U , Id_card) == NULL) break ;
else fprintf(stderr , "\t\t\n您输入的身份证号与他人重复,请重新输入。\n\n") ;
}
}
if(! f) break ;
if((us = (User *) malloc(sizeof(User))) != NULL) {
printf("\t\t 请输入乘客姓名:\t") ;
scanf("%s" , us -> name) ;
printf("\t\t 请输入乘客性别:\t") ;
scanf("%s" , us -> sex) ;
printf("\t\t请您输入乘客电话号码:\t") ;
scanf("%s" , us -> phone_number) ;
strcpy(us -> line_num , line_num) ;
strcpy(us -> Id_card , Id_card) ;
strcpy(us -> start_time , ax -> start_time) ;
strcpy(us -> end_time , ax -> end_time) ;
strcpy(us -> start_place , ax -> start_place) ;
strcpy(us -> end_place , ax -> end_place) ;
us -> seat_num = ax -> total - ax -> left + 1 ;
us -> count = 1 ;
us -> next = NULL ;
if(U == NULL) {
U = us ;
} else {
ux = U ;
while(ux -> next) ux = ux -> next ;
ux -> next = us ;
}
ax -> left -- ;
ax -> count ++ ;
printf("\n\t\t订票成功!祝你旅途愉快\n\n") ;
} else {
fprintf(stderr , "\n\t\t分配内存失败!:\n\n") ;
break ;
}
} else {
fprintf(stderr , "\n\t\t对不起您所找的航班剩余空位为零\n\t\t请选择其他的航班,谢谢合作\n\n") ;
}
} else {
fprintf(stderr , "\n\t\t未找到该航班\n\n") ;
}
}
}
} else {
fprintf(stderr , "\t\t航班信息为空链表\n") ;
}
return U ;
}
//*输出乘客信息到屏幕上**//
void display_user_information(User * L)
{
User * r ;
r = L ; //把第一个节点赋值给r
printf("\n\t\t******** 现在开始显示乘客信息 ********\n") ;
if(r == NULL) {
printf("\t\t当前并没有乘客信息\n") ;
} else {
while(r) {
printf("\t\t*************************************************************\n") ;
printf("\t\t******** 姓名 *** [%s]\n" , r -> name) ;
printf("\t\t******** 性别 *** [%s]\n" , r -> sex) ;
printf("\t\t******** 身份证号 *** [%s]\n" , r -> Id_card) ;
printf("\t\t******** 电话号码 *** [%s]\n" , r -> phone_number) ;
printf("\t\t******** 航班号 *** [%s]\n" , r -> line_num) ;
printf("\t\t******** 出发地 *** [%s]\n" , r -> start_place) ;
printf("\t\t******** 目的地 *** [%s]\n" , r -> end_place) ;
printf("\t\t******** 起飞时间 *** [%s]\n" , r -> start_time) ;
printf("\t\t******** 降落时间 *** [%s]\n" , r -> end_time) ;
printf("\t\t******** 座位号 *** [%d]\n" , r -> seat_num) ;
printf("\t\t*************************************************************\n") ;
printf("\n") ;
r = r -> next ;
}
}
}
main(void)
{
Airline * A ;
User * U ;
A = NULL ;
U = NULL ;
A = input_airline_information(A) ;
U = input_user_information(A , U) ;
display_user_information(U) ;
}