|

楼主 |
发表于 2021-1-20 23:07:49
|
显示全部楼层
实现函数:
- #include "sports.h"
- //初始化头指针
- void Init(LinkList &Head)
- {
- Head = (LinkNode *)malloc(sizeof(LinkNode)); //申请头结点
- Head->rank = 0;
- Head->score = 0;
- Head->sex = -1;
- strcpy(Head->name, "");
- strcpy(Head->college, "");
- strcpy(Head->item, "");
- Head->next = NULL;
- }
- //根据排名得到相应的分数
- int GetScore(int rank)
- {
- if (rank == 1)
- return 9;
- else if (rank == 2)
- return 7;
- else if (rank == 3)
- return 6;
- else if (rank == 4)
- return 5;
- else if (rank == 5)
- return 4;
- else if (rank == 6)
- return 3;
- else if (rank == 7)
- return 2;
- else if (rank == 8)
- return 1;
- else
- return 0;
- }
- //初始化程序,输入学院名,项目名和选手成绩
- void Input(LinkList &Head, int &CollegeNum, int &ItemNum, char Colleges[][20], char Items[][20])
- {
- int i, r, flag = 0;
- int score = 0, rank = 0, sex = 0; // 存储输入变量;
- char name[20] = {'\0'}, college[20] = {'\0'}, item[20] = {'\0'}; // 存储输入变量存储;
- int count = 1; // 计数器
- printf("请输入学院个数 n<10 \n");
- while (r = scanf("%d", &CollegeNum) != 1 || CollegeNum > 10 || CollegeNum < 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- fflush(stdin); /*清空输入缓冲区,也可以使用rewind(stdin);*/
- }
- for (i = 0; i < CollegeNum; i++)
- {
- printf("请输入第%d学院名\n", i + 1);
- scanf("%s", &Colleges[i]);
- fflush(stdin);
- }
- printf("请输入项目个数 n<10 \n");
- while (r = scanf("%d", &ItemNum) != 1 || ItemNum > 10 || ItemNum < 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- fflush(stdin);
- }
- for (i = 0; i < ItemNum; i++)
- {
- printf("请输入第%d项目名\n", i + 1);
- scanf("%s", &Items[i]);
- }
- while (true)
- {
- fflush(stdin);
- printf("请输入第%d个选手数据\n", count);
- printf("请输入姓名\n");
- r = scanf("%s", &name);
- if (r == 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- break;
- }
- printf("请输入性别 0代表女性 1代表男性\n");
- r = scanf("%d", &sex);
- if (r == 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- break;
- }
- printf("请输入学院\n");
- r = scanf("%s", &college);
- if (r == 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- break;
- }
- printf("请输入项目\n");
- r = scanf("%s", &item);
- if (r == 0)
- {
- printf(" 您的输入有误,请重新输入! \n");
- break;
- }
- printf("请输入名次 1-8\n");
- r = scanf("%d", &rank);
- if (r == 0 && rank < 0 && rank > 8)
- {
- printf(" 您的输入有误,请重新输入! \n");
- break;
- }
- score = GetScore(rank);
- Create(Head, score, rank, sex, name, college, item);
- count++;
- printf("0 结束输入数据 , 1 输入数据\n");
- scanf("%d", &flag);
- if (flag == 0)
- break;
- }
- }
- //创建链表
- void Create(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
- {
- LinkNode *p = Head->next, *s;
- //如果链表为空,则做初始化链表
- if (p == NULL)
- {
- s = (LinkNode *)malloc(sizeof(LinkNode));
- assert(s != NULL);
- s->score = score;
- s->rank = rank;
- s->sex = sex;
- strcpy(s->name, name);
- strcpy(s->college, college);
- strcpy(s->item, item);
- s->next = NULL;
- Head->next = s;
- }
- else
- {
- while (p->next != NULL)
- {
- p = p->next;
- }
- s = (LinkNode *)malloc(sizeof(LinkNode));
- assert(s != NULL);
- s->score = score;
- s->rank = rank;
- s->sex = sex;
- strcpy(s->name, name);
- strcpy(s->college, college);
- strcpy(s->item, item);
- s->next = NULL;
- p->next = s;
- }
- }
- //打印所有的数据
- void Show(LinkList Head)
- {
- int count = 1;
- Node *p = Head->next;
- while (p != NULL)
- {
- printf("打印第%d个成绩\n", count);
- Print(p);
- p = p->next;
- count++;
- }
- }
- //保存数据为.txt文件
- void Save(LinkList Head, char Colleges[][20], int CollegesNum, char Items[][20], int ItemNum)
- {
- int i;
- //保存选手数据
- FILE *file;
- file = fopen("sports_data.txt", "w");
- if (file == NULL)
- {
- printf("文件创建失败请检查!\n");
- exit(0);
- }
- Node *p = Head->next;
- while (p != NULL)
- {
- fprintf(file, "%s\t", p->name);
- fprintf(file, "%d\t", p->sex);
- fprintf(file, "%s\t", p->college);
- fprintf(file, "%s\t", p->item);
- fprintf(file, "%d\t", p->rank);
- fprintf(file, "%d\n", p->score);
- p = p->next;
- }
- fclose(file);
- file = NULL; //将指针置为NULL ,打开另一个文件
- file = fopen("Colleges_Items.txt", "w");
- if (file == NULL)
- {
- printf("文件创建失败请检查!\n");
- exit(0);
- }
- //保存项目数和学院数
- fprintf(file, "%d\t", CollegesNum);
- fprintf(file, "%d\t", ItemNum);
- //保存项目名字和学院名字
- for (i = 0; i < CollegesNum; i++)
- {
- fprintf(file, "%s\t", Colleges[i]);
- }
- for (i = 0; i < ItemNum; i++)
- {
- fprintf(file, "%s\t", Items[i]);
- }
- fclose(file);
- }
- //读取txt文件中的数据
- void Read(LinkList Head, char Colleges[][20], int &CollegesNum, char Items[][20], int &ItemNum)
- {
- if (Head->next != NULL)
- {
- printf("已读取数据!\n");
- return;
- }
- FILE *file;
- int i = 0;
- file = fopen("sports_data.txt", "r");
- if (file == NULL)
- {
- printf("文件读取失败请初始化!\n");
- exit(0);
- }
- int score, rank, sex; // 作为输入变量存储;
- char name[20], college[20], item[20]; // 作为输入变量存储;
- //当指针不为结束符,一直++
- //读入所有的选手成绩
- while (!feof(file))
- {
- fscanf(file, "%s", &name);
- fscanf(file, "%d\t", &sex);
- fscanf(file, "%s\t", &college);
- fscanf(file, "%s\t", &item);
- fscanf(file, "%d\t", &rank);
- fscanf(file, "%d\n", &score);
- Create(Head, score, rank, sex, name, college, item);
- }
- fclose(file);
- //读取学院名字和项目名字
- file = NULL;
- file = fopen("colleges_items.txt", "r");
- if (file == NULL)
- {
- printf("文件读取失败请初始化!\n");
- exit(0);
- }
- while (!feof(file))
- {
- fscanf(file, "%d\t", &CollegesNum);
- fscanf(file, "%d\t", &ItemNum);
- for (i = 0; i < CollegesNum; i++)
- {
- fscanf(file, "%s\t", &Colleges[i]);
- }
- for (i = 0; i < CollegesNum; i++)
- {
- fscanf(file, "%s\t", &Items[i]);
- }
- }
- fclose(file);
- }
- //学院分数
- void Collegescore(LinkList Head, char Colleges[][20], int CollegesNum)
- {
- int score[N] = {0}; //
- int i;
- LinkList list;
- Node *p = NULL;
- //计算每个学院的分数
- Init(list);
- for (i = 0; i < CollegesNum; i++)
- {
- p = Head->next;
- while (p != NULL)
- {
- if (strcmp(Colleges[i], p->college) == 0)
- {
- score[i] += p->score;
- }
- p = p->next;
- }
- }
- //按分数大小建立一个链表
- for (i = 0; i < CollegesNum; i++)
- {
- Insert(list, score[i], 0, 0, "", Colleges[i], "");
- }
- //打印学院成绩
- p = NULL;
- p = list->next;
- while (p != NULL)
- {
- printf("%s学院得分为%8d\n", p->college, p->score);
- p = p->next;
- }
- Free(list);
- }
- //释放链表
- void Free(LinkList &Head)
- {
- Node *p = NULL, *q = NULL;
- p = Head->next;
- //链表为空直接返回
- if (p == NULL)
- {
- free(Head);
- return;
- }
- while (p != NULL)
- {
- q = p;
- p = p->next;
- free(q);
- }
- free(Head);
- }
- //按男女统计得分
- void SexScore(LinkList Head, char Colleges[][20], int CollegesNum)
- {
- LinkList man_score, woman_score;
- Init(man_score);
- Init(woman_score);
- int i;
- for (i = 0; i < CollegesNum; i++)
- {
- int a[N] = {0};
- Node *p = Head->next;
- LinkList man, womon;
- Init(man);
- Init(womon);
- while (p != NULL)
- { //统计某学院男生,女生成绩
- if (strcmp(Colleges[i], p->college) == 0 && p->sex == 0)
- {
- Insert(womon, p->score, p->rank, p->sex, p->name, p->college, p->item);
- }
- if (strcmp(Colleges[i], p->college) == 0 && p->sex == 1)
- {
- Insert(man, p->score, p->rank, p->sex, p->name, p->college, p->item);
- }
- p = p->next;
- }
- p = man->next;
- while (p != NULL)
- {
- a[i] += p->score;
- p = p->next;
- }
- Insert(man_score, a[i], 0, 0, "", Colleges[i], "");
- p = NULL;
- a[i] = 0;
- p = womon->next;
- while (p != NULL)
- {
- a[i] += p->score;
- p = p->next;
- }
- Insert(woman_score, a[i], 0, 0, "", Colleges[i], "");
- Free(man);
- Free(womon);
- }
- Node *q;
- q = man_score->next;
- printf("学院男生团体的前八名为\n");
- while (q != NULL)
- {
- printf("%s男生团体得分为: %d\n", q->college, q->score);
- q = q->next;
- }
- q = NULL;
- q = woman_score->next;
- printf("学院女生团体的前八名为\n");
- while (q != NULL)
- {
- printf("%s女生团体得分为: %d\n", q->college, q->score);
- q = q->next;
- }
- Free(man_score);
- Free(woman_score);
- }
- //查询某学院某个项目获奖情况
- void QueryCollege(LinkList Head)
- {
- char item[20], college[20];
- printf("请输入您要查询的学院名:\n");
- scanf("%s", &college);
- printf("请输入您要查询的项目名:\n");
- scanf("%s", &item);
- Node *p = Head->next;
- while (p != NULL)
- {
- if (strcmp(college, p->college) == 0 && strcmp(item, p->item) == 0)
- {
- Print(p);
- }
- p = p->next;
- }
- }
- //查询选手成绩
- void QueryName(LinkList Head)
- {
- char name[20];
- printf("请输入您要查询的选手姓名:\n");
- scanf("%s", &name);
- Node *p = Head->next;
- while (p != NULL)
- {
- if (strcmp(name, p->name) == 0)
- {
- Print(p);
- }
- p = p->next;
- }
- }
- // 按大小顺序插入建立一个链表
- void Insert(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
- {
- LinkNode *p = Head->next, *s = NULL;
- LinkNode *q = Head;
- //如果链表为空,则做初始化链表
- if (p == NULL)
- {
- s = (LinkNode *)malloc(sizeof(LinkNode));
- assert(s != NULL);
- s->score = score;
- s->rank = rank;
- s->sex = sex;
- strcpy(s->name, name);
- strcpy(s->college, college);
- strcpy(s->item, item);
- s->next = NULL;
- Head->next = s;
- }
- else
- {
- while (p != NULL && score <= p->score)
- {
- q = p;
- p = p->next;
- }
- s = (LinkNode *)malloc(sizeof(LinkNode));
- assert(s != NULL);
- s->score = score;
- s->rank = rank;
- s->sex = sex;
- strcpy(s->name, name);
- strcpy(s->college, college);
- strcpy(s->item, item);
- s->next = p;
- q->next = s;
- }
- }
- //查询项目得分情况
- void QueryItem(LinkList Head)
- {
- char item[20];
- LinkList t;
- Init(t);
- printf("请输入您要查询的项目名:\n");
- scanf("%s", &item);
- Node *p = Head->next;
- while (p != NULL)
- {
- if (strcmp(item, p->item) == 0)
- {
- Insert(t, p->score, p->rank, p->sex, p->name, p->college, p->item);
- }
- p = p->next;
- }
- p = t->next;
- printf("%s项目前八名为\n", item);
- while (p != NULL)
- {
- Print(p);
- p = p->next;
- }
- }
- //打印指针内的数据
- void Print(Node *p)
- {
- printf("\n\n\n\n");
- printf("*************************\n");
- printf("姓名为 ");
- printf("%s\n", p->name);
- printf("性别为 ");
- printf("%d\n", p->sex);
- printf("学院为 ");
- printf("%s\n", p->college);
- printf("项目为 ");
- printf("%s\n", p->item);
- printf("名次为 ");
- printf("%d\n", p->rank);
- printf("分数为 ");
- printf("%d\n", p->score);
- }
复制代码 |
|