#include #include #include 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; }