输出顾客信息有误
本帖最后由 wuliangtdi 于 2019-9-2 15:34 编辑#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct user
{
char name;
char sex;
char phone_number;
char Id_card;
char line_num; //航班号
char start_time; //起飞时间
char end_time; //降落时间
char start_place; //起始地点
char end_place; //目的地
intseat_num; //座位号
intcount;
struct user *next;
}users, *User;
typedef struct airline
{
char line_num;//航班号
char start_place;//起飞地
char end_place;//目的地
char start_time;//起飞时间
char end_time;//降落时间
int total;//座位总数
int left;//剩余座位
int count;
struct airline *next;//下一个结点
} airline,*Airline;
//*将单链表初始化*//
void InitList(User *L)
{
*L=(User)malloc(sizeof(users));
(*L)->next=NULL;
}
void InitList_1(Airline *pheadline)
{
*pheadline=(Airline)malloc(sizeof(airline));
(*pheadline)->next=NULL;
}
//**利用尾插法进行数据输入**//
int put_users_information(Airline headline, User L)
{
users *r,*s,*Investigation; //**Investigation是用来搜寻是否存在有重复的身份证号码**//
Airline temp;
temp = headline->next;
r=L;
s=(users *)malloc(sizeof(users));
printf("\t\t请输入航班号:\n\t\t");
scanf("%s",s->line_num);
while(temp!=NULL)
{
if(strcmp(temp->line_num,s->line_num)==0)
{
break;
}
else
{
temp=temp->next;
}
}
if(!temp)
{
printf("\t\t未找到该航班\n");
return 0;
}
if(temp->left==0)
{
printf("\t\t对不起您所找的航班剩余空位为零\n\t\t请选择其他的航班,谢谢合作\n\t\t");
}
Investigation=L->next;
printf("\t\t请您输入您的身份证号码\n\t\t");
scanf("%s",s->Id_card);
while(Investigation!= NULL)
{
if(strcmp(Investigation->Id_card,s->Id_card)!=0)
{
Investigation=Investigation->next;
}
else
{
printf("\t\t您输入的身份证号与他人重复,请重新输入:\n\t\t");
scanf("%s",s->Id_card);
Investigation=L->next; //**对比之后要初始化,不然的话会出bug,不能比较之前的客户信息**//
}
}
printf("\t\t请输入您的名字:\n\t\t");
scanf("%s",s->name);
printf("\t\t%s\n",s->name);
printf("\t\t请输入您的性别:\n\t\t");
scanf("%s",s->sex);
printf("\t\t请您输入您的电话号码:\n\t\t");
scanf("%s",s->phone_number);
s->seat_num=temp->total-temp->left+1;
strcpy(s->start_time,temp->start_time);
strcpy(s->end_time,temp->end_time);
strcpy(s->start_place,temp->start_place);
strcpy(s->end_place,temp->end_place);
temp->left--;
temp->count++;
r->count++;
printf("\t\t订票成功!祝你旅途愉快\n");
r->next=s;
r=s;
r->next=NULL;
free(s);
return 1;
}
//*输出客户信息到屏幕上**//
void display_user_information(User L)
{
users *r;
r=L->next; //把第一个节点赋值给r
if(!r)
{
printf("\t\t当前并没有用户信息\n\t\t");
}
while(r!=NULL)
{
printf("\t\t***************************************************************\n\n");
printf("\t\t********姓名 *****%s******************************\n\n",r->name);
printf("\t\t********性别 *****%s*********************************\n\n",r->sex);
printf("\t\t********身份证号 *****%s*********************\n\n",r->Id_card);
printf("\t\t********电话号码 *****%s**************************\n\n",r->phone_number);
printf("\t\t********航班号 *****%s**********************\n\n",r->line_num);
printf("\t\t********起始地点 *****%s**********************\n\n",r->start_place);
printf("\t\t********目的地 *****%s**********************\n\n",r->end_place);
printf("\t\t********座位号 *****%d***********************\n\n",r->seat_num);
printf("\t\t*****************************************************************\n\n");
r=r->next;
}
}
int main()
{
Airline cc;
Userbb;
InitList(&bb);
InitList_1(&cc);
//Main_Menu();
Put_Flight_Information(1,cc);
put_users_information(cc,bb);
display_user_information(bb);
return 0;
}
好像是display_user_information函数那里有问题 ,把L赋值给r,然后查看了下r中的内容,发现与自己刚开始输入的内容不同,麻烦大佬看看我哪里出了问题。 插入的时候,r不是最后一个节点,而是头结点,这样你的链表里最多有一个数据吧 int put_users_information(Airline headline, User L){
......
//free(s); //把这一行注释掉
return 1;
} 本帖最后由 jackz007 于 2019-9-4 21:19 编辑
楼主试试我用整整一天时间修改的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
typedef struct user
{
char name ;
char sex ;
char phone_number ;
char Id_card ;
char line_num ; //航班号
char start_time ; //起飞时间
char end_time ; //降落时间
char start_place; //起始地点
char end_place ; //目的地
intseat_num ; //座位号
intcount ;
struct user * next ;
} User ;
typedef struct airline
{
char line_num ; //航班号
char start_place; //起飞地
char end_place ; //目的地
char start_time ; //起飞时间
char end_time ; //降落时间
inttotal ; //座位总数
intleft ; //剩余座位
intcount;
struct airline * next ; //下一个结点
} Airline ;
int strip(char * s)
{
int b , k , m ;
m = strlen(s) ;
while(m > 0 && (s == 0x07 || s == 0x0a || s == 0x0d || s == 0x20)) {
s = 0x00 ;
m -- ;
}
if(m > 0) {
b = 0 ;
while(b < m && (s == 0x07 || s == 0x0a || s == 0x0d || s == 0x20)) b ++ ;
if(b > 0 && b < m) {
for(k = b ; k < m ; k ++) s = s ;
s = 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 , s ;
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 , Id_card , s ;
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) ;
}
页:
[1]