115 lines
2.6 KiB
C
115 lines
2.6 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
typedef struct Player {
|
||
char name[8];
|
||
int score;
|
||
struct Player* next;
|
||
} Player;
|
||
|
||
Player* createPlayer(const char* name, int score) {
|
||
Player* newPlayer = (Player*)malloc(sizeof(Player));
|
||
if (newPlayer == NULL) {
|
||
fprintf(stderr, "記憶體分配失敗\n");
|
||
exit(1);
|
||
}
|
||
strncpy(newPlayer->name, name, 7);
|
||
newPlayer->name[7] = '\0';
|
||
newPlayer->score = score;
|
||
newPlayer->next = NULL;
|
||
return newPlayer;
|
||
}
|
||
|
||
void addPlayer(Player** head, const char* name, int score) {
|
||
Player* newPlayer = createPlayer(name, score);
|
||
newPlayer->next = *head;
|
||
*head = newPlayer;
|
||
}
|
||
|
||
void sortPlayers(Player** head) {
|
||
int swapped;
|
||
Player* ptr1;
|
||
Player* lptr = NULL;
|
||
|
||
if (*head == NULL)
|
||
return;
|
||
|
||
do {
|
||
swapped = 0;
|
||
ptr1 = *head;
|
||
|
||
while (ptr1->next != lptr) {
|
||
if (ptr1->score < ptr1->next->score) {
|
||
int tempScore = ptr1->score;
|
||
char tempName[8];
|
||
strcpy(tempName, ptr1->name);
|
||
|
||
ptr1->score = ptr1->next->score;
|
||
strcpy(ptr1->name, ptr1->next->name);
|
||
|
||
ptr1->next->score = tempScore;
|
||
strcpy(ptr1->next->name, tempName);
|
||
|
||
swapped = 1;
|
||
}
|
||
ptr1 = ptr1->next;
|
||
}
|
||
lptr = ptr1;
|
||
} while (swapped);
|
||
}
|
||
|
||
void printResults(Player* head) {
|
||
printf("\n成績排名\n============\n");
|
||
int rank = 1;
|
||
while (head != NULL) {
|
||
if (rank == 1)
|
||
printf("%d. %s %d 冠軍\n", rank, head->name, head->score);
|
||
else if (rank == 2)
|
||
printf("%d. %s %d 亞軍\n", rank, head->name, head->score);
|
||
else if (rank == 3)
|
||
printf("%d. %s %d 季軍\n", rank, head->name, head->score);
|
||
else
|
||
printf("%d. %s %d\n", rank, head->name, head->score);
|
||
head = head->next;
|
||
rank++;
|
||
}
|
||
}
|
||
|
||
void freeList(Player* head) {
|
||
Player* temp;
|
||
while (head != NULL) {
|
||
temp = head;
|
||
head = head->next;
|
||
free(temp);
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
Player* head = NULL;
|
||
char input[32];
|
||
char name[8];
|
||
int score;
|
||
|
||
printf("請逐筆輸入參賽者的資訊...\n");
|
||
|
||
while (1) {
|
||
printf("輸入參賽者名字 得分(或按Enter結束)=> ");
|
||
if (fgets(input, sizeof(input), stdin) == NULL || strcmp(input, "\n") == 0) {
|
||
break;
|
||
}
|
||
|
||
if (sscanf(input, "%7s %d", name, &score) == 2) {
|
||
addPlayer(&head, name, score);
|
||
} else {
|
||
printf("輸入格式錯誤,請重新輸入。\n");
|
||
}
|
||
}
|
||
|
||
sortPlayers(&head);
|
||
printResults(head);
|
||
freeList(head);
|
||
|
||
return 0;
|
||
}
|