比我的学生系统你吧,你改下就差不多少~~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct Student{
//链表的数据结构
int number ;
char name[20] ;
char grad[20] ;
char profess[30] ;
float score[5] ;
struct Student *next ;
}Student,*LinkList;
void CreateList(LinkList &T){
//初始化链表
T = (LinkList)malloc(sizeof(Student)) ;
T->next = NULL;
}
void print(LinkList T){
//把链表的数据输出
LinkList p = T ;
int j=0 ;
if(p->next){
while(p->next){
p = p->next ;
printf("学号: %d,姓名: %s,年级: %s,专业: %s 成绩 :(%3.2f
%3.2f
%3.2f)
\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
}
}else{
printf("没有数据可输出!!!\n") ;
}
}
void RearInsert(LinkList &T){
//尾插入结点
int number ;
char chars[3][20] ;
float score[3] ;
LinkList p = T;
printf("请输入要添加的记录: \n") ;
printf("\n请以(25 梁卓文 大二 计算机 100 89 87)的形式输入学生资料: \n") ;
scanf("%d %s %s %s %f %f %f",&number,chars[0],chars[1],chars[2],&score[0],&score[1],&score[2]) ;
while(p->next){
//找到最后一个结点
p=p->next ;
}
LinkList q = (LinkList)malloc(sizeof(Student)) ;
strcpy(q->name,chars[0]) ; strcpy(q->grad,chars[1]) ;strcpy(q->profess,chars[2]) ;
q->number = number ;
q->score[0] = score[0] ;
q->score[1] = score[1] ;
q->score[2] = score[2] ;
q->score[3] = (q->score[0]+q->score[1]+q->score[2])/3 ;
q->score[4] = (q->score[0]+q->score[1]+q->score[2]) ;
p->next = q ;
q->next = NULL ;
printf("添加后为: \n") ;
print(T) ;
}
void NumberDelete(LinkList &T){
//删除给出学号的结点,找不到则不做任何操作
int number ;
printf("\n请输入要删除的学号 :") ;
scanf("%d",&number) ;
if (T->next){
if (number>0){
LinkList p = T ;
if (T->next->next==NULL&&T->next->number==number){
free(T->next) ;
T->next =NULL ;
return ;
//删了就跳出函数
}
while (p->next){
if (p->next->number==number){
LinkList q = p->next ;
//记录下p->next结点
p->next = q ->next ;
free(q) ;
return ;
//删了就跳出函数
}
p = p->next ;
}
printf("没有可删除的学号!!!") ;
}else
printf("学号有错误!!!") ;
}else
printf("链表为空!!!") ;
}
void NameDelete(LinkList &T){
//删除给出姓名的结点,找不到则不做任何操作
char name[20] ;
printf("\n请输入要删除的姓名 :") ;
scanf("%s",name) ;
if (T->next){
LinkList p = T ;
if (T->next->next==NULL&&strcmp(T->next->name,name)==0){
free(T->next) ;
T->next =NULL ;
return ;
//删了就跳出函数
}
while (p->next){
if (strcmp(T->next->name,name)==0){
LinkList q = p->next ;
//记录下p->next结点
p->next = q ->next ;
free(q) ;
return ;
//删了就跳出函数
}
p = p->next ;
}//while
printf("没有可删除的姓名!!!") ;
}else
printf("链表为空!!!") ;
}
void Delete(LinkList &T){
//调用上面两个删除函数
int n=0 ;
printf("请选择查找的方法: 1.学号 2.姓名 : ") ;
scanf("%d",&n) ;
if (n==1){
NumberDelete(T) ;
}
if (n==2){
NameDelete(T) ;
}
printf("\n删除后为: \n") ;
print(T) ;
}
void SeachNumber(LinkList T){
//按学号查找并修改
if (T->next==NULL){
printf("链表为空没有数据!!!\n") ;
return
;
}
int n,m,number ;
char chars[20] ;
float score=0.0 ;
LinkList p = T ;
printf("\n请输入要修改的学生学号 :") ;
scanf("%d",&number) ;
while (p->next){
p=p->next ;
if (p->number==number){
printf("找到的资料: \n") ;
printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
do{
printf("------------------------\n") ;
printf("
你要修改?
\n") ;
printf("
1.学号
2.姓名
\n") ;
printf("
3.年级
4.专业
\n") ;
printf("
5.成绩1
6.成绩2
\n") ;
printf("
7.成绩3
\n") ;
printf("
0.退出修改
\n") ;
printf("------------------------\n") ;
printf("输入你要选择的操作: ");
scanf("%d",&n) ;
switch(n){
case 1: printf("改为: ") ;scanf("%d",&m) ;p->number = m ;break ;
case 2: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->name,chars) ;break ;
case 3: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->grad,chars) ;break ;
case 4: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->profess,chars) ;break ;
case 5: printf("改为: ") ;scanf("%f",&score) ;p->score[0] = score ;break ;
case 6: printf("改为: ") ;scanf("%f",&score) ;p->score[1] = score ;break ;
case 7: printf("改为: ") ;scanf("%f",&score) ;p->score[2] = score ;break ;
case 0: return ;
default: printf("请正确输入!!!");break ;
}
printf("\n改后为: \n") ;printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
}while (1);
}
}
printf("找不到数据!!!") ;
}
void SeachName(LinkList T){
//按姓名查找并修改
if (T->next==NULL){
printf("链表为空没有数据!!!\n") ;
return
;
}
int n,m ;
char chars[20],name[20] ;
float score=0.0 ;
LinkList p = T ;
printf("\n请输入要修改的学生的姓名 :") ;
scanf("%s",name) ;
while (p->next){
p=p->next ;
if (strcmp(p->name,name)==0){
printf("找到的资料: \n") ;
printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
do{
printf("------------------------\n") ;
printf("
你要修改?
\n") ;
printf("
1.学号
2.姓名
\n") ;
printf("
3.年级
4.专业
\n") ;
printf("
5.成绩1
6.成绩2
\n") ;
printf("
7.成绩3
\n") ;
printf("
0.退出修改
\n") ;
printf("------------------------\n") ;
printf("输入你要选择的操作: ");
scanf("%d",&n) ;
switch(n){
case 1: printf("改为: ") ;scanf("%d",&m) ;p->number = m ;break ;
case 2: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->name,chars) ;break ;
case 3: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->grad,chars) ;break ;
case 4: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->profess,chars) ;break ;
case 5: printf("改为: ") ;scanf("%f",&score) ;p->score[0] = score ;break ;
case 6: printf("改为: ") ;scanf("%f",&score) ;p->score[1] = score ;break ;
case 7: printf("改为: ") ;scanf("%f",&score) ;p->score[2] = score ;break ;
case 0: return ;
default: printf("请正确输入!!!");break ;
}
printf("\n改后为: \n") ;printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
}
while (1);
}
}
printf("找不到数据!!!") ;
}
void Revise(LinkList &T){
//修改函数,调用上面两个函数
int n=0 ;
printf("请选择查找的方法: 1.学号 2.姓名 : ") ;scanf("%d",&n) ;
if (n==1){
SeachNumber(T) ;
}
if (n==2){
SeachName(T) ;
}
printf("\n修改后为: \n") ;
print(T) ;
}
void ScoreSort(LinkList &L){
//按成绩排序(交换指针排序)
if (L->next){
LinkList p1,p10,p2,p20;
LinkList pt,pm0,pm;
float x;
p10=L;
p1=L->next;
while(p1->next){
x=p1->score[3];
p20=p1;
p2=p1->next;
while(p2){
if(x-p2->score[3]<0.01){
x=p2->score[3];
pm0=p20;
pm=p2;
}
p20=p20->next;
p2=p20->next;
}//whlie
if(x-(p1->score[3])<-0.01||x-(p1->score[3])>0.01){
if(pm==p1->next){
p10->next=pm;
pt=pm->next;
pm->next=p1;
p1->next=pt;
}else{
p10->next=pm;
pt=pm->next;
pm->next=p1->next;
pm0->next=p1;
p1->next=pt;
}
}//if
p10=p10->next;
p1=p10->next;
}//while
} //if
}
void Write(LinkList T){
//写入文件
FILE *fp ;
LinkList p = T->next;
char stud[20] ;
printf("请输入保存文件名: ") ;
scanf("%s",stud) ;
if((fp=fopen(stud,"w"))==NULL){
printf("无法打开文件!!!") ;
fclose(fp) ;
return ;
//退出函数
}
printf("\n你存入的数据为: \n") ;
while (p){
fprintf(fp,"%d %s %s %s %3.2f %3.2f %3.2f\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
p = p->next ;
}
fclose(fp) ;
}
int sum;
//用num来记录链表个数
void Read(float yun[]){
//读取文件
sum=0 ;
FILE *out ;
LinkList p = (LinkList)malloc(sizeof(Student)) ;//新建一个链表来存放读取的数据
p->next = NULL ;
char stud[20] ;
printf("请输入要打开的文件名: ") ;
scanf("%s",stud) ;
if((out=fopen(stud,"r"))==NULL){
printf("无法打开文件!!!") ;
fclose(out) ;
return ;
//退出函数
}
printf("\n文件数据为: \n") ;
while(!feof(out)){
fscanf(out,"%d %s %s %s %f %f %f\n",
&p->number,p->name,p->grad,p->profess,&p->score[0],&p->score[1],&p->score[2])
;
printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
yun[sum] = p->score[0]+p->score[1]+p->score[2] ;
sum++ ;
}
fclose(out) ;
}
void HalfSort(float yun[],float score){
//折半查找一个数据
int i,m,low,high ;
low = 0 ; high=sum ;
//sum为读取数据时统计元素的个数
while (low<=high){
m= (low+high)/2 ;
if (yun[m]==score){
printf("总分为%3.2f的有一个人!!!",score) ;
return ;
//退出函数
}
if (yun[m]<score){
high = m-1 ;
}
if (yun[m]>score){
low = m+1 ;
}
}
printf("没有人总分为: %3.2f",score) ;
}
void ReadAndSave(LinkList &T,float yun[]){
//显示,保存
int n=0 ;
printf("现在有数据: \n") ;
print(T) ;
printf("\n请选择; 1.保存数据 2.打开数据") ;
scanf("%d",&n) ;
if (n==1)Write(T) ;
if (n==2)Read(yun) ;
if (n!=1&&n!=2)printf("输入错误!!!") ;
}
void SortAndSave(LinkList &T){
//排序并保存
int n =0 ;
printf("请选择: 1.按平均分排序 2.按总分排序 : ") ;scanf("%d",&n) ;
if (n==1){
printf("\n按平均分排序后: \n") ;ScoreSort(T) ;print(T) ;Write(T) ;
}
if (n==2){
printf("\n按总分排序后: \n") ;ScoreSort(T) ;print(T) ;Write(T) ;
}
}
void Seach(LinkList &T,float yun[]){
//查找给定的分数
float score ;
printf("请输入你要找的分数: ") ;
scanf("%f",&score);printf("\n") ;
Read(yun) ;
HalfSort(yun,score) ;
}
void Enter(){
//密码函数
int number,i ;
int mima=25 ;
for (i=0;i<3 ;i++ ){
printf("请输入密码: ") ;
scanf("%d",&number) ;
if (number==mima){
printf("
欢迎进入系统 \n") ;
return ;
}
printf("你第%d次输入密码错误!!!\n",i+1) ;
}
exit(1) ;
}
void main(){
float yun[MAX] ; //用于存放读取链表中的总分
int c ;
Enter() ;
LinkList T ;
CreateList(T) ;
do{
printf("--------------------------------\n") ;
printf("(五)学生成绩管理系统
\n") ;
printf("
1.添加记录
\n") ;
printf("
2.删除记录
\n") ;
printf("
3.修改记录
\n") ;
printf("
4.显示、保存记录
\n") ;
printf("
5.排序并保存
\n") ;
printf("
6.查询功能
\n") ;
printf("
7.输出全部
\n") ;
printf("
0.退出系统
\n") ;
printf("--------------------------------\n") ;
printf("输入你要选择的操作: ");
scanf("%d",&c) ;
switch (c){
case 1: RearInsert(T) ;break ;
case 2:
Delete(T) ;break ;
case 3:
Revise(T) ;break ;
case 4:
ReadAndSave(T,yun) ;break ;
case 5:
SortAndSave(T) ;break ;
case 6: Seach(T,yun) ;break ;
case 7: print(T) ;break ;
case 0: return ;
default :printf("请正确输入!!") ;break ;
}
putchar(10) ;
getchar() ;
}while (1);
}