标题:请问有哪位大佬好心可以帮一下,指出以下哪里错了。本人感激不尽!
只看楼主
浅唱低吟
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-3-28
结帖率:100%
 问题点数:0 回复次数:1 
请问有哪位大佬好心可以帮一下,指出以下哪里错了。本人感激不尽!
题目:学生籍贯信息记录簿
编制一个学生籍贯信息记录簿,每个学生信息包括:学号,姓名,籍贯.具体功能:
(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;
   
 }
编译运行是没问题的,但是数据好像无法写入文件。我也不知道是哪里有问题。希望有大佬帮忙看一下
搜索更多相关主题的帖子: next 学生 输入 int printf 
2021-04-13 16:33
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:0 
Input中
if (strcmp(p1->num, "finsh") == 0) 改为if (strcmp(p1->num, "finish") == 0)

后面的fopen中可以改用wb+,rb+。

运行后直接进入9,Read中p2没有分配内存
Read中if((fp=fopen("stu.dat","r+"))==NULL)改为if(fp==NULL)

save和read中文件打开失败,直接return 1,不需要exit,后续的过程可以通过判断返回值进行。

建议把malloc改用calloc;p,p1,p2改用局部变量,全局留个head就够用了。
子函数没有返回值。
2021-04-13 23:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505436-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056954 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved