#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
struct student//结构体的创建
{
char name[20];
char num[20];
int math;
int english;
int python;
int sum;
int average;
};
struct Node
{
struct student data;
struct Node* next;
};
struct Node* list;
//创建表头-->创建结构体变量
struct Node* createHead( )
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
assert(headNode);//断言
headNode->next = NULL;
return headNode;
}
struct Node* createNode(struct student data)//把输入的数据存储到开辟的空间里
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
assert(newNode);
//->
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//插入
void insertData(struct Node* headNode, struct student data)//把开辟的空间(nowNode)与头节点连接、
{
struct Node* newNode = createNode(data);
newNode->next = headNode->next;//头插法
headNode->next=newNode;
/*newNode->next = headNode->next;
headNode->next = newNode; 尾插法*/
}
void printList(struct Node* headNode)//打印出链表中内容
{
struct Node* pmove = headNode->next;
printf("姓名\t编号\t数学\t英语\tpython\t总分\t平均分\n");
while (pmove != NULL)
{
printf("\t\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", pmove->data.name,pmove->data.num,
pmove->data.math,pmove->data.english,pmove->data.python,pmove->data.sum,pmove->data.average);
pmove = pmove->next;
}
}
void deleteDataByName(struct Node* headNode, const char* name)//从链表的第一个结点开始比较,直到找出符合条件的
{
struct Node* preNode = headNode;
struct Node* curNode = headNode->next;
while (curNode != NULL && strcmp(curNode->data.name,name))
{
preNode = curNode;
curNode = preNode->next;
}
if (curNode == NULL)
{
printf("删除失败!没有找到指定数据!\n");
}
else {
preNode->next = curNode->next ;
free(curNode);
}
}
struct Node* searchDataByName(struct Node* headNode, const char* name)
{
struct Node* pmove = headNode->next;
while (pmove != NULL && strcmp(pmove->data.name, name))
{
pmove = pmove->next;
}
return pmove;
}
//文件操作
//写文件
void saveToFile(struct Node* headNode, const char* fileName)
{
struct Node* pmove = headNode->next;
FILE* fp = fopen(fileName, "w");
while (pmove != NULL)
{
fprintf(fp, "\t\t % s\t % s\t % d\t % d\t % d\t % d\t % d\n", pmove->data.name, pmove->data.num,
pmove->data.math, pmove->data.english, pmove->data.py, pmove->data.sum, pmove->data.average);
pmove = pmove->next;
}
}
//读文件
void readFromFile(struct Node* headNode, const char* fileName)
{
FILE* fp = fopen(fileName, "r");
if (fp == NULL)
{
fp = fopen(fileName, "w+");
fclose(fp);
}
struct student temp;
while (fscanf(fp, "%s%s%d%d%d%d%d\n",
temp.name,
temp.num,
&temp.math,
&temp.english,
&temp.py,
&temp.sum,
&temp.average) != EOF)
{
insertData(list, temp);
}
}
void makeMenu()//制作菜单
{
//排序+文件
printf("*************【链式学生管理系统 】**************\n");
printf("************* 0.退出功能 **************\n");
printf("************* 1.录入功能 **************\n");
printf("************* 2.浏览功能 **************\n");
printf("************* 3.查找功能 **************\n");
printf("************* 4.修改功能 **************\n");
printf("************* 5.删除功能 **************\n");
printf("************************************************\n");
printf("---------------请输入(0-5):");
}
void keyDown()
{
int userkey = 0;
struct student temp;//用户输入
struct Node* result;
scanf_s("%d", &userkey);
switch (userkey)
{
case 0:
printf("---【退出模块】---");
system("pause");
exit(0);
break;
case 1:
printf("---【录入模块】---");
printf("请输入学生信息(name,num,math,english,pyt):");
scanf_s("%s%s%d%d%d", temp.name, 20,temp.num,20,&temp.math,&temp.english,&temp.py);
//手
temp.sum = temp.math + temp.english + temp.python;
temp.average = temp.sum / 3;
insertData(list, temp);
saveToFile(list, "student.txt");
break;
case 2:
printf("---【浏览模块】---");
printList(list);
break;
case 3:
printf("---【查找模块】---");
printf("请输入要查找的学生姓名:");
scanf_s("%s", temp.name, 20);
result = searchDataByName(list, temp.name);
if (result == NULL)
{
printf("未找到结果!!");
}
else {
printf("姓名\t编号\t数学\t英语\tpy\t总分\t平均分\n");
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",
result->data.name,
result->data.num,
result->data.math,
result->data.english,
result->data.python,
result->data.sum,
result->data.average);
}
break;
case 4:
printf("---【修改模块】---");
printf("请输入要修改的学生姓名:");
scanf_s("%s", temp.name, 20);
result = searchDataByName(list, temp.name);
if (result == NULL)
{
printf("未找到结果!!");
}
else {
printf("请输入学生信息(name,num,math,english,python):");
scanf_s("%s%s%d%d%d", result->data.name, 20, result->data.num, 20, &result->data.math, &result->data.english, &result->data.python);
result->data.sum = result->data.math + result->data.english + result->data.python;
result->data.average = result->data.sum / 3;
saveToFile(list, "student.txt");
}
break;
case 5:
printf("---【删除模块】---");
printf("请输入要删除的学生姓名:");
scanf_s("%s", temp.name, 20);
deleteDataByName(list, temp.name);
saveToFile(list, "student.txt");
break;
default:
printf("输入错误!请重新输入:");
break;
}
}
int main()
{
list = createHead();//接收链表头指针
readFromFile(list, "student.txt");
printf("\n");
while(1)
{
makeMenu();
keyDown();
system("pause");
system("cls");
}
return 0;
}