求大神帮帮忙,这个程序哪儿有问题啊,为什么编译完运行后“录入信息时出现的是这种情况呢”,知道的麻烦帮帮忙吧,谢谢了!!
程序代码:
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> //#include <windows.h> struct Room ; struct Customer ; typedef struct Room * Proom; typedef struct Customer * Pcustomer; struct Room { int RoomNumber;//房号 int RoomType;//房型 int Price;//单价(每床) int Number; //已住人数 Proom next; }; struct Customer { char name[10],ID[19]; //顾客姓名,顾客身份证号 char native[5];//籍贯 char sex[5];//性别 int age;//年龄 int state;//房型 int room_number;//房号 int check_in_date;//入住日期 int departure_date ;//退房日期 Pcustomer next; }; Proom head_room = NULL; Pcustomer head_customer = NULL; Proom r_room = NULL; //房间链表尾指针 Pcustomer r_customer = NULL;//顾客链表尾指针 Proom update_room_add(int room_num); bool read_room() //读取room文件来创建链表 { FILE *filep; if((filep = fopen("d://Room.txt","a+")) == NULL) { printf("文件打开失败!"); getch(); return 0; } Proom temp_node = NULL; temp_node = (Proom)malloc(sizeof(struct Room)); temp_node->next = NULL; head_room = r_room = temp_node; while(true) { if(feof(filep)||fread(temp_node,sizeof(struct Room),1,filep)!=1) { free(temp_node); if (temp_node == head_room) head_room = r_room = NULL; else r_room->next = NULL; break; } r_room->next = temp_node; r_room = r_room->next; temp_node = (Proom)malloc(sizeof(struct Room)); temp_node->next = NULL; } return 1; } bool write_room() //保存room链表(即房间信息)到room文件 { FILE *filep; if((filep = fopen("d://Room.txt","w+")) == NULL) { printf("文件打开失败!"); getch(); return 0; } Proom temp_node = head_room; while( temp_node != NULL ) { fwrite(temp_node,sizeof(struct Room),1,filep); temp_node = temp_node->next; } fclose(filep); return 1; } bool read_customer()//读取customer文件来创建customer链表 { FILE *fileq; if((fileq = fopen("d://Customer.txt","a+")) == NULL) { printf("文件打开失败!"); getch(); return 0; } Pcustomer temp_node = (Pcustomer)malloc(sizeof(struct Customer)); head_customer = r_customer = temp_node; while(true) { if(feof(fileq)||fread(temp_node,sizeof(struct Customer),1,fileq)!=1) { free(temp_node); if (temp_node == head_customer) head_customer = r_customer = NULL; else r_customer->next = NULL; break; } r_customer->next = temp_node; r_customer = r_customer->next; temp_node = (Pcustomer)malloc(sizeof(struct Customer)); temp_node->next = NULL; } fclose(fileq); return 1; } bool write_customer()//保存customer链表信息到customer文件 { FILE *filep; if((filep = fopen("d://Customer.txt","w+")) == NULL) { printf("文件打开失败!"); getch(); return 0; } Pcustomer temp_node = head_customer; while( temp_node != NULL ) { fwrite(temp_node,sizeof(struct Customer),1,filep); temp_node = temp_node->next; } fclose(filep); return 1; } int insert_post_link_room () //插入房间 { Proom temp_node = (Proom)malloc(sizeof(struct Room)); if (temp_node == NULL) { printf( "out of space!!!\n"); return 0; } printf("请输入房间号\n"); scanf("%d", &temp_node->RoomNumber); printf("请输入房型:1<标准间>,2<双人间>,3<总统房>\n"); scanf("%d", &temp_node->RoomType); printf("请输入价格\n"); scanf("%d", &temp_node->Price); printf("请输入已住人数\n"); scanf("%d", &temp_node->Number); temp_node->next=NULL; if (head_room == NULL) { head_room = r_room = temp_node; } else { r_room->next= temp_node; r_room = temp_node; } return 0; } int insert_post_link_customer ()//顾客信息插入 { Pcustomer temp_node = (Pcustomer)malloc(sizeof(struct Customer)); if (temp_node == NULL) { printf( "out of space!!!\n"); return 0; } printf("请输入姓名\n"); scanf("%s", temp_node->name); printf("请输入籍贯\n"); scanf("%s", &temp_node->native); printf("请输入年龄\n"); scanf("%d", &temp_node->age); printf("请输入身份证号码\n"); scanf("%s", temp_node->ID); printf("请输入性别\n"); scanf("%s", temp_node->sex); printf("请输入房号\n"); scanf("%d", &temp_node->room_number); printf("请选择房型:1<标准间>,2<双人间>,3<总统房>\n"); scanf("%d", &temp_node->state); printf("请输入入住日期(输入八位数,如20170703)\n"); scanf("%d", &temp_node->check_in_date); printf("请输入退房日期(输入八位数,如20170704)\n"); scanf("%d", &temp_node->departure_date); temp_node->next =NULL; if (head_customer == NULL) { head_customer = r_customer = temp_node; } else { r_customer->next = temp_node; r_customer = temp_node; } update_room_add(r_customer->room_number); return 1; } int is_null_list_room(Proom list) { return (list->next == NULL); } int is_null_list_customer(Pcustomer list) { return (list->next == NULL); } Proom check_room_number(int room_number )//按房号查询出保存房间信息节点 { Proom p = head_room; while ( p != NULL && p->RoomNumber != room_number) p = p->next; return p; } Pcustomer check_customer_name(char name[10] )//按房客姓名查询顾客信息节点 { Pcustomer q = head_customer; while (q!=NULL&&0!=strcmp(q->name,name)) q=q->next; return q; } void printf_room( Proom room)//打印单个房间信息 { printf( "%d %d %d %d\n", room->RoomNumber,room->RoomType,room->Price,room->Number); } void printf_all_room()//打印房间信息 { printf( "房号 房型 单价 已住人数\n"); Proom room = head_room; while ( room != NULL ) { printf_room(room); room = room->next; } } void printf_customer( Pcustomer customer)//打印单个顾客信息 { printf( "%s %s %s %d %d %s %d %d %d\n", customer->name,customer->native,customer->sex,customer->age,customer->state,customer->ID, customer->room_number,customer->check_in_date,customer->departure_date); } void printf_all_customer()//打印全部顾客信息 { printf( "姓名 性别 籍贯 年龄 房型 身份证号 房号 入住日期 离开日期\n"); Pcustomer customer = head_customer; while ( customer != NULL ) { printf_customer(customer); customer = customer->next; } } int check_empty_room() //查询空房 { Proom p = head_room; int num_empty_room = 0; printf( "房号 房型 价格 已住人数 \n"); while ( p != NULL ) { if ( p->Number == 0 ) { printf_room(p); num_empty_room++; } p = p->next; } return num_empty_room; } int sum_empty_room()//空房间总数 { printf("共有空房间%d\n",check_empty_room()); return 0; } Proom update_room_less(int room_num) //更新房间信息(离店人数减少) { Proom p = check_room_number(room_num); p->Number = p->Number - 1; return 0; } Proom update_room_add(int room_num) //更新房间信息(进店人数增加) { Proom p = check_room_number(room_num); p->Number = p->Number + 1; return 0; } int delete_customer(char name[10])//退房 { Pcustomer p,q; q = p = head_customer; if (p == NULL) { return 0; } if (strcmp(p->name,name) == 0) { int room_num = p->room_number; update_room_less(room_num); if (r_customer == head_customer) { printf("退房成功!\n"); head_customer = r_customer = NULL; return 1; } head_customer = head_customer->next; free(p); printf("退房成功!\n"); return 1; } p = p->next; while (p != NULL&& 0 != strcmp(p->name,name)) { p = p->next; q = q->next; } if(p == NULL) { printf("此人不在此店!\n"); return 0; } else { int room_num = p->room_number; update_room_less(room_num); if (p == r_customer) { r_customer = q; } q->next = p->next; free(p); printf("退房成功!\n"); return 1; } } Pcustomer update_customer(char name[10])//住客换房 { delete_customer(name); insert_post_link_customer(); return NULL; } int count_day( int, int, int, int ); //计算两个日期中间的天数 int leap( int );//平闰年计算 int sum_data( Pcustomer customer ) //计算顾客所住天数 { int year, day, day1, day2; int s_year, s_month, s_day, e_year, e_month, e_day;//s为起始的日期,e为终止日期 e_day = customer->departure_date%100; e_month = customer->departure_date/100%100; e_year = customer->departure_date/10000; s_day = customer->check_in_date%100; s_month = customer->check_in_date/100%100; s_year = customer->check_in_date/10000; if ( s_year < e_year ) //不同年的时间判断 { day = count_day ( s_year, s_month, s_day , 0 ); for (year=s_year+1;year<e_year; year++ )//年份累加 if (leap(year))//闰年 day += 366; else //平年 day += 365; day += count_day (e_year, e_month, e_day, 1); } else if ( s_year == e_year ) //同一年的时间判断 { day1 = count_day ( s_year, s_month, s_day, 1 ); day2 = count_day ( e_year, e_month, e_day, 1 ); day = day2-day1; } else day = 1; return day; } //计算天数的核心 int count_day ( int year, int month, int day, int flag ) { static int day_tab[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}}; int p, i, s; if (leap(year)) //闰年为1选择后面的用 p = 1; else p = 0; if (flag) { s = day; for ( i = 1; i < month; i++ ) s += day_tab[p][i-1]; } else { s = day_tab[p][month] - day; for ( i = month + 1; i <= 12; i++ ) s += day_tab[p][i-1]; } return ( s ); } //平闰年的判断 int leap(int year) { if ( year%4 == 0&&year%100!=0||year % 400 ==0) return 1; else return 0; } void sum_customer_price( Pcustomer customer)//顾客应付总价格 { int num_price; Proom p = check_room_number(customer->room_number ); if (NULL != p) { num_price = sum_data (customer) * ( p->Price ); printf( "房客应付款%d元\n",num_price ); } } int total_customer_numer(Proom room)//顾客总人数 { Proom p; p = head_room; int num = 0; while ( p != NULL ) { num=num+p->Number; p=p->next; } return num; } int total_price_day( Proom head_room)//当天总收入 { Proom p; p = head_room; int num_price = 0; while ( p != NULL ) { if ( p->RoomType == 3 ) { num_price=num_price +(p->Price) * (p->Number); p=p->next; } else { num_price=num_price +p->Price; p=p->next; } } return num_price; } //按单价给客房排序(插入排序) void sort_insert(Proom room) { Proom pre,now,p,q; pre = head_room->next; if ( pre == NULL ) return; now = pre->next; if ( now == NULL ) return; while ( now != NULL ) { q = head_room; p = head_room->next; while (p != now && p->Price <= now->Price ) { q = p; p = p->next; } if( p == now ) { pre = pre->next; now = pre->next; continue; } pre->next = now->next; q->next = now; now->next = p; now = pre->next; } } //按房号给住客信息排序(冒泡排序) void sort_bubble() { Pcustomer p, q, pre; pre = head_customer; p = head_customer->next; if ( p = NULL ) return; q = p->next; if ( q = NULL ) return; int noswap; int num_customer = total_customer_numer(head_room); for ( int i = 0; i < num_customer-1; i++ ) { noswap = 1; for ( int j = 0; j < num_customer-i-1; j++ ) //while ( q != NULL ) if ( p->room_number > q->room_number ) { pre->next = q; p->next = q->next; q->next = p; q = p->next; noswap = 0; } if ( noswap ) break; } } void update_room_type(int num)// 修改房间信息(修改房型) { int num_type; Proom p; p = check_room_number(num); if (p == NULL) { printf("查无此项\n"); return ; } printf("请输入修改后的房型\n"); scanf("%d", &num_type); p->RoomType = num_type; printf("修改成功!\n"); write_room(); } //程序入口和主页面 void main() { if (read_room() == 0) return ; if (read_customer() == 0) return ; int n[5] = {0}; char name[10]; do{ printf(" ************欢迎光临*************\n"); printf(" * 1.客房管理 \n"); printf(" * 2.住客信息管理 \n"); printf(" * 3.查询统计 \n"); printf(" * 0.退出系统 \n"); printf(" *********************************\n"); printf(" 请选择:"); scanf("%d",&n[0]); switch(n[0]) { case 1://客房信息管理界面 { do { printf(" --------------------------\n"); printf(" * 1.录入客房信息 \n"); printf(" * 2.修改客房信息 \n"); printf(" * 0.返回上一级 \n"); printf(" --------------------------\n"); printf(" 请选择:"); scanf("%d",&n[1]); switch (n[1]) { case 1 : insert_post_link_room(); write_room(); break; case 2 : printf("请输入房号:"); scanf("%d", &n[4]); update_room_type(n[4]); break; default: break; } }while(n[1] != 0); } break; case 2://宾客登记 { do{ printf(" --------------------------\n"); printf(" * 1.查询空房 \n"); printf(" * 2.住客登记 \n"); printf(" * 3.更换房间 \n"); printf(" * 4.住客退房 \n"); printf(" * 0.返回上一级 \n"); printf(" -------------------------\n"); printf(" 选择:"); scanf("%d",&n[2]); switch(n[2]) { case 1: { printf("空房有\n:"); int num = check_empty_room(); printf("空房总数为%d\n",num); } break; case 2: if (insert_post_link_customer() == 0) break; sum_customer_price(r_customer); write_customer(); break; case 3: printf("请输入住客姓名"); scanf("%s", name); update_customer(name); write_room(); write_customer(); break; case 4: printf("请输入住客姓名"); scanf("%s", name); delete_customer(name); write_room(); write_customer(); break; default: break; } }while(n[2] != 0); } break; case 3: { do{ printf(" --------------------------\n"); printf(" * 1.查询空房 \n"); printf(" * 2.房间信息 \n"); printf(" * 3.顾客信息 \n"); printf(" * 4.查询顾客 \n"); printf(" * 5.查询房间 \n"); printf(" * 6.顾客人数 \n"); printf(" * 7.空房总数 \n"); printf(" * 8.今日收入 \n"); printf(" * 0.返回上一级 \n"); printf(" --------------------------\n"); printf(" 请选择:"); scanf("%d",&n[3]); switch(n[3]) { case 1: { int num; printf("空房有:%d\n",num); num = check_empty_room(); printf("空房总数为%d\n",num); } break; case 2: printf_all_room(); break; case 3: printf_all_customer(); break; case 4: { printf("请输入住客姓名\n"); scanf("%s", name); Pcustomer p = check_customer_name(name); if (p == NULL) { printf("查无此人\n"); } else { printf("您要查找的人是:\n"); printf( "姓名 性别 籍贯 年龄 房型 身份证号 房号 入住日期 离开日期\n"); printf_customer( p ); } } break; case 5: printf("请输入房号\n"); scanf("%d", &n[4]); printf("您要查找的房间信息为:\n"); printf( "房号 房型 单价 已住人数\n"); printf_room( check_room_number(n[4])); break; case 6: printf("顾客总人数为%d\n", total_customer_numer(head_room)); break; case 7: sum_empty_room(); break; case 8: printf("今日收入总数为:%d\n", total_price_day(head_room)); break; default: break; } }while(n[3] != 0); } break; } }while(n[0] != 0); }