#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
int num;
char name[20];
char sex[20];
int English;
int C;
int sum;
struct student *next; //指向下个结点的指针
};
void login();//登录
void select();//控制函数(菜单)
void input(struct student *p,FILE *fp,int n);//输入学生信息
void output(struct student *p,FILE *fp,int n);//浏览(输出)学生信息
int query(struct student *p,FILE *fp,int n);//查询学生信息
void remove(struct student *p,FILE *fp,int n);//删除学生信息
void sort(struct student *p,FILE *fp,int n);//统计(排序)学生成绩
int main()
{
struct student s[200];
FILE *fp;
int n;
//login();//登录
int option;//菜单选择
while(1)
{
select();//控制函数(菜单)
printf("请输入你的选择: ");
scanf("%d",&option);
switch(option)
{
case 1:
printf("请输入学生人数: ");
scanf("%d",&n);//输入当前学生人数(n)
input(s,fp,n);//输入
break;
case 2:
output(s,fp,n);//输出(浏览)
break;
case 3:
// query(s,fp,n);//查询
break;
case 4:
remove(s,fp,n);//删除
break;
case 5:
// sort(s,fp,n);//排序
break;
case 0:
exit(0);//正常退出
break;
default:
printf("您的输入有误,请重新输入!\n");
}
}
return 0;
}
//控制函数
void select()
{
printf("*********主菜单*********\n");
printf(" 1----------学生信息录入\n");
printf(" 2----------学生信息浏览\n");
printf(" 3----------学生信息查询\n");
printf(" 4----------学生信息删除\n");
printf(" 5----------学生成绩统计\n");
printf(" 0----------退出系统\n");
printf("************************\n");
}
//输入函数
void input(struct student *p,FILE *fp,int n)
{
int i;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("打开文件失败!");
exit(0);
}
printf("请输入\n");
printf("学号\t姓名\t性别\t英语成绩\tC语言成绩\n");
for(i=0;i<n;i++)
{
scanf("%d\t%s\t%s\t%d\t%d",&p->num ,p->name ,p->sex ,&p->English ,&p->C );
p->sum = p->English +p->C ;
//fprintf(fp,"%d %s %s %d %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );前后变量个数不同,导致产生随机数
fprintf(fp,"%d %s %s %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
//输出函数
void output(struct student *p,FILE *fp,int n)
{
int i;
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
//删除函数
void remove(struct student *p,FILE *fp,int n)
{
int option;
int i,j;
int flag=0;
int removenum;
char removename[20];
printf("*****删除*****\n");
printf("[1] 按学号删除\n");
printf("[2] 按姓名删除\n");
printf("**************\n");
printf("请输入你的选择: \n");
scanf("%d",&option);
if(option==1)
{
printf("请输入需删除信息的学生学号: ");
scanf("%d",&removenum);
struct student *head=NULL,*p1,*p2;
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
for(i=0;i<n;i++)
{
p=(struct student *)malloc(sizeof(struct student));
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
//被删除结点是表头结点
while(head!=NULL && head->num ==removenum)
{
p1=head;
head=head->next;
free(p1);
}
if(head==NULL)
{
exit(0);
}
//要被删除结点非表头结点
p1=head;
p2=head->next ;
while(p2!=NULL)
{
if(p2->num ==removenum)
{
p1->num =p2->num ;
free(p2);
break;
}
else
{
p1=p2;
}
p2=p1->next ;
}
n--;
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
if(flag==0)
{
printf("该学号不存在!\n");
return remove(p,fp,n);
}
/*if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
FILE *fp1;
fp1=fopen("student.txt","w");
for(i=0;i<n;i++)
{
fprintf(fp1,"%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
if(fclose(fp1))
{
printf("关闭文件失败!");
exit(0);
}*/
}
else if(option==2)
{
}
else
{
printf("无此选项! 请重新选择!\n");
return remove(p,fp,n);
}
}
编译通过,但没有运行结果,帮我调试一下啊啊啊啊啊啊啊
感谢感谢感谢
(正在大一,老师布置作业是学生信息管理系统,可以用数组完成,但链表始终不行,下面是我用数组写的代码)
然后想试试用链表删除学生信息,其他板块仍用数组
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
int num;
char name[20];
char sex[20];
int English;
int C;
int sum;
//struct stu_node *next; //指向下个结点的指针
};
void login();//登录
void select();//控制函数(菜单)
void input(struct student *p,FILE *fp,int n);//输入学生信息
void output(struct student *p,FILE *fp,int n);//浏览(输出)学生信息
int query(struct student *p,FILE *fp,int n);//查询学生信息
void remove(struct student *p,FILE *fp,int n);//删除学生信息
void sort(struct student *p,FILE *fp,int n);//统计(排序)学生成绩
int main()
{
struct student s[200];
FILE *fp;
int n;
login();//登录
int option;//菜单选择
while(1)
{
select();//控制函数(菜单)
printf("请输入你的选择: \n");
scanf("%d",&option);
switch(option)
{
case 1:
printf("请输入学生人数:");
scanf("%d",&n);//输入当前学生人数(n)
input(s,fp,n);//输入
break;
case 2:
output(s,fp,n);//输出(浏览)
break;
case 3:
query(s,fp,n);//查询
break;
case 4:
remove(s,fp,n);//删除
break;
case 5:
sort(s,fp,n);//排序
break;
case 0:
exit(0);//正常退出
break;
default:
printf("您的输入有误,请重新输入!\n");
}
}
return 0;
}
//控制函数
void select()
{
printf("*********主菜单*********\n");
printf(" 1----------学生信息录入\n");
printf(" 2----------学生信息浏览\n");
printf(" 3----------学生信息查询\n");
printf(" 4----------学生信息删除\n");
printf(" 5----------学生成绩统计\n");
printf(" 0----------退出系统\n");
printf("************************\n");
}
//登录函数
void login()
{
int option;
printf("********登录********\n");
printf(" 1----------用户登录\n");
printf(" 0----------退出系统\n");
printf("********************\n");
printf("请输入你的选择: \n");
scanf("%d",&option);
if(option==1)
{
int i;//输入密码的第i次(i<=3)
char username[20];//用户名
char userkey[20];//用户名密码
for(i=1;i<=3;i++)
{
printf("请输入用户名: ");
scanf("%s",username);
printf("请输入用户密码: ");
scanf("%s",userkey);
if(strcmp(username,"aa")==0 && strcmp(userkey,"0000")==0)
{
printf("登录成功!请继续操作!\n");
break;
}
else
{
printf("用户名或密码错误!您还有%d次机会!\n",3-i);
}
}
if(i>3)
{
printf("登录失败! 谢谢!\n");
exit(0);//输入次数达到上限,正常退出
}
}
else if(option==0)
{
exit(0);//正常退出
}
else
{
printf("输入错误! 请重新输入!\n");
return login();
}
/* switch(option)
{
case 1:
//输入用户名、密码进行登录
break;
case 0:
exit(0);//正常退出
break;
default:
printf("无此输入! 请重新输入!\n");
break;
}*/
}
//输入函数
void input(struct student *p,FILE *fp,int n)
{
int i;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("打开文件失败!");
exit(0);
}
printf("请输入\n");
printf("学号\t姓名\t性别\t英语成绩\tC语言成绩\n");
for(i=0;i<n;i++)
{
scanf("%d\t%s\t%s\t%d\t%d",&p->num ,p->name ,p->sex ,&p->English ,&p->C );
p->sum = p->English +p->C ;
//fprintf(fp,"%d %s %s %d %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );前后变量个数不同,导致产生随机数
fprintf(fp,"%d %s %s %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
//输出函数
void output(struct student *p,FILE *fp,int n)
{
int i;
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
//查询函数
int query(struct student *p,FILE *fp,int n)
{
int i;
int flag=0; //判断是否在文件中找到学号或姓名
int option;
int querynum;
char queryname[20];
printf("*****查询*****\n");
printf("[1] 按学号查询\n");
printf("[2] 按姓名查询\n");
printf("**************\n");
printf("请输入你的选择: \n");
scanf("%d",&option);
if(option==1)
{
printf("请输入查询学生的学号: ");
scanf("%d",&querynum);
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
if(querynum==p->num )
{
flag=1;
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
exit(0);
}
}
if(flag==0)
{
printf("该学号不存在!\n");
return query(p,fp,n);
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
else if(option==2)
{
printf("请输入查询学生的姓名: ");
scanf("%s",&queryname);
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
printf("学号 姓名 性别 英语 C语言 总成绩\n");
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
if(strcmp(queryname,p->name)==0 )
{
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
flag=1;
}
}
if(flag==0)
{
printf("该姓名不存在!\n");
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
else
{
printf("无此选项! 请重新选择!\n");
return query(p,fp,n);
}
//query()函数的组成结构
/*switch(option)
{
case 1:按学号查询;break;
case 2:按姓名查询;break;
default:printf("无此选项! 请重新选择!\n");exit(0);
}*/
}
//删除函数
void remove(struct student *p,FILE *fp,int n)
{
int option;
int i,j;
int flag=0;
int removenum;
char removename[20];
printf("*****删除*****\n");
printf("[1] 按学号删除\n");
printf("[2] 按姓名删除\n");
printf("**************\n");
printf("请输入你的选择: \n");
scanf("%d",&option);
if(option==1)
{
printf("请输入需删除信息的学生学号: ");
scanf("%d",&removenum);
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
for(i=0;i<n;i++)
{
if(removenum==p[i].num )
{
flag=1;
for(j=i;j<n-1;j++)
{
p[j]=p[j+1];
}
break;
}
}
n--;
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
if(flag==0)
{
printf("该学号不存在!\n");
return remove(p,fp,n);
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
FILE *fp1;
fp1=fopen("student.txt","w");
for(i=0;i<n;i++)
{
fprintf(fp1,"%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
if(fclose(fp1))
{
printf("关闭文件失败!");
exit(0);
}
}
else if(option==2)
{
printf("请输入需删除信息的学生姓名: ");
scanf("%s",&removename);
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
for(i=0;i<n;i++)
{
if(strcmp(removename,p[i].name )==0)
{
flag=1;
for(j=i;j<n-1;j++)
{
p[j]=p[j+1];
}
break;
}
}
n--;
printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
if(flag==0)
{
printf("该姓名不存在!\n");
return remove(p,fp,n);
}
if(fclose(fp))
{
printf("关闭文件失败!");
exit(0);
}
}
else
{
printf("无此选项! 请重新选择!\n");
return remove(p,fp,n);
}
}
//(成绩统计)排序函数
void sort(struct student *p,FILE *fp,int n)
{
struct student temp;
int option;
int i,j;
printf("******成绩统计******\n");
printf("[1] 按英语成绩统计\n");
printf("[2] 按C语言成绩统计\n");
printf("[3] 按总成绩统计\n");
printf("********************\n");
printf("请输入你的选择: \n");
scanf("%d",&option);
if(option==1||option==2||option==3)
{
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("信息未存储!");
exit(0);
}
if(option==1)
{
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
for(i=1;i<n;i++) //用冒泡排序从大到小比较
{
for(j=0;j<n-i;j++)
{
if(p[j].English <p[j+1].English )
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("名次\t学号\t姓名\t性别\t英语\n");
for(i=0;i<n;i++)
{
printf("NO.%d\t",i+1);
printf("%d\t%s\t%s\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English);
}
}
else if(option==2)
{
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
for(i=1;i<n;i++) //用冒泡排序从大到小比较
{
for(j=0;j<n-i;j++)
{
if(p[j].C <p[j+1].C )
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("名次\t学号\t姓名\t性别\tC语言\n");
for(i=0;i<n;i++)
{
printf("NO.%d\t",i+1);
printf("%d\t%s\t%s\t%d\t\n",p[i].num, p[i].name, p[i].sex, p[i].C);
}
}
else if(option==3)
{
for(i=0;i<n;i++)
{
fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
}
for(i=1;i<n;i++) //用冒泡排序从大到小比较
{
for(j=0;j<n-i;j++)
{
if(p[j].sum <p[j+1].sum )
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("名次\t学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
for(i=0;i<n;i++)
{
printf("NO.%d\t",i+1);
printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
}
}
}
else{
printf("无此选项! 请重新输入!");
return sort(p,fp,n);
}
//sort()函数的组成结构:
/*switch(option)
{
case 1:printf("按英语成绩统计\n");break;
case 2:printf("按C语言成绩统计\n");break;
case 3:printf("按总成绩统计\n");break;
default:printf("无此选项! 请重新输入!\n");return sort(p,fp,n);
}*/
}
删除链表元素,是找到那个元素,将当前元素的后节点指向前节点就行。