wuliangtdi 发表于 2019-9-2 15:34:11

输出顾客信息有误

本帖最后由 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中的内容,发现与自己刚开始输入的内容不同,麻烦大佬看看我哪里出了问题。

flamer 发表于 2019-9-2 17:35:50

插入的时候,r不是最后一个节点,而是头结点,这样你的链表里最多有一个数据吧

superbe 发表于 2019-9-2 18:14:28

int put_users_information(Airline headline, User L){
    ......
    //free(s);    //把这一行注释掉
    return 1;
}

jackz007 发表于 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         ;
      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]
查看完整版本: 输出顾客信息有误