初学者求解指针错误
昼夜勤作息 2012-02-18 01:15:30 【代码如下】
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define COUNT 2 //录入学生个数
#define MESSAGE printf("\n%s\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",p->Name,p->Nom,p->Math,p->Physics,p->English,p->Chinese,p->PE,p->Total,p->Average);
struct St
{
char Name[30];//数据域
int Nom;
float Math;
float Physics;
float English;
float Chinese;
float PE;
float Total;//个人总分
float Average;//个人平均分
int Fail;//挂科数
struct St * pNext;//指针域
};
int i;
//造节点及录入学生信息
struct St * Make(void)
{
char name[30];
int nom;
float math;
float physics;//用于存放节点内数据
float english;
float chinese;
float pE;
float total;
float average;
//造一个不存放数据的头结点
struct St * pHead = (struct St *)malloc(sizeof(struct St));
if (pHead==NULL)
{
printf("分配内存失败!");
exit(-1);
}
struct St * pList = pHead;
pList -> pNext = NULL;
for (i=0;i<COUNT;++i)
{
printf("请录入第%d个学生成绩:\n",i+1);
printf("姓名:");
scanf("%s",name);
printf("学号:");
scanf("%d",&nom);
printf("数学:");
scanf("%f",&math);
printf("物理:");
scanf("%f",&physics);
printf("英语:");
scanf("%s",&english);
printf("语文:");
scanf("%s",&chinese);
printf("体育:");
scanf("%s",&pE);
total = math + physics + english + chinese + pE;
average = total / 5;
struct St * pNew = (struct St *)malloc(sizeof(struct St));
if (pNew==NULL)
{
printf("分配内存失败!\n");
exit(-1);
}
//给数据域赋值
strcpy(pNew->Name,name);
pNew->Nom = nom;
pNew->Math = math;
pNew->Physics = physics;
pNew->English = english;
pNew->Chinese = chinese;
pNew->PE = pE;
pNew->Total = total;
pNew->Average = average;
pList->pNext = pNew;
pNew->pNext = NULL;
pList = pNew;
}
return pHead;//返回头节点地址。
}
//求数学平均成绩
void Math_average (St * pHead)
{
float Maths_total = 0.0;//班级数学总分
float Maths_average;
struct St * p = pHead->pNext;
while ( p != NULL )
{
Maths_total += p->Math;
p = p->pNext;
}
Maths_average = Maths_total / COUNT;
printf("\t\t班级数学平均分为:%.4f\n",Maths_average);
return;
}
//找有两门以上功课不及格的学生
void fail(St * pHead)
{
struct St * p = pHead->pNext;
while ( p != NULL )
{
p->Fail = 0;
if ( (p->Math)<60 )
p->Fail++;
if ( (p->Physics)<60 )
p->Fail++;
if ( (p->English)<60 )
p->Fail++;
if ( (p->Chinese)<60 )
p->Fail++;
if ( (p->PE)<60 )
p->Fail++;
p = p->pNext;
}
printf("\n\t成绩欠佳的学生为:\n");
printf("\n姓名\t学号\t数学\t物理\t英语\t语文\t体育\t总分\t平均分\n");
p = pHead->pNext;
while ( p != NULL )
{
if ( (p->Fail)>2 )
MESSAGE
p = p->pNext;
}
return;
}
//找成绩优良的学生
void excellent (St * pHead)
{
struct St * p = pHead->pNext;
printf("\n\t成绩优良的学生为:\n");
printf("\n姓名\t学号\t数学\t物理\t英语\t语文\t体育\t总分\t平均分\n");
while (p != NULL)
{
if ( (p->Average)>85 )
MESSAGE
else if ( (p->Math)>80 && (p->Physics)>80 )
if ( (p->English)>80 && (p->Chinese)>80 )
if ( (p->PE)>80 )
MESSAGE
p = p->pNext;
}
return;
}
int main (void)
{
struct St * phead = NULL;//定义一个头指针用于存放头结点的地址。
phead = Make();
Math_average(phead);
fail(phead);
excellent (phead);
return 0;
}
/*
在VC++6.0的运行结果:
——————————————————————————————————————
请录入第1个学生成绩:
姓名:周杰伦
学号:0001
数学:88
物理:88
英语:88
语文:88
体育:88
请录入第2个学生成绩:
姓名:李克勤
学号:0002
数学:55
物理:55
英语:55
语文:55
体育:55
班级数学平均分为:71.5000
成绩欠佳的学生为:
姓名 学号 数学 物理 英语 语文 体育 总分 平均分
周杰伦 1 88.00 88.00 -33612000.00 -33612000.00 -33612000.00
-100835824.00 -20167164.00
李克勤 2 55.00 55.00 -33608916.00 -33608916.00 -33608916.00
-100826640.00 -20165328.00
成绩优良的学生为:
姓名 学号 数学 物理 英语 语文 体育 总分 平均分
Press any key to continue
——————————————————————————————————————
*/
【问题:为何英语到平均分会乱码?为何优秀不显示?如何写指针才最优?最后谢谢。】