Luker 发表于 2018-12-4 23:37:11

单独拿出来执行可以,放到这里就不行了, 请各位帅气的鱼油进来看看

本帖最后由 Luker 于 2018-12-5 13:26 编辑

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
#define BEN sizeof(struct score)
#define SEX 4            /*学生性别的长度
#define NAME 10      /*学生名字的长度
#define N 2               /*输入N个学生的信息

struct student* InputStudent();                        
void DisplayMenu(struct student *);
void SortStudent(struct student *,int choice,int rank);
struct student* GetOrderDir(int choice,struct student *);
void OutputStudent(struct student*);
void zilow(char *a);
void numlow(int *a);
void zihigh(char *a);
void numhigh(int *a);

struct score
{
        int C;
        int English;            /*学生各科分数
        int Math;
};

struct student         
{
        long number;                      /*学生的学号,因为长度较长,用long类型
        char name;         /*学生的姓名,最大长度为NAME,后面的1用来存放尾零
        char sex;               /*学生的性别,最大长度为SEX,后面的1用来存放尾零
        int old;                              /*学生的年龄
        struct score peo;                   /*学生分数的结构体
        struct student *next;            /*指向下一个结点的指针
};

int main(void)
{
        struct student *head;
        printf("请输入%d个学生的信息:\n",N);
        head=InputStudent();         /*主要是在这里出现错误!!!
        DisplayMenu(head);      
        return 0;
}

struct student* InputStudent()
{
        int i=0;
        struct student *head,*p1,*p2;
        head=(struct student*)malloc(LEN+BEN);                  /*创建表头
        p1=head;
        while(i<N)
        {
                if(i!=0)
                {
                        p1=(struct student*)malloc(LEN+BEN);       /*如果不是表头(即i!=0),则建立新结点,如果是表头,跳过
                }       
                printf("请输入第%d个学生的信息:\n",i+1);          /*学生信息输入
                printf("学号:");
                scanf("%ld",p1->number);
                printf("姓名:");
                scanf("%s",p1->name);
                printf("性别:");
                scanf("%s",p1->sex);
                printf("年龄:");
                scanf("%d",&p1->old);
                printf("C成绩:");
                scanf("%d",&p1->peo.C);
                printf("英语成绩:");
                scanf("%d",&p1->peo.English);
                printf("高数成绩:");
                scanf("%d",&p1->peo.Math);
                if(i!=0)
                {
                        p2->next=p1;            /* 如果不是表头,则将前一个结点的next指针指向下一个结点
                }
                p2=p1;                              /* 将p2移动p1
                i++;
        }
        p1->next=NULL;                     /*将最后结点的next指针指向NULL
        return head;                              /*返回创建好的链表的头指针
}

这个程序后面的代码没附上,问题主要出在这个InputStudent上,本来是要录入两个学生的信息的,录完一个程序不知道为什么就停止执行了,不过单独把这段代码拿出来执行却可以,请各位鱼油帮我看一下。{:10_287:}

lemon3 发表于 2018-12-5 00:24:02

写点有用的注释吧,韩式有点不好看。

Luker 发表于 2018-12-5 09:12:09

lemon3 发表于 2018-12-5 00:24
写点有用的注释吧,韩式有点不好看。

谢谢你帮我看,我早上有重新执行一遍,想不到它就好了,真是奇怪,昨天还一直不行,今天莫名其妙就好了,不过还是要多谢你{:10_326:}

Luker 发表于 2018-12-5 09:23:25

lemon3 发表于 2018-12-5 00:24
写点有用的注释吧,韩式有点不好看。

救命呀,大哥,它又不行了,第一次执行可以,再去执行它就凉了

lemon3 发表于 2018-12-5 13:13:53

结构能加点注释吗。超过一页而且没注释看着很难受

Luker 发表于 2018-12-5 13:28:56

lemon3 发表于 2018-12-5 13:13
结构能加点注释吗。超过一页而且没注释看着很难受

兄嘚,你看这样行吗,我发现我有时候malloc可以申请内存,有时候又不可以,有点蓝瘦{:10_272:}

lemon3 发表于 2018-12-5 13:47:38

可能是你申请使用之后没有释放内存,你试一下在最后释放内存一下

丶忘却的年少o 发表于 2018-12-5 14:29:27

首先说一下注释,复制代码过去删注释删的炸裂。注释的格式两种:
/* 中间写注释 */
// 后面写注释
你这么写后面全是都是注释
问题:scanf("%ld",p1->number); 这条语句,加个 & 看看,number不是地址,要取地址

Luker 发表于 2018-12-5 19:35:19

丶忘却的年少o 发表于 2018-12-5 14:29
首先说一下注释,复制代码过去删注释删的炸裂。注释的格式两种:

你这么写后面全是都是注释


多谢,我还是太粗心,以后还请多指教{:10_275:}

Luker 发表于 2018-12-5 19:38:09

lemon3 发表于 2018-12-5 13:47
可能是你申请使用之后没有释放内存,你试一下在最后释放内存一下

多谢,我把free函数写上了,{:10_275:}考试月了,这阵子要滚回去疯狂复习了,再次感谢。{:10_275:}
页: [1]
查看完整版本: 单独拿出来执行可以,放到这里就不行了, 请各位帅气的鱼油进来看看