| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 822 人关注过本帖
标题:没办法了,真的没办法了,我哪里错了,告诉我,我一定改。
只看楼主 加入收藏
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:16 
没办法了,真的没办法了,我哪里错了,告诉我,我一定改。
这是逻辑错误,员工工资管理系统,我卡在把文件读取出来放入链表里面这一步,我把这一步代码切出来,单独弄一个测试程序,这是最后修改的,中间有很多测试代码,大神可以复制去运行一下分析一下,将感激不尽,情况就是运行就退出,我想知道我到底错在哪。高手们
#include<stdio.h>
#include<stdlib.h>
struct clerk* readToLink(struct clerk* head_);
void print(struct clerk* head);
struct clerk
{
    char clerkNum[10];
    char name[20];
    int  age;
    char position[10];
    char salaries[10];
    struct clerk* next;
};
 main()
 {
     struct clerk*head=NULL;
     //printf("%d\n",sizeof(*head));
     head=readToLink(head);
     print(head);
 }
struct clerk* readToLink(struct clerk* head_)
{
    FILE* a;
    struct clerk* p=head_,*pr=NULL;
    //printf("%d\n",sizeof(*head_));//测试
    //head_=(struct clerk*)malloc(sizeof(struct clerk));//测试
    //printf("%d\n",sizeof(*head_));//测试
    //printf("%d\n",head_);//测试
    if((a=fopen("jia.txt","a+"))==0)
        printf("fail to open the file!\n");
    do
    {
        pr=(struct clerk*)malloc(sizeof(struct clerk));
        if(pr==NULL)
        {
        printf("No enough memory to allocate!\n");
            exit(0);
        }
        fscanf(a,"%10d%5s%2d%10s%6f",&(pr->clerkNum),&(pr->name),&(pr->age),&(pr->position),&(pr->salaries));//按数据块读入文件//按数据块读入文件
        //printf("%d\n",sizeof(*p));//测试p
        p->next=pr;
        p=pr;
        pr=pr->next;//让pr指向下一个节点(但是下一个节点是否分配内存?,next指向了该类型 但是要通过malloc函数申请内存,)
    }while(!feof(a));
    pr->next=NULL;

    return head_;
        fclose(a);

        
}


void print(struct clerk* head)
{
    while(head->next!=NULL)
    {
        printf("%10d %5s %2d %10s %6f\n",head->clerkNum,head->name,head->age,head->position,head->salaries);
        head=head->next;
    }
}
搜索更多相关主题的帖子: head 测试 position include 
2012-04-04 00:40
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
收藏
得分:0 
下面的是没有注释的

#include<stdio.h>
#include<stdlib.h>
struct clerk* readToLink(struct clerk* head_);
void print(struct clerk* head);
struct clerk
{
    char clerkNum[10];
    char name[20];
    int  age;
    char position[10];
    char salaries[10];
    struct clerk* next;
};
 main()
 {
     struct clerk*head=NULL;
      head=readToLink(head);
     print(head);
 }
struct clerk* readToLink(struct clerk* head_)
{
    FILE* a;
    struct clerk* p=head_,*pr=NULL;
    if((a=fopen("jia.txt","a+"))==0)
        printf("fail to open the file!\n");

    do
    {
        pr=(struct clerk*)malloc(sizeof(struct clerk));
        if(pr==NULL)
        {
        printf("No enough memory to allocate!\n");
            exit(0);
        }
        fscanf(a,"%10d%5s%2d%10s%6f",&(pr->clerkNum),&(pr->name),&(pr->age),&(pr->position),&(pr->salaries));//按数据块读入文件//按数据块读入文件

        p->next=pr;
        p=pr;
        pr=pr->next;//让pr指向下一个节点(但是下一个节点是否分配内存?,next指向了该类型 但是要通过malloc函数申请内存,)
    }while(!feof(a));
    pr->next=NULL;

    return head_;
        fclose(a);

        
}


void print(struct clerk* head)
{
    while(head->next!=NULL)
    {
        printf("%10d %5s %2d %10s %6f\n",head->clerkNum,head->name,head->age,head->position,head->salaries);
        head=head->next;
    }
}
2012-04-04 00:43
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:3 
指针没学好,硬吃数据结构,唉

总有那身价贱的人给作业贴回复完整的代码
2012-04-04 03:47
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
头结点在readToLink函数里没有初始化,却在print函数里去打印头结点

总有那身价贱的人给作业贴回复完整的代码
2012-04-04 03:53
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
p->next=pr;
p=pr;        
pr=pr->next;  //这句不对,在循环的最后一次是有问题,你能想明白吗?

总有那身价贱的人给作业贴回复完整的代码
2012-04-04 04:12
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
打后文件后要关闭文件,你有这个想法是好的,但是
return head_;   //这都返回了,    后面的fclose不会执行
fclose(a);

总有那身价贱的人给作业贴回复完整的代码
2012-04-04 04:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
别的不看,单看这里就知道概念有严重问题:
程序代码:
main()
{
     struct clerk*head=NULL;                // head 是指针,指向NULL,是没有数据实体的
     //printf("%d\n",sizeof(*head));        // 在这里居然胆敢对空指针试图解引用,取它所指向的值,不注释掉就在这里崩溃
     // head 无指向,空入空出(你自以为传指针能改变指针地址处的数据,但不知道这里是值传送head的值,指针本身的地址是无法修改的,等号左边head仍是NULL)
     head=readToLink(head);                 // 把实参代入,其实是head=readToLink(NULL),看看自己readToLink是如何处理NULL形参的?
     print(head);
}


这是学指针之人常犯的错误:好好的有数据实体不定义,偏要用指针,却不知道给指针指派数据实体,把指针当数据本身。

要避免这种错误,必须明确有数据实体:
程序代码:
main()
{
     struct clerk head;                // 这个才是实体数据,它是有地址、占空间的,虽然里面的数据没有初始化,但有形体有地址,就如int x一样
     struct clerk* pHead;               // 这个指针用于指向地址
     //printf("%d\n",sizeof(*head));
     pHead = readToLink(&head);        // 实参是head的地址,返回也是这个地址,并令pHead接收这个地址,与pHead = &head等效
     print(&head);                     // 这回head里面的数据被上面的readToLink()处理过,有值了
}


要么你在main()中malloc()数据体让readToLink()赋值,要么在readToLink()里malloc()把pr传回来(令head_=pr再return head_也可以),但不管怎样,如何free()它们,自己考虑好。

指针传参,能够修改的是指针所指向的数据体,而不是指针本身,传入函数readToLink()中的是指针的值,函数使用这个地址值去寻址修改数据,但在函数里面修改指针的指向是不影响实参指针的,因为这里实参和形参是两个不同的数据,这与普通的传值参数是一样的道理。

func(int x)       // x是一个复印的数据
值传送x的值,函数里面修改x不影响实参的值
func(int* x)      // x是一个复印的地址
仍然是值传送x的值,只不过这次x的值是一个地址,复印的地址可以寻到数据真身进行修改,但修改地址复印件是不会影响原件的,修改后可以复印一份return回去。

[ 本帖最后由 TonyDeng 于 2012-4-4 04:44 编辑 ]

授人以渔,不授人以鱼。
2012-04-04 04:36
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 7楼 TonyDeng
head=readToLink(head);//把实参代入,其实是head=readToLink(NULL),看看自己readToLink是如何处理NULL形参的?
readToLink函数基本可以重写了

[ 本帖最后由 embed_xuel 于 2012-4-4 06:58 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2012-04-04 06:53
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
收藏
得分:0 
回复 3楼 embed_xuel
这一题硬让我们用数据结构
2012-04-04 10:37
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
收藏
得分:0 
回复 6楼 embed_xuel
那么把它提前应该可以了吧,谢谢啊
2012-04-04 11:12
快速回复:没办法了,真的没办法了,我哪里错了,告诉我,我一定改。
数据加载中...
 
   



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

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