| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 639 人关注过本帖
标题:简单的链表程序找错
只看楼主 加入收藏
雪天
Rank: 1
等 级:新手上路
帖 子:18
专家分:5
注 册:2009-7-23
结帖率:40%
收藏
已结贴  问题点数:20 回复次数:8 
简单的链表程序找错
原题:
每个学生有3门课程结业考试成绩。输入每个学生的姓名和成绩,计算并输出每个学生的姓名和平均成绩。

我的程序:(错的)#include"stdio.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
    char name[20];
    float score1;
    float score2;
    float score3;
    struct student *next;
};
struct student *create()
{
    int n;
    n=1;
    struct student *head,*p1,*p2;
    p1=(struct student *)malloc(LEN);
    head=NULL;
    gets_s(p1->name);
    scanf("%f%f%f",&p1->score1,&p1->score2,&p1->score3);
    p1->next=NULL;
    while(p1->score1>=0)
    {
        n++;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc(LEN);
        gets_s(p1->name);
        scanf("%f%f%f",&p1->score1,&p1->score2,&p1->score3);
        p1->next=NULL;
    }
    free(p1);
    return(head);
}
void main(struct student *create)
{
    float average;
    struct student *p,*head;
    p=create;
    head=create;
    while(p->next!=NULL)
    {
        if(head==NULL)printf("\nlist NULL\n");
        else
        {
            average=(p->score1+p->score2+p->score3)/3;
            printf("\nName:%s\nAverage:%f\n",p->name,average);
            p=p->next;
        }
    }
}
搜索更多相关主题的帖子: 链表 
2009-08-09 23:12
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:6 
帮你改了一下,基本上可以达到您的要求了:
程序代码:
#include<stdio.h>
#include<stdlib.h>
//#define NULL 0
#define LEN sizeof(struct student)
struct student {
    char name[20];
    float score1;
    float score2;
    float score3;
    struct student *next;
};
struct student *create()
{
    int n;
    n = 0;
    struct student *head, *p1, *p2;
    p1 = (struct student *)malloc(LEN);
    head = NULL;
    gets(p1->name);
    scanf("%f%f%f", &p1->score1, &p1->score2, &p1->score3);
    while(getchar()!='\n');
    p1->next = NULL;
    while (p1->score1 >= 0.0) {
        n++;
        if (n == 1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = (struct student *)malloc(LEN);
        gets(p1->name);
        scanf("%f %f %f", &p1->score1, &p1->score2, &p1->score3);
        while(getchar()!='\n');
        p1->next = NULL;
    }
    //free(p1);
    return (head);
}
int main(void)
{
    float average;
    struct student  *p;
    p = create();
    while (p) {
        if (p == NULL)
            printf("\nlist NULL\n");
        else {
            average = (p->score1 + p->score2 + p->score3) / 3.0;
            printf("\nName:%s\nAverage:%f\n", p->name, average);
            p = p->next;
        }
    }
   
    return 0;
}

2009-08-10 00:09
紫ing~
Rank: 4
来 自:中科大
等 级:业余侠客
帖 子:103
专家分:273
注 册:2008-11-25
收藏
得分:6 
为什么这个程序在我的电脑上必须把struct student *head, *p1, *p2; 提到int n; 之前才能运行啊。。。。否则报十几个错误。,,我到现在才发现是这个原因。哪位高手给说一下~~~

[ 本帖最后由 紫ing~ 于 2009-8-10 00:24 编辑 ]

未命名.JPG (166.66 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

唯有天道恒在,往复循环,不曾更改。。。
2009-08-10 00:19
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 3楼 紫ing~

        按照 C 标要求,所有变量定义在运算之前(或者是在一个{ } 内开始的时候定义)。有些编译器宽松些,有的编译器对此要求比较严格。C++ 不必遵循这样的规则。

        以上只是我的个人理解,谨作参考。
2009-08-10 00:31
雪天
Rank: 1
等 级:新手上路
帖 子:18
专家分:5
注 册:2009-7-23
收藏
得分:0 
回复 2楼 广陵绝唱

那个在#define NULL 0和free(p1)之前为什么要加"//"呢?
2009-08-10 08:18
雪天
Rank: 1
等 级:新手上路
帖 子:18
专家分:5
注 册:2009-7-23
收藏
得分:0 
回复 2楼 广陵绝唱

还有为什么我原来那个不行呢?大侠讲解一下啦
2009-08-10 08:20
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:6 
#define NULL 0

这个在 stdio.h 中已经定义过了。

free(p1),你这个释放了,主函数中返回的指针head就指向NULL了。程序当然挂掉。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-10 13:29
紫ing~
Rank: 4
来 自:中科大
等 级:业余侠客
帖 子:103
专家分:273
注 册:2008-11-25
收藏
得分:0 
回复 4楼 广陵绝唱

请问,我觉得 struct student *head, *p1, *p2; 的确是定义在使用前面啊,只是在int后面,没有违背“先定义后使用”的原则啊?

唯有天道恒在,往复循环,不曾更改。。。
2009-08-10 18:48
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
C标要求局部变量声明必须在函数开始处,任何操作语句前。

C++无此要求,可在任何需要使用的地方声明局部变量。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-10 19:23
快速回复:简单的链表程序找错
数据加载中...
 
   



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

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