采用链表来连接各同学的信息,进行打印,删除,插入增加,修改,查找。
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;//使头节点为空
int main()
{
while (1)
{
meun();
printf("请输入你的选项:\n");
int a;
scanf("%d", &a);
switch (a)
{
case 1:
READSTUDENT();//增加学生信息
break;
case 2:
PRINTSTUDENT();//打印学生信息
break;
case 3:
savestudent();//把学生信息保存在文件里
break;
case 4:
readstudent();//读取文件里的学生信息
break;
case 5:
countstu();//统计学生信息
break;
case 6:
{
Node*p=findstu();//查找学生信息
if (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);
}
else
{
printf("没找到\n");
}
system("pause");
system("cls");
break;
}
case 7:
modifystu();//插入学生信息
break;
case 8:
delegatestu();//删除学生信息
break;
case 0:
printf("bye bye!!!!");
return 0;
dafault:
printf("输入有误!,重新来");
system("pause");
system("cls");//清除当面所有内容。
break;
}
}
return 0;
}
打印目录
void meun()
{
printf("*******************************\n");
printf("*********学生信息管理系统******\n");
printf("*******************************\n");
printf("*\t1.录入学生信息\t\t*\n");
printf("*\t2.打印学生信息\t\t*\n");
printf("*\t3.保存学生信息\t\t*\n");
printf("*\t4.读取学生信息\t\t*\n");
printf("*\t5.统计学生信息\t\t*\n");
printf("*\t6.查找学生信息\t\t*\n");
printf("*\t7.修改学生信息\t\t*\n");
printf("*\t8.删除学生信息\t\t*\n");
printf("*\t0.退出系统\t*\n");
}
用链表添加学生信息
void READSTUDENT()
{
//创建一个新节点
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("okk\n");
system("pause");
system("cls");//清屏
}
打印学生信息
void PRINTSTUDENT()
{
printf("*************************************\n");
printf("**********学生成绩管理系统************\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:\\students.dat", "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");
}
读取文件中的学生信息
void readstudent()
{
FILE* fp = fopen("D:\\students.dat", "r");//r=read
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);
system("pause");
system("cls");
}
统计学生信息
void countstu()
{
int count=0;
Node* p = g_phead;
while(p!=NULL)
{
count++;
p = p->pnext;//不为空一直加
}
printf("学生人数为%d\n", count);
system("pause");
system("cls");
}
查找学生信息
Node* findstu()
{
char stuname[20];
printf("请输入查询对象姓名:\n");
scanf("%s", stuname);
int stunum;
printf("请输入查询对象学号:\n");
scanf("%d", &stunum);
Node* p = g_phead;
while (p != NULL)
{
//strcmp字符串比较函数
if (p->stu.stunum == stunum || strcmp(p->stu.name, stuname));
{
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);
break;
}
p = p->pnext;
}
//没找到
if (p->stu.stunum != stunum && strcmp(p->stu.name, stuname))
{
return NULL;
}
return 0;
}
修改学生信息
void modifystu()
{
printf("请输入修改学生信息学号\n");
int stunum;
scanf("%d", &stunum);
Node* p = g_phead;
while (p != NULL)
{
//strcmp字符串比较函数
if (p->stu.stunum == stunum );
{
printf("请输入要修改的学生的姓名,年龄,成绩\n");
scanf("%s %d %d", p->stu.name, &p->stu.age,&p->stu.score);
printf("修改成功");
break;
}
p = p->pnext;
}
if (p == NULL)
{
printf("找不到该学生\n");
}
system("pause");
system("cls");
}
删除学生信息
void delegatestu()
{
int nstunum;
printf("请输入要删除的学生学号\n");
scanf("%d", &nstunum);
Node* p1, *p2;
//判断是不是头节点
if (g_phead->stu.stunum == nstunum)
{
p1 = g_phead;
g_phead = g_phead->pnext;
free(p1);//释放该元素的内存空间
system("pause");
system("cls");
return;
}
//不是头节点
Node* p = g_phead;
while (p->pnext != NULL)
{
if (p->pnext->stu.stunum == nstunum)
{
p2 = p->pnext;
p->pnext = p->pnext->pnext;//使p指向p的下一个的下一个,这样就可以删除了
free(p2);
system("pause");
system("cls");
return;
}
p = p->pnext;
if (p->pnext == NULL)
{
break;
}
}
if (p->pnext == NULL)
{
printf("没找到该学生\n");
}
}
总结采用链表的方式进行,对学生的信息进行排序。通过对链表的操作实现学生管理系统的操作。
#include<stdio.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 READSTUDENT()
{
//创建一个新节点
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("okk\n");
system("pause");
system("cls");//清屏
}
void PRINTSTUDENT()
{
printf("*************************************\n");
printf("**********学生成绩管理系统************\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:\\students.dat", "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");
}
void readstudent()
{
FILE* fp = fopen("D:\\students.dat", "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);
system("pause");
system("cls");
}
void countstu()
{
int count=0;
Node* p = g_phead;
while(p!=NULL)
{
count++;
p = p->pnext;
}
printf("学生人数为%d\n", count);
system("pause");
system("cls");
}
Node* findstu()
{char stuname[20];
printf("请输入查询对象姓名:\n");
scanf("%s", stuname);
int stunum;
printf("请输入查询对象学号:\n");
scanf("%d", &stunum);
Node* p = g_phead;
while (p != NULL)
{
//strcmp字符串比较函数
if (p->stu.stunum == stunum || strcmp(p->stu.name, stuname));
{
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);
break;
}
p = p->pnext;
}
//没找到
if (p->stu.stunum != stunum && strcmp(p->stu.name, stuname))
{
return NULL;
}
return 0;
}
void modifystu()
{
printf("请输入修改学生信息学号\n");
int stunum;
scanf("%d", &stunum);
Node* p = g_phead;
while (p != NULL)
{
//strcmp字符串比较函数
if (p->stu.stunum == stunum );
{
printf("请输入要修改的学生的姓名,年龄,成绩\n");
scanf("%s %d %d", p->stu.name, &p->stu.age,&p->stu.score);
printf("修改成功");
break;
}
p = p->pnext;
}
if (p == NULL)
{
printf("找不到该学生\n");
}
system("pause");
system("cls");
}
void delegatestu()
{
int nstunum;
printf("请输入要删除的学生学号\n");
scanf("%d", &nstunum);
Node* p1, *p2;
//判断是不是头节点
if (g_phead->stu.stunum == nstunum)
{
p1 = g_phead;
g_phead = g_phead->pnext;
free(p1);
system("pause");
system("cls");
return;
}
//不是头节点
Node* p = g_phead;
while (p->pnext != NULL)
{
if (p->pnext->stu.stunum == nstunum)
{
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");
}
}
void meun()
{
printf("*******************************\n");
printf("**********学生成绩管理系统******\n");
printf("*******************************\n");
printf("*\t1.录入学生信息\t\t*\n");
printf("*\t2.打印学生信息\t\t*\n");
printf("*\t3.保存学生信息\t\t*\n");
printf("*\t4.读取学生信息\t\t*\n");
printf("*\t5.统计学生信息\t\t*\n");
printf("*\t6.查找学生信息\t\t*\n");
printf("*\t7.修改学生信息\t\t*\n");
printf("*\t8.删除学生信息\t\t*\n");
printf("*\t0.退出系统\t*\n");
}
int main()
{
while (1)
{
meun();
printf("请输入你的选项:\n");
int a;
scanf("%d", &a);
switch (a)
{
case 1:
READSTUDENT();
break;
case 2:
PRINTSTUDENT();
break;
case 3:
savestudent();
break;
case 4:
readstudent();
break;
case 5:
countstu();
break;
case 6:
{
Node*p=findstu();
if (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);
}
else
{
printf("没找到\n");
}
system("pause");
system("cls");
break;
}
case 7:
modifystu();
break;
case 8:
delegatestu();
break;
case 0:
printf("bye bye!!!!");
return 0;
dafault:
printf("输入有误!,重新来");
system("pause");
system("cls");
break;
}
}
return 0;
}