首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数据结构,学生管理系统,通过函数但申请空间,给结点赋值出现异常

2013-07-09 
数据结构,学生管理系统,通过函数但申请空间,给结点赋值出现错误[/code]求大神帮助代码如下://选择输出班级

数据结构,学生管理系统,通过函数但申请空间,给结点赋值出现错误
数据结构,学生管理系统,通过函数但申请空间,给结点赋值出现异常[/code]求大神帮助
数据结构,学生管理系统,通过函数但申请空间,给结点赋值出现异常
代码如下://选择输出班级成绩单选项,对选择班级成员总成绩按降序输出
我的思路是:(已经从文件中读取信息到链表,带吗未写出)从文件中先找出每个班级人数,再为这些人(每个人的信息都包含在结构体中)申请动态空间,把每个班人的信息赋值给申请空间中数组,在对数组排序
//结构体
typedef struct stu
{
char name[20];
char ID[10];
char Class[10];
int  course1;
int  course2;
struct stu *next;
}stu_node,*Linkhead;


//下边是operration.h文件中的
void Find_Class_number(Linkhead head,int *N1,int *N2,int *N3,int *N4)
{
Linkhead p =head->next;
while(p)
{
if(strcmp(p->Class,"1") == 0)
(*N1)++;
if(strcmp(p->Class,"2") == 0)
(*N2)++;
if(strcmp(p->Class,"3") == 0)
(*N3)++;
p = p->next;
}
}

Status Creat_Classrom(Linkhead head,Linkhead *stu,char *Class,int N)
{
Linkhead p = head->next;
int i =0;

(*stu) = (stu_node *)malloc(N * sizeof(stu_node));
while(p)
{
if(strcmp(Class,p->Class) == 0)
{
(*stu)[i].name = p->name;
(*stu)[i].ID = p->ID;
(*stu)[i].Class = p->Class;
(*stu).[i].course1 = p->course1;
(*stu).[i] = p->course2;
}//在这里报错如上,不能这样赋值吗?
i++;
p = p->next;
}
return OK;
}

void sort_calssgrade(stu_node stu[],int n)
{
stu_node t;
int i,j,k;

for(i = 0;i < n-1;i++)
{
t = stu[i];
k = i;
for(j = i+1;j < n;j++)
{
if((stu[j].course1 + stu[j].course2) >(t.course1 + t.course2))
{
t = stu[j];
k = j;
}
}
if(k != i)
{
t = stu[k];
stu[k] = stu[i];
stu[i] = t;
}
}
}

void print_classgrade(stu_node stu[],int n)
{
int i;
printf("姓名\t学号\t班级\tcourse1成绩\tcourse2成绩\t课程总分\n");
for( i = 0;i<n;i++)
{
printf("%s\t%s\t%s\t%d\t\t%d\t\t%d\n",stu[i].name,stu[i].ID,stu[i].Class,stu[i].course1,stu[i].course2,stu[i].course1+stu[i].course2);
}
}
Status Search_stu_info(Linkhead head)
{
int choice,C;
int N1,N2,N3,N4;


char num[10];
Linkhead p = head->next,stu;

system("cls");
Find_Class_number(head,&N1,&N2,&N3,&N4);
printf("******************************************************\n\t\t\t成绩查询\n");
printf("******************************************************\n");
printf("\t\t\t1:按班级查询,输出班级成绩单\n\t\t\t2:按学号查询\n\t\t\t3:按姓名查询\n\t\t\t4:按课程查询");
do{
        printf("\n\t\t\tEnter your choice(1~2):");  
        scanf("%d",&choice);
       }while(choice<1||choice>4); 
switch(choice)
{
case 1:
system("cls");
for(;;)
{
printf("******************************************************\n\t\t\t选择所需查询班级\t\t\t输入-1表示退出");
printf("\t\t\t1:1班\n\t\t\t1:2班\n\t\t\t1:3班\n");
p =head->next;
scanf("%d",&C);
if(C == 1)
{
num[10] = '1';
Creat_Classrom(head, &stu,num,N1);
sort_calssgrade(stu,N1);
print_classgrade(stu,N1);
}//这些操作调用上边的操作函数
if(C == 2)
{
num[10] = '2';
Creat_Classrom(head, &stu,num,N2);
sort_calssgrade(stu,N2);
print_classgrade(stu,N2);
}
if(C == 3)
{
num[10] = '3';
Creat_Classrom(head, &stu,num,N3);
sort_calssgrade(stu,N3);
print_classgrade(stu,N3);
}
if(C == -1)
break;
}break;
case 2:
system("cls");
for(;;)
{
p =head->next;
printf("******************************************************\n");
printf("请输入:\n所需查询的学生学号\n\t\t\t输入学号为-1结束修改操作:\n");
scanf("%s%*c",num);
if(strcmp(num ,"-1") == 0)
break;
if(findID(&p,NULL,num))
{
printf("----------------------\n");
printf("姓名\t学号\t班级\tcourse1成绩\tcourse2成绩\t课程总分");
printf("%s\t%s\t%s\t%d\t\t%d\t\t%d\n",p->name,p->ID,p->Class,p->course1,p->course2,p->course1+p->course2);
}
else
printf("未找到学号为%s的学生信息\n",num);
}break;
case 3:
system("cls");
for(;;)
{
p =head->next;
printf("******************************************************\n");
printf("请输入:\n所需查询的学生姓名\n\t\t\t输入姓名为-1结束修改操作:\n");
scanf("%s%*c",num);
if(strcmp(num ,"-1") == 0)
break;
if(findName(&p,NULL,num))
{
printf("----------------------\n");
printf("姓名\t学号\t班级\tcourse1成绩\tcourse2成绩\t课程总分");


printf("%s\t%s\t%s\t%d\t\t%d\t\t%d\n",p->name,p->ID,p->Class,p->course1,p->course2,p->course1+p->course2);
}
else
printf("未找到学号为%s的学生信息\n",num);
}break;
}
return OK;
}


[解决办法]
你排序中
if(k != i)
{
t = stu[k];
stu[k] = stu[i];
stu[i] = t;
}
错了吧 没考虑链表的next指针

热点排行
Bad Request.