```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语句部分逻辑错了。
应该是
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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!