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

我想要达到的结果

```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;
}

```

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

img

应该是

if (phead == NULL)
    {
        phead = pNewNode;
        phead->pNext = NULL;
    }
    else
    {
        //头插法
        pNewNode->pNext = phead;
        phead = pNewNode;
 
    }
 

打印后显示重复打印===怎么理解?是输出的数据有重复,还是有错误提示?

可参考以下代码,觉得有帮助请采纳,谢谢!

/**
 * @file student.c
 * @author GentleTK (1144626145@qq.com)
 * @brief 
 * @version 1.0.0
 * @date 2022-09-06
 * 
 * @copyright Copyright (c) 2022
 * 
 */
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

#define LOCAL_FILE_PATH "StudentInfo.txt"   // 学生信息本地文件路径

/**
 * @brief 学生信息记录结构体
 */
typedef struct StudentInfo
{
    char id[20];            // 学号
    char name[20];            // 姓名
    char sex[20];            // 性别
    char age[20];            // 年龄
    char score[20];            // 成绩
    struct StudentInfo *next;
}student;

student *createNode(void);                            // 创建一个学生信息节点 
student *openFile(void);                            // 打开学生信息记录文件 
void saveFile(student *head);                        // 保存学生信息记录到文件 
void Display(void);                                    // 显示学生信息记录 
void menu(void);                                    // 系统功能菜单 
void insert_Tail(student *pHead, student *pNew);    // 尾插法创建学生信息链表 
void Add(void);                                        // 添加学生信息记录 
void Delete(void);                                    // 删除学生信息记录 
void Query(void);                                    // 查询学生信息记录
void Modify(void);                                    // 修改学生信息记录 
void Count(void);                                   // 统计学生信息

int main(void)
{
    int select;
    do
    {
        menu();
        printf("Please input your select(1-7): ");
        scanf("%d", &select);
        switch(select)
        {
            case 1:Add();break;
            case 2:Display();break;
            case 3:Count();break;
            case 4:Query();break;
            case 5:Modify();break;
            case 6:Delete();break;
            case 7:break;
            default:printf("Input error, please input again!\n");break;
        }
    }while(7 != select);
    return 0;
} 

/**
 * @brief 系统功能菜单
 */
void menu(void)
{
   printf("  ***********************************\n");
    printf("      Student Information System\n");
    printf("  ***********************************\n");
    printf("          System Function Menu     \n");
    printf("  ***********************************\n");
    printf("  *    1、 Add    Student Info      *\n\n");
    printf("  *    2、 Print  Student Info      *\n\n");
    printf("  *    3、 Count  Student Info      *\n\n");
    printf("  *    4、 Query  Student Info      *\n\n");
    printf("  *    5、 Modify Student Info      *\n\n");
    printf("  *    6、 Delete Student Info      *\n\n");
    printf("  *    7、 Exit   System            *\n\n");
    printf("  *************************************** \n");
}

/**
 * @brief 创建一个学生信息节点并返回该节点的指针
 * @return student* 
 */
student *createNode(void)
{
    student *pNode = (student *)malloc(sizeof(student));
    if(NULL == pNode)
    {
        printf("Malloc error!\n");
    }
    memset(pNode, 0, sizeof(student));
    printf("Please input id: ");
    scanf("%s", pNode->id);
    printf("Please input name: ");
    scanf("%s", pNode->name);
    printf("Please input sex: ");
    scanf("%s", pNode->sex);
    printf("Please input age: ");
    scanf("%s", pNode->age);
    printf("Please input score: ");
    scanf("%s", pNode->score);
    pNode->next = NULL;
    return pNode;
}

/**
 * @brief  尾插法创建学生信息链表
 * @param  pHead            头指针 
 * @param  pNew             要插入节点的指针
 */
void insert_Tail(student *pHead, student *pNew)
{
    student *p = pHead;
    while(NULL != p->next)// 找到最后一个节点
    {
        p = p->next;
    }
    p->next = pNew;// 指向插入的节点
}

/**
 * @brief 添加学生信息记录
 */
void Add(void)
{
    FILE *fp;
    student *pHead;
    if(NULL == (fp = fopen(LOCAL_FILE_PATH, "r")))// 文件不存在,创建头节点 
    {
        pHead = (student *)malloc(sizeof(student));
        if(NULL == pHead)
        {
            printf("Malloc error!\n");
        }
        memset(pHead, 0, sizeof(student));
    }
    else// 有学生记录,打开文件 
    {
        pHead = openFile(); 
    }
    do
    {
        insert_Tail(pHead, createNode());
        getchar();
        printf("Press n/N to exit: ");
    }while(getchar() != 'n' && getchar() != 'N'); 
    saveFile(pHead);
}

/**
 * @brief 显示学生信息记录
 */
void Display(void)
{
    student *p = openFile();
    printf("\nID\tName\tSex\tAge\tScore\n");
    while (NULL != p)
    {
        printf("%s\t%s\t%s\t%s\t%s\n", p->id, p->name, p->sex, p->age, p->score);
        p = p->next;
    }
} 

/**
 * @brief 删除学生信息记录
 */
void Delete(void)
{
    student *head, *p;
    student *pPrv = NULL;
    char idstr[20] = {0};
    int findok = 0;
    head = p = openFile();
    printf("Please input ID which you want to delete: ");
    scanf("%s", idstr); 
    while(NULL != p->next)
    {
        pPrv = p;// 保存上一个节点的next指针 
        p = p->next;
        if(!strcmp(idstr, p->id))// 找到要删除的节点 
        {
            findok = 1;
            if(NULL != p->next)// 要删除的不是尾节点 
            {
                pPrv->next = p->next;
                saveFile(head);
            }
            else
            {
                pPrv->next = NULL;
                saveFile(head);
            }
            printf("Delete success!\n"); 
        }
    }
    if(!findok) 
    {
        printf("Information not found!\n");
    }
} 

/**
 * @brief 查找学生信息记录
 */
void Query(void)
{
    student *p = openFile();
    char str[10]; 
    int findok = 0;

    printf("Please input ID which you want to query: ");
    scanf("%s", str);
    while(NULL != p->next)
    {
        p = p->next;
        if(!strcmp(str, p->id))
        {
            findok = 1;
            printf("%s\t%s\t%s\t%s\t%s\n", p->id, p->name, p->sex, p->age, p->score);
            printf("Find suceess!\n");
        }
    }
    if(!findok)
    {
        printf("Information not found!\n");
    }
} 

/**
 * @brief 修改学生信息记录
 */
void Modify(void)
{
    student *head, *p;
    char idstr[10]; 
    int findok = 0;
    head = p = openFile();
    printf("Please input ID which you want to Modify: ");
    scanf("%s", idstr);
    while(NULL != p->next)
    {
        p = p->next;
        if(!strcmp(idstr, p->id))
        {
            findok = 1;
            printf("%s\t%s\t%s\t%s\t%s\n", p->id, p->name, p->sex, p->age, p->score);
            printf("Find suceess!\n");
            printf("Please follow the prompt to enter the changes.\n");
            printf("ID: ");
            scanf("%s", p->id);
            printf("Name: ");
            scanf("%s", p->name);
            printf("Sex: ");
            scanf("%s", p->sex);
            printf("Age: ");
            scanf("%s", p->age);
            printf("Score: ");
            scanf("%s", p->score);
            saveFile(head);
            printf("Modify success!\n");
        }
    }
    if(!findok)
    {
        printf("Information not found!\n");
    }
}

/**
 * @brief 统计学生信息
 * 
 */
void Count(void)
{
    int count = 0;
    student *p = openFile();
    
    while (NULL != p->next)
    {
        p = p->next;
        count++;
    }
    printf("The number of students is: %d\n", count);
}

/**
 * @brief  保存学生信息记录到文件
 * @param  head             链表头指针
 */
void saveFile(student *head)
{
    student *p = head->next;
    FILE *fp;
    if(NULL == (fp = fopen(LOCAL_FILE_PATH, "w")))
    {
        printf("Create file fail!\n");
        exit(0);
    }
    while(NULL != p)
    {
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", p->id, p->name, p->sex, p->age, p->score);
        p = p->next;
    }
    fputs("over",fp);
    fclose(fp); 
}

/**
 * @brief  打开学生信息记录文件并返回链表头指针
 * @return student* 
 */
student *openFile(void)
{
    student *pHead, *head, *pNew, *end;
    FILE *fp;
    if(NULL == (fp = fopen(LOCAL_FILE_PATH, "r")))
    {
        printf("Open file fail!\n");
        exit(0);
    }
    pHead = (student *)malloc(sizeof(student));// 头指针 
    head = end = (student *)malloc(sizeof(student));
    if(NULL == end || NULL == pHead) 
    {
        printf("Malloc error!\n");
    }
    memset(end, 0, sizeof(student *));
    memset(pHead, 0, sizeof(student));
    fscanf(fp, "%s%s%s%s%s", end->id, end->name, end->sex, end->age, end->score);
    while(!feof(fp))
    {
        pNew = (student *)malloc(sizeof(student));
        end->next = pNew;
        fscanf(fp, "%s%s%s%s%s", pNew->id, pNew->name, pNew->sex, pNew->age, pNew->score);
        if(!strcmp(pNew->id,"over"))
        {
            end->next = NULL;
        }
        end = pNew;// end指向当前新插入的尾节点
    }
    end->next = NULL;
    pHead->next = head;// 指向第一个有效节点 
    fclose(fp);
    return pHead;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632