m0_72636972 2022-09-06 09:27 采纳率: 85.7%
浏览 54
已结题

录入、保存、读取信息后,打印后数据出现重复打印的解决方法 打印信息只能显示两条,想要显示多条的解决方法保存在文档的信息显示乱码正常吗

我想要达到的结果

```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//字符串头文件

void menu()    //显示菜单
{
    printf("  *********************************** \n");
    printf("        学生信息管理系统    \n");
    printf("  ***********************************\n");
    printf("           系统功能菜单     \n");
    printf("  *********************************** \n");
    printf("   *         1、录入学生信息          * \n");
    printf("\n");
    printf("     *         2、打印学生信息          * \n");
    printf("\n");
    printf("       *         3、保存学生信息          * \n");
    printf("\n");
    printf("         *         4、统计学生信息          * \n");
    printf("\n");
    printf("           *         5、查询学生信息          * \n");
    printf("\n");
    printf("             *         6、修改显示信息          * \n");
    printf("\n");
    printf("               *         7、删除学生信息          * \n");
    printf("\n");
    printf("                 *         8、退出系统              * \n");
    printf("\n");
    printf("                    *        9、读取学生信息           \n");
    printf("                     *********************************** \n");
}

void jumpspace() 
{
    char ch = getchar();
}
//定义一个学生结构体
typedef struct _student
{
    int num;      //学号
    char name[20];//姓名
    char sex[10]; //性别
    int age;      //年龄
    int score;  //成绩
}student;

//节点
typedef struct _Node
{
    student stu;  //学生
    struct _Node* pNext;//指向下一个结点
}Node;

Node* phead = NULL; //头结点

//录入学生信息
void Inputstudent()
{
    //创建一个新结点
    Node* pNewNode = (Node*)malloc(sizeof(Node));
    // pNewNode->pNext = NULL;
     //头插法,尾插法
     //头插法

printf("请输入学号: \n");
scanf_s("%d", &(pNewNode->stu.num), sizeof(student::num));
    jumpspace();
    printf("请输入姓名: \n");
scanf_s("%s", &(pNewNode->stu.name), sizeof(student::name));
    jumpspace();
    printf("请输入性别: \n");
    scanf_s("%s", &pNewNode->stu.sex, sizeof(student::sex));
    printf("请输入年龄: \n");
    scanf_s("%d", &(pNewNode->stu.age), sizeof(student::age));
    printf("请输入成绩: \n");
    scanf_s("%d", &(pNewNode->stu.score), sizeof(student::score));
    printf("学生信息录入成功!\n");
    system("pause");//暂停
    system("cls");//清屏
    if (phead == NULL)
    {
        phead = pNewNode;
        phead->pNext = NULL;
    }
    else
    {
        pNewNode->pNext = phead;
        phead->pNext = pNewNode;
        phead->pNext->pNext = NULL;
    }
}
//打印学生信息
void Printstudent()
{
    printf("  *********************************** \n");
    printf("        学生信息管理系统    \n");
    printf("  ***********************************\n");
    printf("\t学号\t姓名\t性别\t年龄\t成绩\n");
    printf("  ***********************************\n");
    //遍历链表
    Node* p = phead;
    while (p != NULL)
    {
        printf("\t%d\t%s\t%s\t%d\t%d\n",
            p->stu.num,
            p->stu.name,
            p->stu.sex,
            p->stu.age,
            p->stu.score);
        p = p->pNext;
    }
    system("pause");//暂停
    system("cls");//清屏
}
//保存学生信息
void Savestudent()
{
    //打开文件
    FILE* fp;
    errno_t err = fopen_s(&fp, "D:\\stuinfo.txt", "w");
    if (fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    //遍历链表
    Node* p = phead;
    while (p != NULL)
    {
        fwrite(&p->stu, 1, sizeof(student), fp);
        p = p->pNext;
    }
    //关闭文件
    fclose(fp);
    printf("\n数据保存成功!\n");
    system("pause");//暂停
    system("cls");//清屏
}
//读取学生信息
void Readsttudent()
{
    student stu;
    //打开文件
    FILE* fp;
    errno_t err = fopen_s(&fp, "D:\\stuinfo.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开失败!\n");
        return;
    }
    //读文件
    while (fread(&stu, 1, sizeof(student), fp))
    {
        //创建一个新节
        Node* pNewNode = (Node*)malloc(sizeof(Node));//申请一个空节点
        pNewNode->pNext = NULL;
        memcpy(pNewNode, &stu, sizeof(student));//copy
        //头插法
        if (phead == NULL)
        {
            phead = pNewNode;
        }
        else
        {
            pNewNode->pNext = phead;
            phead = pNewNode;
        }
    }
    //关闭文件
    fclose(fp);
    printf("加载数据成功!\n");
    system("pause");//暂停
    system("cls");//清屏
}

//统计学生信息
int Countstudent()
{
    int Count = 0;//学生总数
    //遍历链表
    Node* p = phead;
    while (p != NULL)//尾结点的指针域->NULL
    {
        Count++;
        p = p->pNext;
    }
    return Count;
}
//查找学生信息
Node* Findstudent()
{
    int num;
    char name[20];
    printf("请输入需要查找的学生的学号:\n");
    scanf_s("%d", &num);
    system("pause");//暂停
    system("cls");//清屏
    //遍历链表
    Node* p = phead;
    while (p != NULL)
    {
        //strcmp字符串函数
        if(p->stu.num==num  /*0==strcmp(p->stu.name,name)*/)
            {
            return p;
            }
        p = p->pNext;
    }
    return NULL;
}
//修改学生信息
void Modifystudent()
{
    int num;
    printf("请输入需要修改的学生信息的学号:\n");
    scanf_s("%d", &num);
    //遍历链表
    Node* p = phead;
    while (p != NULL)
    {
        if (p->stu.num == num  )
        {
            printf("请输入要修改的学生姓名 年龄 成绩:\n");
            scanf_s("%c %d %d", &p->stu.name, &p->stu.age, &p->stu.score);
            printf("修改成功!\n");
            break;
        }
        p = p->pNext;
    }
    if(p==NULL)
    {
        printf("没有找到该学生信息!\n");
    } 
    system("pause");//暂停
    system("cls");//清屏
}
//删除学生信息
void Deletestudent()
{
    int stunum;
    printf("请输入要删除的学生的学号:\n");
    scanf_s("%d", &stunum);
  //删除结点
    Node* p1, * p2;//p2是备份的,可释放
    //判断是否为头结点
    if (phead->stu.num ==stunum)
    {
        p1 = phead;
        phead = phead->pNext;
        free(p1);
        system("pause");//暂停
        system("cls");//清屏
        return;
    }
    //不是头结点
    Node* p = phead;
        while (p->pNext != NULL)
        {
            if (p->pNext->stu.num == stunum)
            {
                p2 = p->pNext;
                p->pNext = p->pNext->pNext;
                free(p2);
                system("pause");//暂停
                system("cls");//清屏
                return;
            }
            p = p->pNext;
            if (p->pNext == NULL)//到了尾部
            {
                break;
            }
        }
        if (p->pNext == NULL)
        {
            printf("没有找到该学员!\n");
        }
        system("pause");//暂停
        system("cls");//清屏
}


int main()
{
    int choice;
    while (1)
    {
        menu();
        //scanf按回车,整数
        scanf_s("%d", &choice);
        jumpspace();
        switch (choice)
        {
        case 1:  //录入
            Inputstudent();
            jumpspace();
            break;
        case 2:   //打印
            Printstudent();
            break;
        case 3:   //保存
            Savestudent();
            break;
        case 4:   //统计
            printf("学生总人数为:%d\n", Countstudent());
            system("pause");//暂停
            system("cls");//清屏
            break;
        case 5:   //查找
        {
            Node* p = Findstudent();
            if (p != NULL)
            {
                printf("学号:%d\t姓名:%s\t性别:%s\t年龄:%d\t成绩:%d\n", p->stu.num, p->stu.name, p->stu.sex, p->stu.age, p->stu.score);
                system("pause");//暂停
                system("cls");//清屏
            }
            else
                printf("没有找到该学员!\n");
            break;
        }
        case 6:   //修改
            Modifystudent();
            break;
        case 7:   //删除
            Deletestudent();
            break;
        case 8:   //退出
            printf("goodbye!\n");
            return 0;
        case 9:   //读取
            Readsttudent();
            break;
        default:
            printf("输入有误,请重新输入!\n");
            system("pause");//暂停
            system("cls");//清屏
            break;
        }
    }
    return 0;
}

```

  • 写回答

4条回答 默认 最新

  • 关注

    上个题目已经给你答复了啊,你inputstudent()函数里else语句部分逻辑错了。

    img

    应该是

    if (phead == NULL)
        {
            phead = pNewNode;
            phead->pNext = NULL;
        }
        else
        {
            //头插法
            pNewNode->pNext = phead;
            phead = pNewNode;
     
        }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月7日
  • 已采纳回答 9月6日
  • 修改了问题 9月6日
  • 修改了问题 9月6日
  • 展开全部

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器