#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student
{
char name[20];//姓名
int age;//年龄
int stuNum;//学号
int score;//成绩
}Student;//定义学生
typedef struct _Node//节点
{
Student stu;
struct _Node* pNext; //指向下一个节点的指针
}Node;
Node *g_pHead=NULL;
void Welcome()//目录
{
printf("**************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
printf("**************************************************\n");
printf("*\t\t请选择功能列表\t\t\t*\n");
printf("**************************************************\n");
printf("*\t\t1.录入学生信息\t\t\t*\n");
printf("*\t\t2.打印学生信息\t\t\t*\n");
printf("*\t\t3.保存学生信息\t\t\t*\n");
printf("*\t\t4.读取学生信息\t\t\t*\n");
printf("*\t\t5.统计所有学生人数\t\t*\n");
printf("*\t\t6.查找学生信息\t\t\t*\n");
printf("*\t\t7.修改学生信息\t\t\t*\n");
printf("*\t\t8.删除学生信息\t\t\t*\n");
printf("*\t\t0.退出系统\t\t\t*\n");
printf("**************************************************\n");
}
void InputStudent()//录入学生信息
{
//创建一个新节点
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
//头插法
if(g_pHead==NULL)
{
g_pHead=pNewNode;
}
else
{
pNewNode->pNext=g_pHead;
g_pHead=pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s",pNewNode->stu.name);//从键盘格式化接受一个字符串
printf("请输入学生的年龄:\n");
scanf("%d",&pNewNode->stu.age);
printf("请输入学生的学号:\n");
scanf("%d",&pNewNode->stu.stuNum);
printf("请输入学生的成绩:\n");
scanf("%d",&pNewNode->stu.score);
printf("学生信息录入成功:\n");
system("pause");//暂停
system("cls");//清屏
}
void PrintfStudent()//打印学生信息
{
printf("**************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
printf("**************************************************\n");
printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
printf("**************************************************\n");
//遍历链表
Node* p=g_pHead;
while(p!=NULL)
{
printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n",p->stu.stuNum,p->stu.name,p->stu.age,p->stu.score);
p=p->pNext;
}
system("pause");//暂停
system("cls");//清屏
}
void SaveStudent()//保存学生信息
{
//打开文件
FILE* fp=fopen("E:\\课程设计\\studnet","w");
if(fp==NULL)
{
printf("打开文件失败\n");
return;
}
//遍历链表
Node* p=g_pHead;
while(p!=NULL)
{
fwrite(&p->stu,1,sizeof(Student),fp);
p=p->pNext;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功\n");
system("pause");//暂停
system("cls");//清屏
}
void ReadStudent()//读取学生信息
{
//打开文件
FILE *fp=fopen("E:\\课程设计\\studnet","r");
if(fp==NULL)
{
printf("打开文件失败\n");
return;
}
//读文件
Student stu;
while(fread(&stu,1,sizeof(Student),fp))
{
//创建一个新节点
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode,&stu,sizeof(Student));
//头插法
if(g_pHead==NULL)
{
g_pHead=pNewNode;
}
else
{
pNewNode->pNext=g_pHead;
g_pHead=pNewNode;
}
//关闭文件
fclose(fp);
printf("加载数据成功\n");
}
system("pause");//暂停
system("cls");//清屏
}
int CountStudent()//统计所有学生人数
{
int nCount=0;
//遍历链表
Node* p=g_pHead;
while(p!=NULL)
{
nCount++;
p=p->pNext;
}
return nCount;
}
int main()
{
while(1)
{
int nCount=0;
Welcome();//目录
char ch=getch();//从键盘接受一个字符
switch(ch)
{
case '1'://录入学生信息
InputStudent();
break;
case '2'://打印学生信息
PrintfStudent();
break;
case '3'://保存学生信息
SaveStudent();
break;
case '4'://读取学生信息
ReadStudent();
break;
case '5'://统计所有学生人数
printf("学生总人数为:%d\n",CountStudent());
system("pause");//暂停
system("cls");//清屏
break;
case '6'://查找学生信息
break;
case '7'://修改学生信息
break;
case '8'://删除学生信息
break;
case '0'://退出系统
break;
}
}
return 0;
}
您的打印函数没像读取函数一样循环读取学生信息啊,您就打印了读取函数的最后一个。您应该像读取函数一样读取打印才好。
整体修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student
{
char name[20];//姓名
int age;//年龄
int stuNum;//学号
int score;//成绩
}Student;//定义学生
typedef struct _Node//节点
{
Student stu;
struct _Node* pNext; //指向下一个节点的指针
}Node;
Node* g_pHead = NULL;
void Welcome()//目录
{
printf("**************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
printf("**************************************************\n");
printf("*\t\t请选择功能列表\t\t\t*\n");
printf("**************************************************\n");
printf("*\t\t1.录入学生信息\t\t\t*\n");
printf("*\t\t2.打印学生信息\t\t\t*\n");
printf("*\t\t3.保存学生信息\t\t\t*\n");
printf("*\t\t4.读取学生信息\t\t\t*\n");
printf("*\t\t5.统计所有学生人数\t\t*\n");
printf("*\t\t6.查找学生信息\t\t\t*\n");
printf("*\t\t7.修改学生信息\t\t\t*\n");
printf("*\t\t8.删除学生信息\t\t\t*\n");
printf("*\t\t0.退出系统\t\t\t*\n");
printf("**************************************************\n");
}
void InputStudent()//录入学生信息
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", pNewNode->stu.name);//从键盘格式化接受一个字符串
printf("请输入学生的年龄:\n");
scanf("%d", &pNewNode->stu.age);
printf("请输入学生的学号:\n");
scanf("%d", &pNewNode->stu.stuNum);
printf("请输入学生的成绩:\n");
scanf("%d", &pNewNode->stu.score);
printf("学生信息录入成功:\n");
system("pause");//暂停
system("cls");//清屏
}
void PrintfStudent()//打印学生信息
{
printf("**************************************************\n");
printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
printf("**************************************************\n");
printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
printf("**************************************************\n");
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.score);
p = p->pNext;
}
system("pause");//暂停
system("cls");//清屏
}
void SaveStudent()//保存学生信息
{
//打开文件
FILE* fp = fopen("D:\\课程设计\\studnet.txt", "w"); //"E:\\课程设计\\studnet", "w" 修改
if (fp == NULL)
{
printf("打开文件失败\n");
return;
}
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
fwrite(&p->stu, sizeof(Student), 1, fp);//fwrite(&p->stu, 1, sizeof(Student), fp); 修改
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功\n");
system("pause");//暂停
system("cls");//清屏
}
void ReadStudent()//读取学生信息
{
//打开文件
FILE* fp = fopen("D:\\课程设计\\studnet.txt", "r"); //"E:\\课程设计\\studnet", "r" 修改
if (fp == NULL)
{
printf("打开文件失败\n");
return;
}
//读文件
Student stu;
while (fread(&stu, sizeof(Student), 1, fp) == 1) //fread(&stu, 1, sizeof(Student), fp) 修改
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(&pNewNode->stu, &stu, sizeof(Student)); //memcpy(pNewNode, &stu, sizeof(Student)); 修改
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
} //修改
//关闭文件
fclose(fp);
printf("加载数据成功\n");
system("pause");//暂停
system("cls");//清屏
}
int CountStudent()//统计所有学生人数
{
int nCount = 0;
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
}
int main()
{
while (1)
{
int nCount = 0;
Welcome();//目录
char ch = getch();//从键盘接受一个字符
switch (ch)
{
case '1'://录入学生信息
InputStudent();
break;
case '2'://打印学生信息
PrintfStudent();
break;
case '3'://保存学生信息
SaveStudent();
break;
case '4'://读取学生信息
ReadStudent();
break;
case '5'://统计所有学生人数
printf("学生总人数为:%d\n", CountStudent());
system("pause");//暂停
system("cls");//清屏
break;
case '6'://查找学生信息
break;
case '7'://修改学生信息
break;
case '8'://删除学生信息
break;
case '0'://退出系统
break;
}
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:职工信息的存储采用的数据结构是单链表,使用结构体存储职工信息,用next 指针串联多个职工信息
在这里插入代码片
staff *head;
//首先链表初始化,定义头指针,指向NULL;
void initLinkedList(){
head=(staff *) malloc(sizeof(staff));
head->next=NULL;
}
在读取信息时只能读取一个信息,无法同时读取多个信息的原因是因为在读取信息时,程序是按照顺序一个一个地读取信息的,每次只能读取一个信息并处理后才能读取下一个信息。
解决方案: 1. 使用多线程同时读取多个信息:可以创建多个线程,在每个线程中读取不同的信息,然后进行处理。这样可以实现同时读取多个信息的功能。以下是一个使用多线程的示例代码:
import threading
def read_info(info):
# 读取信息逻辑
pass
# 创建线程
threads = []
infos = ["info1", "info2", "info3"] # 假设有三个信息需要读取
for info in infos:
thread = threading.Thread(target=read_info, args=(info,))
thread.start()
threads.append(thread)
# 等待所有线程执行完毕
for thread in threads:
thread.join()
import asyncio
async def read_info(info):
# 读取信息逻辑
pass
# 创建事件循环
loop = asyncio.get_event_loop()
# 创建任务列表
tasks = []
infos = ["info1", "info2", "info3"] # 假设有三个信息需要读取
for info in infos:
task = asyncio.ensure_future(read_info(info))
tasks.append(task)
# 并行执行任务
loop.run_until_complete(asyncio.wait(tasks))
# 关闭事件循环
loop.close()
以上是两种解决方案的示例代码,具体的实现方式可以根据实际情况进行调整和修改。