为什么运行的时候票价和里程是乱七八糟的数呢?

int stationld;//列车号
char from[STR_LEN];//车票起点
char to[STR_LEN];//车票终点
int money;//票价
int length;//距离



char name[MAX];//姓名
char id[MAX];//身份证号
char tel_num[MAX];//联系方式
int order_no;//订单编号
int t_id;

//定义列车结点

Train data;
struct node *next;

// 定义用户链表

User data;
struct unode *next;



Node *p,*q;//文件信息录入
while(1)
{
    q=l;
    while(q -> next!=NULL)
    {
        q=q -> next;
    }
    p=(Node*)malloc(sizeof(Node));
    printf("\n\t----------列车信息录入----------\n");
    if(!p)
    {
        printf("录入错误!");
        exit(0);
    }
    printf("\n\t1.请输入起点站名称:");
    scanf("%s",&p ->data.from);
    printf("\n\t2.请输入终点站名称:");
    scanf("%s",&p ->data.to);
    printf("\n\t3.请输入票价:");
    scanf("%d",&p ->data.money);
    printf("\n\t4.请输入里程:");
    scanf("%d",&p ->data.length);
    printf("\n\t5.请输入列车号:");
    scanf("%d",&p ->data.stationld);
    p ->next=NULL;
    q ->next=p;
    q=p;
    printf("\t录入成功!\t\n");
    break;
}


Node *p;//订票服务
uNode *r,*q;
int n;
p =l;
int t_id;
printf("\n\t-------------车票订单填写-------------\n");
printf("请输入您需要预定的列车号:");
scanf("%d",&t_id);
while(p!=NULL&&p -> data.stationld!=t_id)
{
    p=p ->next;
}
if(p==NULL)
{
    printf("**暂无相关车票可预定!**");
}
else
{
    while(1)
    {
        q=u;
        while(q ->next!=NULL)
        {
            q=q ->next;
        }
        r=(uNode*)malloc(sizeof(uNode));
        p=(Node*)malloc(sizeof(Node));
        printf("\n\t#####请按提示输入您的个人信息#####\n");
        printf("\t请输入您的姓名:");
        scanf("%s",&r ->data.name);
        printf("\t请输入您的身份证号码:");
        scanf("%s",&r ->data.id);
        printf("\t请输入您的手机号码:\n");
        scanf("%s",&r ->data.tel_num);
        r ->data.t_id=t_id;
        srand((int)time(NULL));
        n=rand()%8999+1000;
        r ->data.order_no=n;
        printf("\t订票成功,您已成功预订一张列车号为%d的车票,车票为%d元,里程%dkm!",r ->data.t_id,p ->data.money,p ->data.length);
        printf("订单编号为%d\n\n",r ->data.order_no);
        r ->next=NULL;
        q ->next=r;
        q=r;
        break;
    }
}

img

你77行打印p的数据,但你输入的数据全部存在r里面,p里面的数据当然是乱的了

Node *p;
你反复给p重新定义,那么之前装入里面的值已经被丢弃了(其实是class的实例被丢弃了)
然后你再调用p->data的时候,它指向的是一块随机内存
c++编译器不会帮你验证变量在使用前是否已经赋值,你必须自己想办法给他初始化,不要让它使用内存里的随机默认值

img

img


上面的代码中, scanf("%s",&p ->data.from); 字符串的输入,前面是不需要 '&'符的,应修改为下面的形式:
scanf("%s",p ->data.from);
。。。。。。以下类似。。。。