经过录入,保存,读取信息之后,再点击打印信息出现重复打印的解决方法

用c语言编写学生管理系统时,经过录入,保存,读取信息之后,再打印信息出现了信息重复打印的现象。

img


代码如下:

img

img

img

img

img

img

img

img

因为在你的inputstudent()函数里,else语句中逻辑出错了。

img

头插法的写法应该是:

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

    }

如有帮助,望采纳,谢谢。

代码里完成录入信息时建立了链表,当经过录入,然后保存到文件时,链表的内容仍然存在,写入文件里的内容和链表的内容是一样的,然后再从文件读取信息时,对现有链表继续加入文件里的信息,就出现了重复信息。建议这么改下,保存到文件和读取文件的功能不必写入菜单,把保存到文件的功能,放到退出系统前的步骤里执行,把读取文件的功能放到系统运行初始化链表,这样中间对链表的操作修改完后,保证逻辑关系和信息正确,其他问题见注释,修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//字符串头文件
//定义一个学生结构体
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 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("    *        3、保存学生信息        * \n");   
    printf("\n");
    printf("    *        4、退出学生信息系统    * \n"); // printf("    *        4、读取学生信息        * \n");  
    printf("  ************************************\n");
}
void jumpspace() { 
    char ch = getchar(); 
}

//录入学生信息
void Inputstudent(){    //创建一个新结点    
    Node* pNewNode = (Node*)malloc(sizeof(Node));
    pNewNode->pNext = NULL;     //头插法,尾插法    
    printf("请输入学号: \n");
    scanf_s("%d", &pNewNode->stu.num);
    //scanf_s("%d", &(pNewNode->stu.num), sizeof(student::num));修改
    jumpspace();    
    printf("请输入姓名: \n");
    scanf_s("%s", pNewNode->stu.name, sizeof(student::name));
    //scanf_s("%s", &(pNewNode->stu.name), sizeof(student::name));修改
    jumpspace();    
    printf("请输入性别: \n");    
    scanf_s("%s", pNewNode->stu.sex, sizeof(student::sex));
    //scanf_s("%s", &pNewNode->stu.sex, sizeof(student::sex));修改
    printf("请输入年龄: \n");    
    scanf_s("%d", &pNewNode->stu.age);
    //scanf_s("%d", &(pNewNode->stu.age), sizeof(student::age)); 修改
    printf("请输入成绩: \n");    
    scanf_s("%d", &pNewNode->stu.score);
    //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 = pNewNode;
        //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 (err != 0)    {   //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 (err != 0) {     //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 main() {
    int choice = 1;  //修改
    Readsttudent();//系统运行之初,先加载读取文件内容到链表  修改
    while (choice) { //修改
        menu(); //scanf按回车,整数        
        scanf_s("%d", &choice);        
        jumpspace();        
        switch (choice) {
        case 1:  //录入            
              Inputstudent();            
              jumpspace();            
              break;        
        case 2:   //打印            
              Printstudent();            
              break;        
        case 3:   //查找            
              //findstu();新建查找信息函数 修改            
              break;  
        case 4:  //退出       
              choice = 0;
              Savestudent();//退出系统前,先保存链表信息到文件。           
              break;        
        default:            
             printf("输入有误,请重新输入!\n");            
             system("pause");//暂停            
             system("cls");//清屏            
             break;        
        }    
    }    
    return 0;
}

发代码段格式,截图不方便获取你的代码。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632