内容&思路 : 利用结构体链表,完成学生信息的录入和排序两大功能
因为是自己写的所以称为"简陋版",其中冒泡排序部分参照了别人图书管理系统的写法,但是我现在找不到那个人了,所以就不说了
本人目前大一,数据结构还没学所以程序只能完成两个功能,以后学完后,会更新查找和删除的模块
所以本程序主要是完成两个任务,即录入学生信息和对学生信息指定项排序输出
特点:
1.可以无限录入学生信息,也就是说输入n个学生的信息,n无上限
2.双层结束检测,假如输入录入学生人数10,可以通过输入10个学生的完整信息结束输入,也可以输入小于10个人的完整信息,比如6个,以’ # '结尾即可
3.排序后可以追加学生信息录入,也可以再次选择排序
/*----------------------- ---简要说明(brief_introduce)----------------------**
1.*对仅输入1位同学的信息时,排序无意义,程序不支持对其进行排序*
2.输入提示:同学们的学号、姓名、性别、专业、学院、3门课成绩需依次对应
例如:
学号:E02014125 姓名:张三 性别:男 专业:计科 学院:计院
语文 : 88.0 数学 : 89.5 英语:90.5
则录入信息为:E02014125 张三 男 计科 计院 88.0 89.5 90.5
!!!注意:严格按例输入!
学号:第1位为大写字母,一共9个字符
姓名:2~3个汉字
性别:男 or 女
专业、学院均为2个汉字
3门成绩依次用空格隔开
**-----------------------------输入小贴士(input_tips)------------------------*/
#include
#include
#include
int main_menu();
int sub_menu_1();
int sub_menu_2();
typedef struct Node
{
char * num,* name,* gender;
char * major, * depart;
float * score;
struct Node *next;
}Stu;
void print(Stu *head);
Stu *bubble_sort(Stu *head, int n);
void create();
int main(void)
{
create();
printf("谢谢使用!");
system("pause");
return 0;
}
int main_menu()
{
int n;
printf("---------------主菜单---------------\n");
printf("* (1)学号, 名字, 性别, 专业, 院系 *\n");
printf("* (2)语、数、外成绩 *\n");
printf("-------------请选择数字-------------\n");
scanf("%d", &n);
while(n != 1 && n != 2)
{
printf("输入错误!\n");
printf("请再次输入一个范围内的数字:\n");
scanf(" %d", &n);
}
return n;
}
int sub_menu_1()
{
int n;
printf("------------副菜单1------------\n");
printf("*(0) 学号, (1) 名字 , (2) 性别*\n");
printf("* (3) 专业, (4) 院系 * \n");
printf("-----------请选择数字----------\n");
scanf("%d", &n);
while(n < 0 || n > 4)
{
printf("输入错误!\n");
printf("请再次输入一个范围内的数字:\n");
scanf(" %d", &n);
}
return n;
}
int sub_menu_2()
{
int n;
printf("------------副菜单2-----------\n");
printf("* (1)语文, (2)英语, (3)数学 *\n");
printf("---------请选择一个数字-------\n");
scanf("%d", &n);
while(n < 1 || n > 4)
{
printf("输入错误!\n");
printf("请再次输入一个范围内的数字:\n");
scanf("%d", &n);
}
return n;
}
void create()
{
Stu *head, *p, *q, *pd;
char ch;
char *num, *name, *gender, *major, *depart;
float *score;
int i, n = 0;
num = (char *)malloc(10*sizeof(char));
head = (Stu *)malloc(sizeof(Stu));
head->next = NULL;
q = head;
p = head->next;
printf("1.添加学生信息 2.对学生信息排序 3.关闭程序\n");
printf("请输入指令:\n");
while((scanf("%d", &i)) != 1)
printf("输入不合法!请重新输入:\n");
do
{
if(i == 1)
{
printf("请输入需要录入的人数:\n");
while((scanf("%d", &n)) != 1)
printf("输入不合法!请重新输入:\n");
printf("请输入学生的学号,姓名,性别,专业,院系");
printf("和三门课的成绩: 按#键结束\n");
scanf("%s", num);
while (num[0] != '#')
{
p = (Stu *)malloc(sizeof(Stu));
p->num = num;
name = (char *)malloc(7*sizeof(char));
gender = (char *)malloc(3*sizeof(char));
major = (char *)malloc(5*sizeof(char));
depart = (char *)malloc(5*sizeof(char));
score = (float *)malloc(3*sizeof(float));
scanf("%s %s %s",name,gender,major);
scanf("%s %f %f %f",depart,&score[0],&score[1],&score[2]);
p->name = name;
p->gender = gender;
p->major = major;
p->depart = depart;
p->score = score;
p->next = NULL;
q->next = p;
q = p;
n = n - 1;
if(!n)
{
n = -1;
printf("录入成功!");
print(head);
break;
}
num = (char *)malloc(10*sizeof(char));
scanf(" %s", num);
}
if(n != -1)
{
printf("录入成功!");
print(head);
}
printf("任务1结束...\n");
}
else if(i == 2)
{
q = p = bubble_sort(head,main_menu());
print(head);
printf("任务2结束!...\n");
}
else
{
printf("谢谢使用!");
exit(0);
}
printf("1.添加学生信息 2.对学生信息排序 3.关闭程序\n");
printf("请输入指令:\n");
scanf(" %d", &i);
}while(i == 1 || i == 2);
return;
}
Stu *bubble_sort(Stu *head, int n)
{
Stu *pre, *p, *tail, *temp;
int m;
tail = NULL;
pre = head;
if(n == 1)
n = sub_menu_1();
else
{
n = 5;
m = sub_menu_2() - 1;
}
while ((head->next->next) != tail)
{
p = head->next;
pre = head;
while (p->next != tail)
{
if(n == 0)
{
if (strcmp((p->num),(p->next->num)) > 0)
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
else if(n == 1)
{
if (strcmp((p->name),(p->next->name)) > 0)
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
else if(n == 2)
{
if (strcmp((p->gender),(p->next->gender)) > 0)
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
else if(n == 3)
{
if (strcmp((p->major),(p->next->major)) > 0)
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
else if(n == 4)
{
if (strcmp((p->depart),(p->next->depart)) > 0)
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
else if(n == 5)
{
if ((p->score[m])>(p->next->score[m]))
{
pre->next = p->next;
temp = p->next->next;
p->next->next = p;
p->next = temp;
p = pre->next;
}
}
p = p->next;
pre = pre->next;
}
tail = p;
}
while(p->next != NULL)
p = p->next;
return p;
}
void print(Stu *head)
{
int i;
Stu *p = head->next;
printf("Ranking-List输出:\n");
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*学生信息表-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("学号 姓名 性别 专业 学院 语文 数学 英语\n");
while (p)
{
printf("%-6s %-6s %-8s %-6s %-6s ",p->num,p->name,p->gender,p->major,p->depart);
printf(" %-6.2f %-6.2f %-6.2f\n",p->score[0],p->score[1],p->score[2]);
p = p->next;
}
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
}