| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 718 人关注过本帖
标题:求指点。关于从文件中将数据初始化到链表中的一些问题
只看楼主 加入收藏
tczxq88
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-2-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
求指点。关于从文件中将数据初始化到链表中的一些问题
最近在做一个彩票系统的设计,从文件初始化数据到堆中开辟的链表时,会发现一些问题,程序有点小长,求大家指点一下。。小弟研究了很久,这个两个几乎相同的代码从文件中读数据到链表以后,打印出的结果完全不一样。
typedef struct Ticket
{
    int Ticket_ID:;   //中奖号码
    int Ticket_Type;  //彩票类型
    float Ticket_Price; //彩票价格
    int Ticket_Status;  //彩票是否开奖
    int Tikcet_Dayth;    //期号
    flota Ticket_Total_Money  //奖池余额
    struct Ticket *Next_Ticket;
}TI;

typedef struct Person
{
    char Person_ID[20];  //彩民账号
    char Person_Name[20];     //彩民姓名
    char Person_Password[20]; //彩民密码
    float Person_Balance;    //彩民账号余额
    struct Person *Next_Person;
}PE;

void Print_Person_Link(PE *Person_Head)
{
    PE *Person_Temp = Person_Head;
    while(Person_Temp != NULL)
    {
        print("%s %s %s %f\n", Person_Temp->Person_ID, Person_Temp->Person_Name, Person_Temp->Person_Password, Person_Temp->Person_Balance);
        Person_Temp = Person_Temp->Next_Person;
     }
}


void Print_Ticket_Link(TI *Ticket_Head)
{
    TI *Ticket_Temp = Ticket_Head;
    while(Ticket_Temp != NULL)
    {
        print("%d %d %f %d %d %f", Ticket_Temp->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Ticket_Dayth, Ticket_Temp->Ticket_Total_Money);
        Ticket_Temp = Person_Temp->Next_Ticket;
     }
}

PE *Person_File_Initial(PE *Person_Head)
{
    FILE *Person_File = NULL;
    PE *Person_File = NULL;
    if((Person_File = fopen("Person_File.txt", "r")) == NULL)   
    {
        printf("目前没有彩民注册.......\n");
    }
    else
    {
        while(!feof(Person_File))
        {
            PE *Person_New_Node = (PE *)malloc(sizeof(PE));
            if(Person_Head == NULL)   
            {
                Person_Head = Person_New_Node;
            }
            else
            {
                Person_Temp->Next_Person = Person_New_Node;
            }
            Person_Temp = Person_New_Node;
            Person_New_Node->Next_Person = NULL;
            fscanf(Person_File, "%s %s %s %f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, &Person_New_Node->Person_Balance);
       }
       Print_Person_Link(Person_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       fclose(Person_File);
       return Person_Head;
}

TI *Ticket_File_Initial(TI *Ticket_Head)
{
    FILE *Ticket_File = NULL;
    TI *Ticket_Temp = NULL;
     if((Ticket_File = fopen("Ticket_File.txt", "r")) == NULL)   
    {
        printf("目前没有开奖信息.......\n");
    }
    else
    {
        while(!feof(Ticket_File))
        {
            TI *Ticket_New_Node = (TI *)malloc(sizeof(TI));
            if(Ticket_Head == NULL)   
            {
                Ticket_Head = Ticket_New_Node;
            }
            else
            {
                Ticket_Temp->Next_Ticket = Ticket_New_Node;
            }
            Ticket_Temp = Ticket_New_Node;
            Ticket_New_Node->Next_Ticket = NULL;
            fscanf(Ticket_File, "%d %d %f %d %d %f", &Ticket_New_Node->Ticket_ID, &Ticket_New_Node->Ticket_Type, &Ticket_New_Node->Ticket_Price, &Ticket_New_Node->Ticket_Status, &Ticket_New_Node->Ticket_Dayth, &Ticket_New_Node->Ticket_Total_Money);
       }
       Print_Ticket_Link(Ticket_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       fclose(Ticket_File);
       return Ticket_Head;
}

int main()
{
    PE *Person_Head = NULL;   
    TI *Person_Head = NULL;
    Person_Head = Person_File_Initial(Person_Head);
    Ticket_Head = Ticket_File_Initial(Ticket_Head);
    return 0;
}
Person_File.txt  里的内容
aaa 1 11111 84.000000
bbb 2 22222 88.000000
ccc 3 33333 70.000000
ddd 4 44444 90.000000

Ticket_File.txt  里的内容
17 1 2.000000 1 1 986.000000
20 2 4.000000 1 1 966.000000
19 3 6.000000 1 1 966.000000

运行以后的结果是
aaa 1 11111 84.000000
bbb 2 22222 88.000000
ccc 3 33333 70.000000
ddd 4 44444 90.000000
   0.000000              //这里为什么多了一行0?
                         //然后光标就停止在这一行不动了,如果不立刻停止程序,系统将死机
     请大家指点一下。。。纠结了一天了,实在没有办法,才来论坛上求助的~~~~~~



[ 本帖最后由 tczxq88 于 2012-2-17 21:50 编辑 ]
搜索更多相关主题的帖子: 价格 设计 中奖号码 彩票 
2012-02-17 21:45
心灵百合
Rank: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:10 
while(Ticket_Temp != NULL)
    {
        print("%d %d %f %d %d %f", Ticket_Temp->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Ticket_Dayth, Ticket_Temp->Ticket_Total_Money);
中的Ticket_ID不在struct Person内怎么可以Ticket_Temp->Ticket_ID。不防在struct Person内添加一项
typedef struct Person
{
    char Person_ID[20];  //彩民账号
    char Person_Name[20];     //彩民姓名
    char Person_Password[20]; //彩民密码
    float Person_Balance;    //彩民账号余额
    TI Ticket;
    struct Person *Next_Person;
}PE;
改为:while(Ticket_Temp != NULL)
    {
        print("%d %d %f %d %d %f", Ticket_Temp->Ticket->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Ticket_Dayth, Ticket_Temp->Ticket_Total_Money);

2012-02-17 22:07
tczxq88
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-2-17
收藏
得分:0 
以下是引用心灵百合在2012-2-17 22:07:59的发言:

 while(Ticket_Temp != NULL)
    {
        print("%d %d %f %d %d %f", Ticket_Temp->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Ticket_Dayth, Ticket_Temp->Ticket_Total_Money);
中的Ticket_ID不在struct Person内怎么可以Ticket_Temp->Ticket_ID。不防在struct Person内添加一项
typedef struct Person
{
    char Person_ID[20];  //彩民账号
    char Person_Name[20];     //彩民姓名
    char Person_Password[20]; //彩民密码
    float Person_Balance;    //彩民账号余额
    TI Ticket;
    struct Person *Next_Person;
}PE;
改为:while(Ticket_Temp != NULL)
    {
        print("%d %d %f %d %d %f", Ticket_Temp->Ticket->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Ticket_Dayth, Ticket_Temp->Ticket_Total_Money);
Ticket_Temp->Ticket_ID其实就是我们彩票中的自选号,这个Ticket结构体是专门给摇奖后的彩票存放的,与彩民账号没有直接联系,具体的我在另外一个结构体中有定义一个购票的结构体,这里不需要用到那个结构体,所以我也就没写出来。  其实我这个问题的关键还是明明文件里没有那个0.000000的一行数据,但是为什么我读到链表中会有这行数据。。而在Ticket_File_Initial中初始化Ticket文件时,为什么系统会卡在那里。
2012-02-17 22:41
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:10 
我不知道你怎么贴的代码。
难道你手写的在网页上的吗?好多错误。要通过编译我改了好多了。
程序代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Ticket
{
    int Ticket_ID;   //中奖号码
    int Ticket_Type;  //彩票类型
    float Ticket_Price; //彩票价格
    int Ticket_Status;  //彩票是否开奖
    int Tikcet_Dayth;    //期号
    float Ticket_Total_Money;  //奖池余额
    struct Ticket *Next_Ticket;
}TI;

typedef struct Person
{
    char Person_ID[20];  //彩民账号
    char Person_Name[20];     //彩民姓名
    char Person_Password[20]; //彩民密码
    float Person_Balance;    //彩民账号余额
    struct Person *Next_Person;
}PE;

void Print_Person_Link(PE *Person_Head)
{
    PE *Person_Temp = Person_Head;
    while(Person_Temp != NULL)
    {
        printf("%s %s %s %f\n", Person_Temp->Person_ID, Person_Temp->Person_Name, Person_Temp->Person_Password, &Person_Temp->Person_Balance);
        Person_Temp = Person_Temp->Next_Person;
     }
}


void Print_Ticket_Link(TI *Ticket_Head)
{
    TI *Ticket_Temp = Ticket_Head;
    while(Ticket_Temp != NULL)
    {
        printf("%d %d %f %d %d %f", Ticket_Temp->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Tikcet_Dayth, Ticket_Temp->Ticket_Total_Money);
        Ticket_Temp = Ticket_Temp->Next_Ticket;
     }
}

PE *Person_File_Initial(PE *Person_Head)
{
    FILE *Person_File = NULL;
    PE *Person_Temp = NULL;
    if((Person_File = fopen("Person_File.txt", "r")) == NULL)  
    {
        printf("目前没有彩民注册.......\n");
    }
    else
    {
        while(!feof(Person_File))
        {
            PE *Person_New_Node = (PE *)malloc(sizeof(PE));
            if(Person_Head == NULL)  
            {
                Person_Head = Person_New_Node;
            }
            else
            {
                Person_Temp->Next_Person = Person_New_Node;
            }
            Person_Temp = Person_New_Node;
            Person_New_Node->Next_Person = NULL;
            fscanf(Person_File, "%s %s %s %f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, &Person_New_Node->Person_Balance);
            printf("%s\t%s\t%s\t%s\t%f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, Person_New_Node->Person_Balance);
       }
//         getchar();
//         getch();
       Print_Person_Link(Person_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       puts("打印完毕");
       fclose(Person_File);
       return Person_Head;
}
}

TI *Ticket_File_Initial(TI *Ticket_Head)
{
    FILE *Ticket_File = NULL;
    TI *Ticket_Temp = NULL;
     if((Ticket_File = fopen("Ticket_File.txt", "r")) == NULL)  
    {
        printf("目前没有开奖信息.......\n");
    }
    else
    {
        while(!feof(Ticket_File))
        {
            TI *Ticket_New_Node = (TI *)malloc(sizeof(TI));
            if(Ticket_Head == NULL)  
            {
                Ticket_Head = Ticket_New_Node;
            }
            else
            {
                Ticket_Temp->Next_Ticket = Ticket_New_Node;
            }
            Ticket_Temp = Ticket_New_Node;
            Ticket_New_Node->Next_Ticket = NULL;
            fscanf(Ticket_File, "%d %d %f %d %d %f", &Ticket_New_Node->Ticket_ID, &Ticket_New_Node->Ticket_Type, &Ticket_New_Node->Ticket_Price, &Ticket_New_Node->Ticket_Status, &Ticket_New_Node->Tikcet_Dayth, &Ticket_New_Node->Ticket_Total_Money);
            printf("%d %d %f %d %d %f",Ticket_New_Node->Ticket_ID, Ticket_New_Node->Ticket_Type, Ticket_New_Node->Ticket_Price, Ticket_New_Node->Ticket_Status, Ticket_New_Node->Tikcet_Dayth, Ticket_New_Node->Ticket_Total_Money);
       }

       Print_Ticket_Link(Ticket_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       fclose(Ticket_File);
      
       return Ticket_Head;
}
}
int main()
{
    PE *Person_Head = NULL;  
    TI *Ticket_Head = NULL;
    Person_Head = Person_File_Initial(Person_Head);
    Ticket_Head = Ticket_File_Initial(Ticket_Head);
    return 0;
}

你可以运行一下。
内存溢出了,我没有很仔细看你代码。。。
你仔细改改吧。
应该是链表尾部你没有处理好。。。

用心做一件事情就这么简单
2012-02-17 23:35
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
fscanf(Person_File, "%s %s %s %f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, &Person_New_Node->Person_Balance);
            printf("%s\t%s\t%s\t%s\t%f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, Person_New_Node->Person_Balance);

上面没有标出来。。。。
这段代码。
可能你下面那个函数也有这样的问题。。
你仔细改改。。。。没有很仔细调试

用心做一件事情就这么简单
2012-02-17 23:38
tczxq88
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-2-17
收藏
得分:0 
以下是引用小鱼儿c在2012-2-17 23:35:01的发言:

我不知道你怎么贴的代码。
难道你手写的在网页上的吗?好多错误。要通过编译我改了好多了。#include  
#include  
#include  
#include  
typedef struct Ticket
{
    int Ticket_ID;   //中奖号码
    int Ticket_Type;  //彩票类型
    float Ticket_Price; //彩票价格
    int Ticket_Status;  //彩票是否开奖
    int Tikcet_Dayth;    //期号
    float Ticket_Total_Money;  //奖池余额
    struct Ticket *Next_Ticket;
}TI;
 
typedef struct Person
{
    char Person_ID[20];  //彩民账号
    char Person_Name[20];     //彩民姓名
    char Person_Password[20]; //彩民密码
    float Person_Balance;    //彩民账号余额
    struct Person *Next_Person;
}PE;
 
void Print_Person_Link(PE *Person_Head)
{
    PE *Person_Temp = Person_Head;
    while(Person_Temp != NULL)
    {
        printf("%s %s %s %f\n", Person_Temp->Person_ID, Person_Temp->Person_Name, Person_Temp->Person_Password, &Person_Temp->Person_Balance);
        Person_Temp = Person_Temp->Next_Person;
     }
}
 
 
void Print_Ticket_Link(TI *Ticket_Head)
{
    TI *Ticket_Temp = Ticket_Head;
    while(Ticket_Temp != NULL)
    {
        printf("%d %d %f %d %d %f", Ticket_Temp->Ticket_ID, Ticket_Temp->Ticket_Type, Ticket_Temp->Ticket_Price, Ticket_Temp->Ticket_Status, Ticket_Temp->Tikcet_Dayth, Ticket_Temp->Ticket_Total_Money);
        Ticket_Temp = Ticket_Temp->Next_Ticket;
     }
}
 
PE *Person_File_Initial(PE *Person_Head)
{
    FILE *Person_File = NULL;
    PE *Person_Temp = NULL;
    if((Person_File = fopen("Person_File.txt", "r")) == NULL)   
    {
        printf("目前没有彩民注册.......\n");
    }
    else
    {
        while(!feof(Person_File))
        {
            PE *Person_New_Node = (PE *)malloc(sizeof(PE));
            if(Person_Head == NULL)   
            {
                Person_Head = Person_New_Node;
            }
            else
            {
                Person_Temp->Next_Person = Person_New_Node;
            }
            Person_Temp = Person_New_Node;
            Person_New_Node->Next_Person = NULL;
            fscanf(Person_File, "%s %s %s %f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, &Person_New_Node->Person_Balance);
            printf("%s\t%s\t%s\t%s\t%f", Person_New_Node->Person_ID, Person_New_Node->Person_Name, Person_New_Node->Person_Password, Person_New_Node->Person_Balance);
       }
//         getchar();
//         getch();
       Print_Person_Link(Person_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       puts("打印完毕");
       fclose(Person_File);
       return Person_Head;
}
}
 
TI *Ticket_File_Initial(TI *Ticket_Head)
{
    FILE *Ticket_File = NULL;
    TI *Ticket_Temp = NULL;
     if((Ticket_File = fopen("Ticket_File.txt", "r")) == NULL)   
    {
        printf("目前没有开奖信息.......\n");
    }
    else
    {
        while(!feof(Ticket_File))
        {
            TI *Ticket_New_Node = (TI *)malloc(sizeof(TI));
            if(Ticket_Head == NULL)   
            {
                Ticket_Head = Ticket_New_Node;
            }
            else
            {
                Ticket_Temp->Next_Ticket = Ticket_New_Node;
            }
            Ticket_Temp = Ticket_New_Node;
            Ticket_New_Node->Next_Ticket = NULL;
            fscanf(Ticket_File, "%d %d %f %d %d %f", &Ticket_New_Node->Ticket_ID, &Ticket_New_Node->Ticket_Type, &Ticket_New_Node->Ticket_Price, &Ticket_New_Node->Ticket_Status, &Ticket_New_Node->Tikcet_Dayth, &Ticket_New_Node->Ticket_Total_Money);
            printf("%d %d %f %d %d %f",Ticket_New_Node->Ticket_ID, Ticket_New_Node->Ticket_Type, Ticket_New_Node->Ticket_Price, Ticket_New_Node->Ticket_Status, Ticket_New_Node->Tikcet_Dayth, Ticket_New_Node->Ticket_Total_Money);
       }
 
       Print_Ticket_Link(Ticket_Head);      //这是打印链表所有数据的一个函数,这个函数小弟已经用了N次,保证没有任何问题
       fclose(Ticket_File);
      
       return Ticket_Head;
}
}
int main()
{
    PE *Person_Head = NULL;   
    TI *Ticket_Head = NULL;
    Person_Head = Person_File_Initial(Person_Head);
    Ticket_Head = Ticket_File_Initial(Ticket_Head);
    return 0;
}

你可以运行一下。
内存溢出了,我没有很仔细看你代码。。。
你仔细改改吧。
应该是链表尾部你没有处理好。。。
这段代码是我重新打上去的。。我是linux下运行的。所以在WINDOWS上没法黏贴-0-
2012-02-18 08:47
快速回复:求指点。关于从文件中将数据初始化到链表中的一些问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023680 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved