一个学生信息管理系统的问题,学号排序,成绩排序,按学院统计人数

xwchenhui001 2010-06-04 08:26:47
下面是整段代码,填上最后三段即可
void sort_num()
void sort_score()
void count_academy()
因为是用字符串是用指针读的,我不知道该怎么进行冒泡排序,请各位赐教。


#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <io.h>
#define NULL 0
#define LEN sizeof(struct student)
#define FILE_DATA_PATH "student.txt"

struct student
{
long int num;
char name[20];
int age;
long int score;
char academy[20];
struct student *next;
};

int TOTAL_NUM = 0;
struct student *head = NULL;

void mainmenu();
void record();
void insert(struct student *stu);
void display(struct student *stu);
void displayAll();
void query();
void query_by_num();
void query_by_name();
void readData();
void writeData();
void freeAll();
void sort_num();

int main()
{
mainmenu();
}

//系统主菜单
void mainmenu()
{
int choice;
choice = -1;
readData();
printf("\n温馨提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n");
do
{
printf("\n\n\n");
printf("\t\t\t--------------------------------\n");
printf("\t\t\t+ 学生信息管理系统 |\n");
printf("\t\t\t--------------------------------\n");
printf("\t\t\t+ [1]----录入学生信息 |\n");
printf("\t\t\t+ [2]----按学号排序 |\n");
printf("\t\t\t+ [3]----按入学成绩排序 |\n");
printf("\t\t\t+ [4]----按学号查询 |\n");
printf("\t\t\t+ [5]----按姓名查询 |\n");
printf("\t\t\t+ [6]----按学院统计人数 |\n");
printf("\t\t\t+ [0]----退出系统 |\n");
printf("\t\t\t+*·*·*·*·*·*·*·*·*·*·|\n");
printf("\t\t\t--------------------------------\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch(choice)
{
case 0:
writeData();
freeAll();
exit(0);
case 1:
record();
break;
case 2:
displayAll();
break;
case 3:
sort_num();
break;
case 4:
query_by_num();
break;
case 5:
query_by_name();
break;
default:
printf("\n无效选项!");
break;
}
}
while(choice != 0);
}
//录入学生信息
void record()
{
struct student *p0;

p0 = (struct student *)malloc(LEN);
printf("请输入学生的学号:");
scanf("%ld",&p0->num);
printf("请输入学生的姓名:");
scanf("%s",p0->name);
printf("请输入学生的年龄:");
scanf("%d",&p0->age);
printf("请输入学生的入学成绩:");
scanf("%ld",&p0->score);
printf("请输入学生的学院:");
scanf("%s",p0->academy);

insert(p0);
printf("该学生的信息为:\n");
printf("-------------------------------------------------------------------------------");
printf("学号\t姓名\t年龄\t入学成绩\t学院\n");
display(p0);
}

void insert(struct student *stu)
{
struct student *p0, *p1, *p2;

p1 = head;
p0 = stu;

if(head == NULL)
{
head = p0;
p0->next = NULL;
}
else
{
while((p0->num > p1->num)&&(p1->next != NULL))
{
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1)
head = p0;
else
p2->next = p0;
p0->next = p1;
}
else
{
p1->next = p0;
p0->next = NULL;
}
}
TOTAL_NUM++;
}

void display(struct student *p)
{
printf("%ld\t%s\t%d\t%ld\t\t%s\n", p->num, p->name, p->age, p->score, p->academy);
}
//浏览学生信息
void displayAll()
{
struct student *p;

printf("学生总数:%d\n", TOTAL_NUM);
p = head;
if(head != NULL)
{
printf("\n学号\t姓名\t年龄\t入学成绩\t学院\n");
printf("--------------------------------------------------------------------------------");
do
{
display(p);
p = p->next;
}
while(p != NULL);
}
printf("\n");
}
//查询学生信息
void query()
{
int choice;
choice = -1;
do
{
printf("\n");
printf("+--------------------+\n");
printf("| 按学号查询 请按 1 |\n");
printf("| 按姓名查询 请按 2 |\n");
printf("| 取消 请按 0 |\n");
printf("+--------------------+\n");

printf("请输入您的选择:");
scanf("%d", &choice);

switch(choice)
{
case 0:
return;
case 1:
query_by_num();
break;
case 2:
query_by_name();
break;
default:
printf("\n无效选项!");
break;
}
}
while(choice != 0);
}
//按学号查询学生信息
void query_by_num()
{
int num;
struct student *p1;

printf("请输入学生的学号:");
scanf("%ld", &num);
if(head==NULL)
{
printf("无学生记录!\n");
return;
}
p1=head;
while(num!=p1->num && p1->next!=NULL)
p1=p1->next;
if(num == p1->num)
{
printf("\n学号\t姓名\t年龄\t入学成绩\t学院\n");
printf("--------------------------------------------------------------------------------");
display(p1);
}
else
printf("没有该学生记录,请核对!");
}
//按姓名查询学生信息
void query_by_name()
{
char name[20];
struct student *p1;

printf("请输入学生的姓名:");
scanf("%s", name);
if(head==NULL)
{
printf("无学生记录!\n");
return;
}
p1=head;
while(strcmp(name, p1->name) && p1->next!=NULL)
p1=p1->next;
if(!strcmp(name, p1->name))
{

printf("\n学号\t姓名\t年龄\t入学成绩\t学院\n");
printf("--------------------------------------------------------------------------------");
display(p1);
}
else
printf("没有该学生记录,请核对!");
}
//写入文件
void writeData()
{
FILE* fp;//文件指针
struct student *p;

fp = fopen(FILE_DATA_PATH, "w");
if (!fp)
{
printf("文件打开错误!");
return;
}

fprintf(fp,"%d\n", TOTAL_NUM);
for(p = head; p!= NULL; p= p->next)
{
fprintf(fp,"%ld\t%s\t%d\t%ld\t%s\n",
p->num, p->name, p->age, p->score, p->academy);
}
fclose(fp);
}

void freeAll()
{
struct student *p1, *p2;

p1=p2=head;
while(p1)
{
p2=p1->next;
free(p1);
p1=p2;
}
}
//读取文件
void readData()
{
FILE* fp;//文件指针
struct student *p1, *p2;

fp = fopen(FILE_DATA_PATH, "r");
if (!fp)
{
printf("文件打开错误!");
return 0;
}

fscanf(fp,"%d\n", &TOTAL_NUM);
head = p1 = p2 = (struct student *)malloc(LEN);
fscanf(fp,"%ld\t%s\t%d\t%ld\t%s\n",
&p1->num, p1->name, &p1->age, &p1->score, p1->academy);
while(!feof(fp))
{
p1 = (struct student *)malloc(LEN);
fscanf(fp,"%ld\t%s\t%d\t%ld\t%s\n",
&p1->num, p1->name, &p1->age, &p1->score, p1->academy);
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
fclose(fp);
}

void sort_num()//按学号排序
{

}

void sort_score()// 按入学成绩排序
{

}

void count_academy() // 按学院统计人数
{

}
...全文
2366 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwchenhui001 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ican008 的回复:]

提出关键问题就可以了,写那么长的代码是没几个人愿意看的!学习的主要是方法,原理,而不是背代码
[/Quote]
主要是不好形容。。。
xwchenhui001 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kuyucman 的回复:]

引用 5 楼 xwchenhui001 的回复:
引用 3 楼 kuyucman 的回复:

链表 ,用归并吧。

汗,不懂。
能不能先把指针里学号的数据读到一个数组里,然后进行冒泡排序,最后根据结果找出指针里的对应项输出呢?


这样的话,不是没事找事吗,数据量大的时候,你还要喝杯茶等他排完序?看看上边我发的那个链接,里面有答案。
[/Quote]
看不懂,这个是帮MM做的,今天是突击C语言,嘿嘿。。。
貌似是作业,整好了给交上去就行,给的参考源码里都是用冒泡排序法。
ican008 2010-06-04
  • 打赏
  • 举报
回复
提出关键问题就可以了,写那么长的代码是没几个人愿意看的!学习的主要是方法,原理,而不是背代码
东莞某某某 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xwchenhui001 的回复:]
引用 3 楼 kuyucman 的回复:

链表 ,用归并吧。

汗,不懂。
能不能先把指针里学号的数据读到一个数组里,然后进行冒泡排序,最后根据结果找出指针里的对应项输出呢?
[/Quote]

这样的话,不是没事找事吗,数据量大的时候,你还要喝杯茶等他排完序?看看上边我发的那个链接,里面有答案。
xwchenhui001 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kuyucman 的回复:]

链表 ,用归并吧。
[/Quote]
汗,不懂。
能不能先把指针里学号的数据读到一个数组里,然后进行冒泡排序,最后根据结果找出指针里的对应项输出呢?
东莞某某某 2010-06-04
  • 打赏
  • 举报
回复
糗大了,搞错了。没整出来。

这里有个帖子讨论 list的排序:
http://topic.csdn.net/t/20010910/23/281195.html

同意用插入排序。
东莞某某某 2010-06-04
  • 打赏
  • 举报
回复
链表 ,用归并吧。
xwchenhui001 2010-06-04
  • 打赏
  • 举报
回复
没人么?自顶!
liutengfeigo 2010-06-04
  • 打赏
  • 举报
回复
楼主比我犀利多了~~!呵呵~

70,013

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧