请问有哪位大佬好心可以帮一下,指出以下哪里错了。本人感激不尽!
题目:学生籍贯信息记录簿编制一个学生籍贯信息记录簿,每个学生信息包括:学号,姓名,籍贯.具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的籍贯信息;
(3)按学号或姓名查询其籍贯;
4)按籍贯查询并输出该籍贯的所有学生;
(5)能添加,删除和修改学生的籍贯信息;
以下为本人用C语言实现代码
编译运行是没问题的,但是数据好像无法写入文件。我也不知道是哪里有问题。希望有大佬帮忙看一下。感激不尽!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
struct Student
{
char num[30];
char name[30];
char address[30];
struct Student* next;
};
struct Student*head;
struct Student*p;
struct Student*p1;
struct Student*p2;
int n;
int Browse();//学生籍贯信息浏览函数
int Save();//信息保存函数
int find1();//按学号查询其籍贯
int find2();//按姓名查询其籍贯
int find3();//按籍贯查询
int Add();//增加信息函数
int Alter();//修改信息函数
int Delete();//删除信息函数
int Read();//读取信息函数
struct Student * Input();//学生籍贯信息录入函数
int Browse()//浏览信息
{
if(n!=0)
{
p=head; //p先指向开头
printf("共录入%d位学生信息:\n",n);
printf(" 学号 姓名 籍贯\n");
do
{
printf("%5s %5s %5s\n",p->num,p->name,p->address);//循环输出输入信息
p=p->next;//p打印结束把p指向next以判断下一个区域有没有内容
}while(p!=NULL);//只要p指向的内存区域有数据就打印内容
}
else
printf("您还没有添加数据哦!\n");
}
struct Student*Input() //输入信息
{
head=(struct Student*) malloc(sizeof(struct Student));
head->next=NULL;
p2=(struct Student*) malloc(sizeof(struct Student));
while(1)
{
p1=(struct Student*) malloc(sizeof(struct Student));
printf("请输入第%d个学生信息,输入finish时结束。输入格式为:学号 姓名 籍贯\n",n+1);
scanf("%s",p1->num); //输入学生学号
if(strcmp(p1->num,"finsh")==0) //判断输入是否完成
{
p2->next=NULL;
break; //若完成即跳出
}
scanf("%s",p1->name); //输入学生姓名
scanf("%s",p1->address); //输入学生籍贯
n++; //n自加以确保下一个的输入
if(n==1)
head=p1;
p2->next=p1;
p2=p1;
}
p2->next=NULL;
return(head);
}
int Save()
{
FILE *fp;
fp=fopen("stu.dat","w+");
if(fp==NULL)
{
printf("打开文件失败!\n");
}
p=head;
while(p!=NULL)
{
if(fwrite(p,sizeof(struct Student),1,fp)!=1)
{
printf("文件书写错误!\n");
fclose(fp);
break;
}
p=p->next;
}
fclose(fp);
}
int Read() //读取
{
FILE *fp;
n=0;
fp=fopen("stu.dat","r+");
if((fp=fopen("stu.dat","r+"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
do
{
p1=(struct Student*)malloc(sizeof(struct Student));
fread(p1,sizeof(struct Student),1,fp);
if(n==0) //判断链表开头
head=p1; //n=0代表输入的是第一个数据
p2->next=p1;//p2的结尾所指向的地址是p1
p2=p1;
n=n+1;
}while(p2->next!=NULL);
fclose(fp);
printf("读取完成!\n\n");
}
int find1()//按学号查询其籍贯 1223
{
char a[30]; //定义字符数组
int j=1;//定义整型变量i,j
p1=head;
printf("请输入学生学号\n");
scanf("%s",a); //给字符串a赋值
do //循环查询学号为a的学生并输出出其籍贯
{
if(strcmp(p1->num,a)==0)
printf("此学生籍贯为%s\n",p1->address);
p1=p1->next;
j=0;
}while(p1!=NULL);
if(j) //若没有学号为a的学生输出查询不到此学生
printf("查询不到此学号\n");
}
int find2()//按姓名查询其籍贯
{
char a[30]; //定义字符数组
p1=head;
int j=1;
printf("请输入学生姓名\n");
scanf("%s",a);
do
{
if(strcmp(p1->name,a)==0)
printf("此学生籍贯为%s\n",p1->address);
p1=p1->next;
j=0;
}while(p1!=NULL);
if(j)
printf("查询不到此学号\n");
}
int find3()//按籍贯查询,输出该籍贯所有学生 123
{
char a[30];
int j=1;
p1=head;
printf("请输入学生籍贯\n");
scanf("%s",a);
do
{
if(strcmp(p1->address,a)==0)
printf("此籍贯学生为%s\n",p1->name);
p1=p1->next;
j=0;
}while(p1!=NULL);
if(j)
printf("查询不到此籍贯的学生\n");
}
int Delete()
{
if(n!=0)
{
char a[20];
printf("请输入要删除的学生姓名:");
scanf("%s",&a);
p=head;
if(strcmp(head->name,a)==0)
{
p1=head;
head=head->next;
free(p1);//释放删除结点
printf("数据已经被删除\n");
n--;
}
else
{
do
{
if(strcmp(p->name,a)==0)
{ p1=p;
p2->next=p->next;
free(p1);
break;
}
p2=p; //不满足if表示这不是要删除的那一个节点,l暂时指向p 之后p再指向下一个节点,如果这个是要删除的节点那么l指向这个节点的next的地址
p=p->next;
}while(p!=NULL);
printf("数据已经被删除\n");n--;
}
}
else
printf("没有任何学生的数据!\n");
}
int Add() //添加信息函数
{
p2=(struct Student *)malloc(sizeof(struct Student)); //开辟动态存储空间
if(n==0) //判断链表开头
head=p1; //n=0代表输入的是第一个数据
else p2->next=p1; //p2的结尾所指向的地址是p1
while(1)
{
p1=(struct Student*) malloc(sizeof(struct Student));
printf("请输入第%d个学生信息,输入finish时结束。输入格式为:学号 姓名 籍贯\n",n+1);
scanf("%s",p1->num); //输入学生学号
if(strcmp(p1->num,"finsh")==0) //判断输入是否完成
{
p2->next=NULL;
break;
} //若完成即跳出
scanf("%s",p1->name); //输入学生姓名
scanf("%s",p1->address); //输入学生籍贯
n++; //n自加以确保下一个的输入
p2->next=p1;
p2=p1;
}
}
int Alter()//修改学生籍贯信息 1344
{
int a,b,j;
p=head;
printf("请输入要修改第几个学生信息\n");
scanf("%d",&a);
j=0;
while ((p!=NULL) && (j<a))
{
j++;
if (a==j)
{
printf("修改学号请输入1,修改姓名请输入2,修改籍贯请输入3\n");
scanf("%d",&b);
if(b==1)
scanf("%s",p->num);
if(b==2)
scanf("%s",p->name);
if(b==3)
scanf("%s",p->address);
}
p=p->next;
}
if(a!=j)
printf("无此学生\n");
}
int main()
{
int key;
do{
printf("---------------------------------------------\n");
printf("1.输入数据并存档\n");
printf("2.输出信息\n");
printf("3按学号查询其籍贯\n");
printf("4按姓名查询其籍贯\n");
printf("5按籍贯查询,输出该籍贯所有学生\n");
printf("6添加学生籍贯信息\n");
printf("7删除学生籍贯信息\n");
printf("8修改学生籍贯信息\n");
printf("9读取文件\n");
printf("----------------------------------------------\n");
printf("请输入您选择值\n");
scanf("%d",&key);
switch(key)
{
case 1:
head=Input();
Save();
break;
case 2:
Browse();
break;
case 3:
find1();
break;
case 4:
find2();
break;
case 5:
find3();
break;
case 6:
Add();
Save();
Read();
Browse();
break;
case 7:
Delete();
Save();
Browse();
break;
case 8:
Alter();
Save();
Browse();
break;
case 9:
Read();
Browse();
break;
}
}while(key>0&&key<=9);
return 0;
}
编译运行是没问题的,但是数据好像无法写入文件。我也不知道是哪里有问题。希望有大佬帮忙看一下