用c语言编写学生管理系统时,经过录入,保存,读取信息之后,再打印信息出现了信息重复打印的现象。
因为在你的inputstudent()函数里,else语句中逻辑出错了。
头插法的写法应该是:
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;
}
发代码段格式,截图不方便获取你的代码。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!