鱼C论坛

 找回密码
 立即注册
查看: 2358|回复: 3

输出顾客信息有误

[复制链接]
发表于 2019-9-2 15:34:11 | 显示全部楼层 |阅读模式
75鱼币
本帖最后由 wuliangtdi 于 2019-9-2 15:34 编辑
#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;
}users, *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,*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;
        User  bb;
        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中的内容,发现与自己刚开始输入的内容不同,麻烦大佬看看我哪里出了问题。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-2 17:35:50 | 显示全部楼层
插入的时候,r不是最后一个节点,而是头结点,这样你的链表里最多有一个数据吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-2 18:14:28 | 显示全部楼层
int put_users_information(Airline headline, User L){
    ......
    //free(s);    //把这一行注释掉
    return 1;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-4 18:55:07 | 显示全部楼层
本帖最后由 jackz007 于 2019-9-4 21:19 编辑

      楼主试试我用整整一天时间修改的代码:
#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)                                                                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表