#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int Status;
int language;
typedef struct
{
char num[12];
char name[20];
char sex;
int sum_of_subject;
int grade[20];
} stu;
typedef struct LNode
{
stu student;
LNode *next;
} node, *LinkList;
Status InofGBK(LNode *head)
{
LinkList p, r; // p是当前进行操作的指针,r是rear
r = head;
int n;
printf("输入学生总数:");
scanf("%d", &n);
printf("输入每个学生的信息:\n");
int i;
for (i = 1; i <= n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->next = NULL;
printf("输入学号:\n");
scanf("%s", p->student.num);
printf("输入学生姓名:\n");
scanf("%s", p->student.name);
printf("输入性别:\n");
// fflush(stdin);
getchar();
scanf("%c", &p->student.sex);
printf("输入科目总数:\n");
scanf("%d", &p->student.sum_of_subject);
for (int i = 0; i < p->student.sum_of_subject; ++i)
{
printf("输入第%d科的成绩:\n", i + 1);
scanf("%d", &p->student.grade[i]);
}
r->next = p;
r = r->next;
}
return n;
}
Status InofANSCII(LNode *head)
{
LinkList p, r; // p是当前进行操作的指针,r是rear
r = head;
int n;
printf("enter the sum:");
scanf("%d", &n);
printf("enter perinformation:\n");
int i;
for (i = 1; i <= n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->next = NULL;
printf("enter student number:\n");
scanf("%s", p->student.num);
printf("enter student's name:\n");
scanf("%s", p->student.name);
printf("enter sex:\n");
// fflush(stdin);
getchar();
scanf("%c", &p->student.sex);
printf("enter the total of all subjects:\n");
scanf("%d", &p->student.sum_of_subject);
for (int i = 0; i < p->student.sum_of_subject; ++i)
{
printf("enter the score of %dth:\n", i + 1);
scanf("%d", &p->student.grade[i]);
}
r->next = p;
r = r->next;
}
return n;
}
void out(LNode *head, char sex_)
{
LinkList p;
p = head;
bool flag = 1;
while (p->next != NULL)
{
p = p->next;
if (sex_ == '@' || sex_ == p->student.sex)
{
if (language)
{
printf("%s 's\nschool number is: %s\nsex is: %c\n", p->student.name, p->student.num, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
}
else
{
printf("%s的\n学号是: %s\n性别是: %c\n", p->student.name, p->student.num, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
}
printf("\n");
if (flag)
getchar();
flag = 0;
}
}
getchar();
}
void InsertList(LNode *head)
{
int i = 0;
int k;
LinkList p, r;
r = head;
stu e;
if (language)
printf("if need specific postion,please enter \"1\"\nelse enter any key\n");
else
printf("如果需要在特定位置插入,输入\"1\"\n不需要只需输入任意键\n");
getchar();
char c;
c = getchar();
if (c == '1')
{
if (language)
{
printf("please enter where you'll insert\n");
scanf("%d", &k);
printf("please enter the information of the student who'll be inserted:\n");
printf("enter school number:\n");
scanf("%s", e.num);
printf("enter name:\n");
scanf("%s", e.name);
printf("enter sex:\n");
getchar();
scanf("%c", &e.sex);
printf("enter the total of all subjects:\n");
scanf("%d", &e.sum_of_subject);
for (int i = 0; i < e.sum_of_subject; ++i)
{
printf("enter the score of %dth:\n", i + 1);
scanf("%d", &e.grade[i]);
}
}
else
{
printf("请输入你想插入学生的位置\n");
scanf("%d", &k);
printf("请输入插入学生的信息:\n");
printf("请输入学号:\n");
scanf("%s", e.num);
printf("请输入名字:\n");
scanf("%s", e.name);
printf("请输入性别:\n");
fflush(stdin);
scanf("%c", &e.sex);
printf("输入科目总数:\n");
scanf("%d", &e.sum_of_subject);
for (int i = 0; i < e.sum_of_subject; ++i)
{
printf("输入第%d科的成绩:\n", i + 1);
scanf("%d", &e.grade[i]);
}
}
while (r && i < k - 1)
{
r = r->next;
i++;
}
if (r != NULL)
{
p = (LinkList)malloc(sizeof(LNode));
p->student = e;
p->next = r->next;
r->next = p;
}
else
{
printf("insert wrang\n");
}
}
else
{
if (language)
{
printf("please enter the information of the student who'll be inserted:\n");
printf("enter school number:\n");
scanf("%s", e.num);
printf("enter name:\n");
scanf("%s", e.name);
printf("enter sex:\n");
getchar();
scanf("%c", &e.sex);
printf("enter the total of all subjects:\n");
scanf("%d", &e.sum_of_subject);
for (int i = 0; i < e.sum_of_subject; ++i)
{
printf("enter the score of %dth:\n", i + 1);
scanf("%d", &e.grade[i]);
}
}
else
{
printf("请输入插入学生的信息:\n");
printf("请输入学号:\n");
scanf("%s", e.num);
printf("请输入名字:\n");
scanf("%s", e.name);
printf("请输入性别:\n");
fflush(stdin);
scanf("%c", &e.sex);
printf("输入科目总数:\n");
scanf("%d", &e.sum_of_subject);
for (int i = 0; i < e.sum_of_subject; ++i)
{
printf("输入第%d科的成绩:\n", i + 1);
scanf("%d", &e.grade[i]);
}
}
while (1)
{
if (r->next == NULL)
break;
r = r->next;
}
p = (LinkList)malloc(sizeof(LNode));
p->student = e;
p->next = r->next;
r->next = p;
}
}
void DeleteList(LNode *head)
{
LinkList p, r;
int k;
r = head;
k = 0;
if (language)
printf("who you will delete and enter his(her) school number:\n");
else
printf("请输入你想删除学生的学号:\n");
char nu[12];
scanf("%s", nu);
stu e;
bool flag = 0;
while (r->next != NULL)
{
if (!strcmp(nu, r->next->student.num))
{
p = r->next;
// free(r->next);
r->next = p->next;
free(p);
flag = 1;
break;
}
r = r->next;
}
if (flag)
{
if (language)
printf("Accept!\n");
else
printf("删除成功!\n");
getchar();
}
else
{
if (language)
printf("Not found!\n");
else
printf("未找到该学生!");
getchar();
}
getchar();
return;
}
Status searchway()
{
int x;
if (language)
{
printf("please choose way to search:\n");
printf("\"1\" for name\n\"2\" for student number\n\"3\" for grades\n\"4\" for sex\n");
}
else
{
printf("请选择一种方式搜索:\n");
printf("\"1\" 代表按姓名\n\"2\" 代表按学号\n\"3\" 代表按单科成绩\n\"4\" 代表性别\n");
}
scanf("%d", &x);
getchar();
return x;
}
void search1(LNode *head)
{
LinkList p;
p = head;
if (language)
printf("please enter student's name:\n");
else
printf("请输入学生姓名:");
stu e;
scanf("%s", e.name);
bool flag = 0;
while (p->next != NULL)
{
p = p->next;
if (!strcmp(e.name, p->student.name))
{
if (language)
{
printf("school number is: %s\nsex is: %c\n", p->student.num, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
}
else
{
printf("学号是: %s\n性别是: %c\n", p->student.num, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
}
getchar();
flag = 1;
break;
}
}
if (!flag)
{
if (language)
printf("Wrang!\n");
else
printf("学生不存在!\n");
getchar();
}
getchar();
return;
}
void search2(LNode *head)
{
LinkList p;
if (language)
printf("please enter the school number of student:\n");
else
printf("请输入学生学号:");
stu e;
char nu[12];
scanf("%s", nu);
p = head;
bool flag = 0;
while (p->next != NULL)
{
p = p->next;
if (!strcmp(nu, p->student.num))
{
if (language)
{
printf("name is: %s\nsex is: %c\n", p->student.name, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
}
else
{
printf("姓名是: %s\n性别是: %c\n", p->student.name, p->student.sex);
for (int i = 0; i < p->student.sum_of_subject; ++i)
printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
}
getchar();
flag = 1;
break;
}
}
if (!flag)
{
if (language)
printf("Wrang!\n");
else
printf("学生不存在!\n");
getchar();
}
getchar();
return;
}
void search3(LNode *head, const int subject)
{
LinkList p;
p = head;
if (language)
{
printf("please enter student's score:\n");
printf("We'll match you with the student(students) with the closest score automatically\n");
}
else
{
printf("请输入学生该门科成绩:\n");
printf("我们将会自动为您匹配 与您输入的成绩 最接近的学生:\n");
}
int sco;
scanf("%d", &sco);
int dev = 1e5;
char mark[20][12];
int k = 0; //存同分的人数
while (p->next != NULL)
{
p = p->next;
if (abs(p->student.grade[subject] - sco) < dev) //查找(所输入成绩与学生成绩)差值最小的学生,并将学号存入mark[]
{
dev = abs(p->student.grade[subject] - sco);
k = 0;
strcpy(mark[0], p->student.num);
}
else if (abs(p->student.grade[subject] - sco) == dev) //继续查找是否有相同成绩的人
{
strcpy(mark[++k], p->student.num);
}
}
LinkList q;
q = head;
int i = 0;
for (; i <= k; i++)
{
while (q->next != NULL)
{
q = q->next;
if (!strcmp(mark[i], q->student.num))
{
if (language)
{
printf("school number is: %s\nname is: %s\nsex is: %c\n", q->student.num, q->student.name, q->student.sex);
for (int i = 0; i < q->student.sum_of_subject; ++i)
printf("the score of the %dth subject is %d\n", i + 1, q->student.grade[i]);
}
else
{
printf("学号是: %s\n姓名是: %s\n性别是: %c\n", q->student.num, q->student.name, q->student.sex);
for (int i = 0; i < q->student.sum_of_subject; ++i)
printf("第%d门学科的成绩是%d\n", i + 1, q->student.grade[i]);
}
printf("\n");
getchar();
break;
}
}
}
getchar();
return;
}
void menuofANSCII()
{
printf("*****************************************************\n");
printf("* 1.enter students *\n");
printf("* 2.search nodes *\n");
printf("* 3.insert node *\n");
printf("* 4.delete node *\n");
printf("* 5.show all nodes *\n");
printf("* 6.exit *\n");
printf("* plaese chose a function *\n");
printf("*****************************************************\n");
}
void menuofGBK()
{
printf("*****************************************************\n");
printf("* 1.逐个输入学生信息 *\n");
printf("* 2.根据特征搜索学生 *\n");
printf("* 3.插入学生 *\n");
printf("* 4.删除学生 *\n");
printf("* 5.显示所有学生 *\n");
printf("* 6.退出 *\n");
printf("* 请选择相应功能 *\n");
printf("*****************************************************\n");
}
int main()
{
printf("请选择你的语言:\n\"0\"代表中文\n\"1\"refers to English\n");
scanf("%d", &language);
int x;
LNode *head;
head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
bool flag = 0;
while (1)
{
system("cls");
if (language)
menuofANSCII();
else
menuofGBK();
scanf("%d", &x);
switch (x)
{
case 1:
if (language)
flag = InofANSCII(head);
else
flag = InofGBK(head);
break;
case 2:
switch (searchway())
{
case 1:
search1(head);
break;
case 2:
search2(head);
break;
case 3:
if (language)
printf("plesse enter the serial number of the subject:\n");
else
printf("输入你想查找的科目序号:\n");
int ord;
scanf("%d", &ord);
search3(head, ord - 1);
break;
case 4:
if (language)
printf("plesse enter the sex you want:\n");
else
printf("输入你想查找的性别:\n");
char c;
c = getchar();
out(head, c);
}
break;
case 3:
if (!flag)
{
if (language)
printf("you must enter students by \"1\" first!\nenter any key to exit");
else
printf("你必须先使用\"1\"输入学生信息\n输入任意键退出");
getchar();
getchar();
break;
}
InsertList(head);
break;
case 4:
DeleteList(head);
break;
case 5:
out(head, '@');
break;
case 6:
return 0;
}
}
}
/*
测试数据:
输入
3
01
zhang
f
3
34 56 56
02
li
m
3
78 90 97
03
huang
f
3
34 54 67
插入
1
4
04
ai
f
3
89 78 90
*/
链表实现学生信息管理系统(C语言)
最新推荐文章于 2024-04-08 20:39:20 发布