发个百分贴,在此求助各位,希望有人可以帮帮我,谢谢
我刚刚学c语言不久,本人自我感觉不是太能干得那种,因此学习起来感觉很是吃力啊,不过呢,还好到现在还可以坚持,呵呵,好不容易终于可以编写自己的第一个学生信息管理系统程序啦,但是能力有限对于链表的运用不是太熟练,写的程序很丑,我至此还没能够完全写完,希望各位可以给点指点,若果可以的话给写个示例程序,我学习下,谢谢,如果占用各位时间的话,可以指点一下也好。对于评论帖子的各位也表示感谢啦,大家重在参与嘛我要实现的功能是:
第一:键盘输入和文件输入学生信息
第二:保存这些信息
第三:通过排序(学号,姓名,分数都可以)然后输出
排序输出是重中之中我跟人觉得,就是这里还写不好
如下:
110 uimg 50
119 haid 60
103 huid 90
储存之后学号排序后输出:
103 huid 90
110 uimg 50
119 haid 60
希望各位可以给予指点和帮助 谢谢啦
这是我写的很丑的程序,各位见谅啦,我没能实现排序输出:
请批评指教 谢谢
程序代码: #include<stdio.h>
#include<stdlib.h>
int N;
void homepage();
void into();
void lists();
void outputtypes();
struct student * head;
struct student
{
int num;
char name[20];
int grade;
struct student * next;
};
void keyboards()//录入学生信息子函数(从键盘录入具有报重提示)
{
struct student *p1,*p2;
N=0;
p1=p2=(struct student *)malloc(sizeof(struct student));
printf("学生学号\t学生姓名\t学生成绩\n");
scanf("%d %s %d",&p1->num,p1->name,&p1->grade);
while(p1->num!=0)
{
N=N+1;
if(N==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student * )malloc(sizeof(struct student));
scanf("%d %s %d",&p1->num,p1->name,&p1->grade);
if(p1->num==p2->num)
{
printf("\n\n\t当前输入学号与前面重复,请检查后重新输入!\n\n");
p1=(struct student * )malloc(sizeof(struct student));
scanf("%d %s %d",&p1->num,p1->name,&p1->grade);
}
}
p2->next=NULL;
system("cls");
into();
}
void files()//录入学生信息子函数(从文件录入)
{
int i=0;
FILE * fp;
char filepath[20];
struct student *p1,*p2;
N=0;
printf("输入要读入的文件路径:");
getchar();
gets(filepath);
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!\n",filepath);
exit(0);
}
p1=p2=(struct student*)malloc(sizeof(struct student));
fread(p1,sizeof(struct student),1,fp);
head=NULL;
while(!feof(fp))
{
i=0;
N=N+1;
if(N==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student * )malloc(sizeof(struct student));
fread(p1,sizeof(struct student),1,fp);
}
p2->next=NULL;
system("cls");
lists();
printf("\n\n");
}
void inputs()//录入学生信息主函数
{
int i;
printf("\t\t\t录入学生信息\n");
printf("\n1.从键盘录入\n");
printf("2.从文件录入\n");
printf("3.返回主菜单\n");
printf("请选择(1~3):\n");
scanf("%d",&i);
switch(i)
{
case(1):system("cls");keyboards();break;
case(2):files();break;
case(3):system("cls");break;
}
}
void inserts(struct student * incouse)//学生信息管理子函数(添加学生信息)
{
struct student *p0,*p1,*p2;
p1=head;
p0=incouse;
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;
}
}
N=N+1;
system("cls");
printf("\t\t\t\t…………学生信息已经保存………\n");
homepage();
}
void dels(int num)//学生信息管理子函数(删除学生信息)
{
struct student *p1,*p2;
int i;
if(head==NULL)
{
printf("\n没有该学生信息,无法删除!\n");
goto end;
}
p1=head;
while(num!=p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head) head=p1->next;
else p2->next=p1->next;
N=N-1;
system("cls");
printf("\t\t\t\t…………学生信息已经删除………\n");
printf("\t\t\t\t…………此信息为当前信息………\n");
lists();
}
else
{
printf("无该学号的学生!\n");
printf("请你再次确认!\n\n");
scanf("%d",&i);
dels(i);
}
end:;
}
void managements()//学生信息管理主函数
{
struct student * incouse;
int i,num;
printf("\t\t\t学生信息管理\n");
printf("1.新增学生信息\n");
printf("2.删除学生信息\n");
printf("3.返回主菜单\n");
printf("请选择(1~3):\n");
scanf("%d",&i);
switch(i)
{
case(1):
{
incouse=(struct student *)malloc(sizeof(struct student));
printf("学生学号\t学生姓名\t学生成绩\n");
scanf("%d %s %d",&incouse->num,incouse->name,&incouse->grade);
inserts(incouse);
break;
}
case(2):
{
printf("请输入要删除学生的学号:\n");
scanf("%d",&num);
dels(num);
break;
}
case(3):system("cls");break;
}
}
void lists()//输出学生信息
{
struct student * p;
p=head;
printf("学生学号 学生姓名 学生成绩\n");
while(p!=NULL)
{
printf("%-4d %10s %10d\n",p->num,p->name,p->grade);
p=p->next;
}
printf("\n\n\n");
homepage();
}
void intos()//存储学生信息
{
FILE * fp;
struct student * p;
char filepath[30];
printf("输入学生信息要保存的文件路径:");
getchar();
gets(filepath);
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失败!");
exit(0);
}
p=head;
while(p!=NULL)
{
fwrite(p,sizeof(struct student),1,fp);
p=p->next;
}
fclose(fp);
system("cls");
printf("\n\n");
printf("\t\t\t学生信息已保存在%s中!\n\n\n",filepath);
homepage();
}
void into()//存储信息
{
int i;
printf("1.存储学生信息\n");
printf("2.返回主菜单\n");
printf("请输入(1~2)\n");
scanf("%d",&i);
switch(i)
{
case(1):intos();break;
case(2):system("cls");break;
}
}
void store()//信息主函数用于查看和储存学生信息
{
int i;
printf("\t\t系统信息查看及存储\n");
printf("1.查看学生信息\n");
printf("2.存储信息\n");
printf("3.返回主菜单\n");
printf("请输入(1~3):\n");
scanf("%d",&i);
switch(i)
{
case(1):
system("cls");
//outputtypes();
lists();
homepage();
break;
case(2):into();break;
case(3):system("cls");break;
}
}
void homepage()
{
int i;
printf("\t友情提示:输入(1):\n");
printf("\t返回主菜单\n");
scanf("%d",&i);
if(i<1 || i>2)
{
printf("输入错误,请重输:\n");
}
switch(i)
{
case(1):
{
system("cls");
break;
}
}
}
int main()//主函数
{
int i,j;
while(1)
{
printf("\n\t请输入密码进行验证登陆:\n");
printf("\t\t");
scanf("%d",&j);
if(j==123)
break;
else
{
printf("你输入的密码有误,请重新输入!\n");
scanf("%d",&j);
system("cls");
}
}
system("cls");
start:
printf("\n\t\t\t欢迎使用学生信息管理系统!\n");
printf("菜单:\n");
printf("1.录入学生信息\n");
printf("2.学生信息管理\n");
printf("3.系统信息查看及存储\n");
printf("4.退出系统\n");
printf("\n请输入菜单选项(1~4):\n");
scanf("%d",&i);
if(i<1 || i>4)
{
printf("输入错误,请重输:\n");
goto start;
}
switch(i)
{
case(1):
{
system("cls");
inputs();
goto start;
break;
}
case(2):
{
system("cls");
managements();
goto start;
break;
}
case(3):
{
system("cls");
store();
goto start;
break;
}
case(4):
{
system("cls");
printf("\n\n\t\t\t感谢使用本系统!\n\n\t\t\t再见!\n\n\n\n\n\n");
}
}
return(0);
}









开个玩笑,是为了练习使用链表的话我就不多说什么了,链表用在这里效率一般。换用数组吧,动态扩展数组。