#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{ //定义学生的结构体
int number; //学号
char name[50]; //姓名
char sex[3]; //性别
int age; //年龄
int four_score[4]; //四科成绩
int average_score; //平均成绩
int total_score; //总成绩
struct student *next; //指向下一结构体的指针
} LinkList;
//声明函数
LinkList *input();
void output(LinkList *linklist);//输出
void insert(LinkList *linklist);//插入
void sort(LinkList *linklist);//排序
void delete(LinkList *linklist);//删除
void find(LinkList *linklist);//查找
//主函数
int main()
{
char c;
int j=1;
printf_s("please enter the num ,name,age,sexy and score:\n");
LinkList *linklist = input(); //调用input函数
printf_s("\nthe input student:\n");
output(linklist);
while(j)
{
printf_s("\n1.intput stuedent record\n2.sort student record\n3.search student record\n4.delete student record\n5.output student record\n6.exit system\n");
printf_s("please enter the opeartion what you want:\n");
scanf_s(" %c",&c);
}
while(j)
{if(c =='1'){ //输入学生记录
insert(linklist);
printf_s("the following are the modified tables:\n");
output(linklist);
}
else if(c == '2'){ //排序学生记录
sort(linklist);
printf_s("the following are the modified tables:\n");
output(linklist);
}
else if(c =='3'){ //查找学生记录
find(linklist);
}
else if(c =='4'){ //删除学生记录
delete(linklist);
printf_s("the following are the modified tables:\n");
output(linklist);
}
else if(c == '5'){ //输出学生记录
output(linklist);
}
else if(c == '6'){ //退出系统
printf_s("has withdrawn");
j=0;
}
}
getchar();getchar();
return 0;
}
LinkList *input(LinkList *linklist){
LinkList *head=NULL, *node=NULL, *end=NULL; //定义头节点,普通节点,尾部节点,并初始化
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (int i = 0; i <10; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf_s("%d %s %s %d %d %d %d %d",&node->number,node->name,node->sex,&node->age,&node->four_score[0],&node->four_score[1],&node->four_score[2],&node->four_score[3]);
node->average_score = (node->four_score[0]+node->four_score[1]+node->four_score[2]+node->four_score[3])/4;
node->total_score = node->four_score[0]+node->four_score[1]+node->four_score[2]+node->four_score[3];
end->next = node;
end = node;
}
end->next = NULL; //结束创建,给end的指针域置空
return head; //返回头节点的地址
}
void output(LinkList *linklist)
{
int j=1;
LinkList *p = linklist;
while (p->next != NULL) {
p = p->next;
printf_s("%d. %d %s %s %d %-3d %-3d %-3d %-3d %-3d %3d\n",j,p->number,p->name,p->sex,p->age,p->four_score[0],p->four_score[1],p->four_score[2],p->four_score[3],p->average_score,p->total_score);
j++;
}
}
void insert(LinkList *linklist)
{
LinkList *p = linklist ,*pr;
pr = (LinkList*)malloc(sizeof(LinkList)); //让pr指向新建节点申请的内存
printf_s("please enter the student record value: \n");
scanf_s("%d %s %s %d %d %d %d %d",&pr->number,pr->name,pr->sex,&pr->age,&pr->four_score[0],&pr->four_score[1],&pr->four_score[2],&pr->four_score[3]);
pr->average_score = (pr->four_score[0]+pr->four_score[1]+pr->four_score[2]+pr->four_score[3])/4;
pr->total_score = pr->four_score[0]+pr->four_score[1]+pr->four_score[2]+pr->four_score[3];
while((p->next->number)<(pr->number)){
p = p->next;
if(p->next==NULL){
break;
}
}
if(p!=NULL){
pr->next = p->next; //将新建节点的地址指向将要插入节点的后一个节点的地址
p->next = pr; //使插入节点指向新建节点
}
else{
pr->next = NULL;
p->next = pr;
}
}
void delete(LinkList *linklist)
{
char date[50]={0};
int num;
LinkList *p = linklist,*pr = linklist;
printf_s("which one would you delete:\n");
scanf_s("%s",date); //输入需删除的数据,姓名或学号
if (strspn(date, "0123456789") == strlen(date)){
num=atoi(date);
while(num != (p->number)||(strcmp(date,p->name)==0)){
pr = p;
p = p->next;
if(p==NULL){
break;
}
}
}
else{
while(strcmp(date,p->name)!=0){
pr = p;
p = p->next;
if(p==NULL){
break;
}
}
}
if(p!=NULL){
pr->next = p->next;
free(p);
} else{
pr->next = NULL;
free(p);
}
}
void find(LinkList *linklist)
{
char date[50]={0};
int num;
LinkList *p = linklist;
printf_s("which one would you want to search\n");
scanf_s("%s",date); //输入需查找的数据,姓名或学号
if (strspn(date, "0123456789") == strlen(date)){ //判断是否为学号(数字)
num=atoi(date); //是的话转换为数字
while(num != (p->number)||(strcmp(date,p->name)==0)){
p = p->next;
if(p==NULL){
break;
}
}
}
else{
while(strcmp(date,p->name)!=0){ //判断名字是否相同
p = p->next;
if(p==NULL){
break;
}
}
}
printf_s("%d %s %s %d %-3d %-3d %-3d %-3d %-3d %3d\n",p->number,p->name,p->sex,p->age,p->four_score[0],p->four_score[1],p->four_score[2],p->four_score[3],p->average_score,p->total_score);
}
void sort(LinkList *linklist) //用了冒泡排序
{
char b;
LinkList *pr,*p,*tail,*temp;
tail = NULL;
pr = linklist;
printf_s("select which way to sort it(1.numnum 2.the final score):\n");
scanf_s(" %c",&b);
while ((linklist->next->next)!=tail){
p = linklist->next;
pr = linklist;
while (p->next!=tail){
if(b == '1'){
if((p->number)>(p->next->number)){
pr->next=p->next;
temp=p->next->next;
p->next->next=p;
p->next=temp;
p=pr->next;
}
}
else if(b == '2'){
if((p->total_score)>(p->next->total_score)){
pr->next=p->next;
temp=p->next->next;
p->next->next=p;
p->next=temp;
p=pr->next;
}
}
p=p->next;
pr=pr->next;
}
tail=p;
}
}