Data_Structure/作業/unit4/DS4.c

442 lines
10 KiB
C
Raw Normal View History

2025-01-20 21:30:53 +08:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define MAX_NAME_LENGTH 24
//<2F>ŧi<C5A7><EFBFBD>
void init_f();
void insertStudent(char* name, int english, int math);
void modify_list();
void add_data(char* name, int english, int math);
void remove_data(char* name);
void readStudentsFromFile(char* filename);
void printStudentList();
void sort_name();
void sort_eng();
void sort_math();
void choose_subject();
void find_student(int number , int mode);
// <20>w<EFBFBD>q<EFBFBD>ǥ͸`<60>I<EFBFBD><49><EFBFBD>c
typedef struct Student {
char name[MAX_NAME_LENGTH];
int english;
int math;
struct Student* llink;
struct Student* rlink;
} Student;
Student *head, *tail, *current, *prev, *temp;
FILE* file;
//<2F>]<5D>@<40><> head<61>A<EFBFBD>N<EFBFBD><4E><EFBFBD>k<EFBFBD><EFBFBD>ҫ<EFBFBD><D2AB>V<EFBFBD><56><EFBFBD><EFBFBD>
void init_f() {
head = (Student *) malloc(sizeof(Student)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> head
head->llink = head; // <20><><EFBFBD><EFBFBD><ECB5B2><EFBFBD>V<EFBFBD>ۤv
head->rlink = head; // <20>k<EFBFBD><EFBFBD><ECB5B2><EFBFBD>V<EFBFBD>ۤv
tail = head;
}
// <20>b<EFBFBD><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>s<EFBFBD>ǥ͸`<60>I
void insertStudent(char* name, int english, int math) {
Student* newNode = (Student*)malloc(sizeof(Student));
strcpy(newNode->name, name);
newNode->english = english;
newNode->math = math;
if(head->rlink == tail) {
// <20>o<EFBFBD>O<EFBFBD>Ĥ@<40>Ӵ<EFBFBD><D3B4>J<EFBFBD><4A><EFBFBD>`<60>I
head->rlink = newNode;
tail->llink = newNode;
newNode->llink = head;
newNode->rlink = tail;
} else {
//<2F><><EFBFBD>O<EFBFBD>Ĥ@<40><> <20><><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD>
newNode->llink = tail->llink;
newNode->rlink = tail;
tail->llink->rlink = newNode;
tail->llink = newNode;
}
}
// <20><><EFBFBD><EFBFBD>***<2A><EFBFBD>W<EFBFBD>[<5B>δ<EFBFBD><CEB4>ָ<EFBFBD><D6B8><EFBFBD>
void modify_list(){
char name[MAX_NAME_LENGTH];
int english, math;
char line[100];
while(fgets(line, sizeof(line), file)!=NULL){
if(line[0]=='+'){
sscanf(line+2, "%23[^\t]\t%d\t%d\n", name, &english, &math);
printf("\n*******************************\n");
printf("<EFBFBD>W<EFBFBD>[<5B>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n");
add_data(name, english, math);
printStudentList();
}else if(line[0]=='-'){
sscanf(line+2, "%23[^\t]\t%d\t%d\n", name, &english, &math);
printf("\n*******************************\n");
printf("<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n");
remove_data(name);
printStudentList();
}
}
fclose(file);
}
//<2F>W<EFBFBD>[<5B><><EFBFBD><EFBFBD>
void add_data(char* name, int english, int math){
Student* newNode = (Student*)malloc(sizeof(Student));
strcpy(newNode->name, name);
newNode->english = english;
newNode->math = math;
newNode->llink = tail->llink;
newNode->rlink = tail;
tail->llink->rlink = newNode;
tail->llink = newNode;
printf("%s <20>w<EFBFBD>W<EFBFBD>[\n\n", name);
}
//<2F><><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
void remove_data(char* name){
prev = head;
current = head->rlink;
while(current!=tail &&strcmp(name,current->name)!=0){
prev=current;
current=current->rlink;
}
if(current != tail){
current->rlink->llink = prev;
prev->rlink = current->rlink;
printf("%s <20>w<EFBFBD>R<EFBFBD><52>\n\n", name);
free(current);
}else /* <20><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB><68><EFBFBD>ܿ<EFBFBD><DCBF>~ */
printf(" %s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>C<EFBFBD><43>\n", name);
}
// <20>q<EFBFBD><71><EFBFBD><EFBFBD>Ū<EFBFBD><C5AA><EFBFBD>ǥ͸<C7A5><CDB8><EFBFBD>
void readStudentsFromFile(char* filename) {
file = fopen(filename, "r");
if (file == NULL) {
printf("<EFBFBD>L<EFBFBD>k<EFBFBD>}<7D><><EFBFBD>ɮ<EFBFBD> %s\n", filename);
return;
}
char line[100];
int lineCount = 0;
// <20><><EFBFBD>L<EFBFBD>e<EFBFBD>|<7C><>
while (lineCount < 4 && fgets(line, sizeof(line), file)) {
lineCount++;
}
// Ū<><C5AA><EFBFBD>ǥ͸<C7A5><CDB8><EFBFBD>
char name[MAX_NAME_LENGTH];
int english, math;
// %[ ]<5D><><EFBFBD>ܭnŪ<6E>J<EFBFBD>@<40>Ӧr<D3A6>Ŷ<EFBFBD><C5B6>X
// %23[^\t]<5D><><EFBFBD><75><C5AA><EFBFBD>̦h23<32>Ӧr<D3A6>šA<C5A1><41><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A>\t<><74><EFBFBD><EFBFBD><EFBFBD>v ^<5E><><EFBFBD>D <20><><EFBFBD>O\t<>
// <20>Y<EFBFBD><59><EFBFBD><><C5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ|<7C>^<5E><>3 <20><59><C5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><75><C5AA>name<6D>ΨSŪ<53><C5AA><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB>^<5E>ǭȤ<C7AD><C8A4><EFBFBD><EFBFBD><EFBFBD>3
while(fgets(line, sizeof(line), file)!=NULL){
if(isalpha(line[0])){
sscanf(line, "%23[^\t]\t%d\t%d\n", name, &english, &math);
insertStudent(name, english, math);
}else if(line[0]=='*'){
break;
}
}
// <09><>flocse<73><65><EFBFBD><EFBFBD><EFBFBD>ե<EFBFBD> <20><><EFBFBD>`<60>ϥ<EFBFBD><CFA5><EFBFBD><EFBFBD>bmodify_list<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// fclose(file);
}
// <20>C<EFBFBD>L<EFBFBD>ǥͦC<CDA6><43>
void printStudentList() {
current = head->rlink;
printf("\n<EFBFBD>q<EFBFBD>Y<EFBFBD>}<7D>l\n");
printf("\n<EFBFBD>m<EFBFBD>W\t\t<EFBFBD>^<5E><>\t<EFBFBD>ƾ<EFBFBD>\n");
printf("--------------------------------\n");
while (current != tail) {
printf("%-15s\t%d\t%d\n", current->name, current->english, current->math);
current = current->rlink;
}
current = tail->llink;
printf("\n<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>}<7D>l\n");
printf("\n<EFBFBD>m<EFBFBD>W\t\t<EFBFBD>^<5E><>\t<EFBFBD>ƾ<EFBFBD>\n");
printf("--------------------------------\n");
while (current != head) {
printf("%-15s\t%d\t%d\n", current->name, current->english, current->math);
current = current->llink;
}
}
//<2F>̷ӦW<D3A6>r<EFBFBD>i<EFBFBD><69><EFBFBD>Ƨ<EFBFBD>
void sort_name(){
//<2F>Y<EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>ƩΥu<CEA5><75><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (head->rlink == tail || head->rlink->rlink == tail) {
return;
}
int flag = 1;
while(flag){
flag = 0;
current = head->rlink;
while(current->rlink != tail){
temp = current->rlink;
if(strcmp(current->name,temp->name) > 0){
// <09>u<EFBFBD>ϥΨ<CFA5><CEA8>Ӹ`<60>I<EFBFBD>i<EFBFBD><69><EFBFBD>`<60>I<EFBFBD>
// <09>n<EFBFBD>`<60>N<EFBFBD><4E><EFBFBD>Ч<EFBFBD><D0A7>ܫ᪺<DCAB><E1AABA><EFBFBD><EFBFBD>
// <09>Y<EFBFBD>U<EFBFBD>C<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>ǥ洫<C7A5><E6B4AB><EFBFBD>Ы<EFBFBD><D0AB>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>}<7D>|<7C>X<EFBFBD><58>
// <09>]<5D>i<EFBFBD>H<EFBFBD>h<EFBFBD>ŧi<C5A7><69><EFBFBD>Ӹ`<60>I <20><><EFBFBD><EFBFBD>current->llink<6E><6B>temp->rlink
// <09>o<EFBFBD>˴N<CBB4>i<EFBFBD>H<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>޶<EFBFBD><DEB6><EFBFBD>
temp->llink = current->llink;
current->rlink = temp->rlink;
temp->rlink->llink = current;
temp->rlink = current;
current->llink->rlink = temp;
current->llink = temp;
flag = 1;
}
else{
current = current->rlink;
}
}
}
}
//<2F>̷ӭ^<5E><EFBFBD>Z<EFBFBD>i<EFBFBD><69><EFBFBD>Ƨ<EFBFBD>
void sort_eng(){
//<2F>Y<EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>ƩΥu<CEA5><75><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (head->rlink == tail || head->rlink->rlink == tail) {
return;
}
int flag = 1;
while(flag){
flag = 0;
current = head->rlink;
while(current->rlink != tail){
temp = current->rlink;
if(current->english < temp->english){
// <09>u<EFBFBD>ϥΨ<CFA5><CEA8>Ӹ`<60>I<EFBFBD>i<EFBFBD><69><EFBFBD>`<60>I<EFBFBD>
// <09>n<EFBFBD>`<60>N<EFBFBD><4E><EFBFBD>Ч<EFBFBD><D0A7>ܫ᪺<DCAB><E1AABA><EFBFBD><EFBFBD>
// <09>Y<EFBFBD>U<EFBFBD>C<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>ǥ洫<C7A5><E6B4AB><EFBFBD>Ы<EFBFBD><D0AB>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>}<7D>|<7C>X<EFBFBD><58>
// <09>]<5D>i<EFBFBD>H<EFBFBD>h<EFBFBD>ŧi<C5A7><69><EFBFBD>Ӹ`<60>I <20><><EFBFBD><EFBFBD>current->llink<6E><6B>temp->rlink
// <09>o<EFBFBD>˴N<CBB4>i<EFBFBD>H<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>޶<EFBFBD><DEB6><EFBFBD>
temp->llink = current->llink;
current->rlink = temp->rlink;
temp->rlink->llink = current;
temp->rlink = current;
current->llink->rlink = temp;
current->llink = temp;
flag = 1;
}
else{
current = current->rlink;
}
}
}
}
//<2F>̷ӭ^<5E><EFBFBD>Z<EFBFBD>i<EFBFBD><69><EFBFBD>Ƨ<EFBFBD>
void sort_math(){
//<2F>Y<EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>ƩΥu<CEA5><75><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (head->rlink == tail || head->rlink->rlink == tail) {
return;
}
int flag = 1;
while(flag){
flag = 0;
current = head->rlink;
while(current->rlink != tail){
temp = current->rlink;
if(current->math < temp->math){
// <09>u<EFBFBD>ϥΨ<CFA5><CEA8>Ӹ`<60>I<EFBFBD>i<EFBFBD><69><EFBFBD>`<60>I<EFBFBD>
// <09>n<EFBFBD>`<60>N<EFBFBD><4E><EFBFBD>Ч<EFBFBD><D0A7>ܫ᪺<DCAB><E1AABA><EFBFBD><EFBFBD>
// <09>Y<EFBFBD>U<EFBFBD>C<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>ǥ洫<C7A5><E6B4AB><EFBFBD>Ы<EFBFBD><D0AB>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>}<7D>|<7C>X<EFBFBD><58>
// <09>]<5D>i<EFBFBD>H<EFBFBD>h<EFBFBD>ŧi<C5A7><69><EFBFBD>Ӹ`<60>I <20><><EFBFBD><EFBFBD>current->llink<6E><6B>temp->rlink
// <09>o<EFBFBD>˴N<CBB4>i<EFBFBD>H<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>޶<EFBFBD><DEB6><EFBFBD>
temp->llink = current->llink;
current->rlink = temp->rlink;
temp->rlink->llink = current;
temp->rlink = current;
current->llink->rlink = temp;
current->llink = temp;
flag = 1;
}
else{
current = current->rlink;
}
}
}
}
//<2F><><EFBFBD>ܬ<EFBFBD><DCAC>ؤαƦW
void choose_subject(){
int subject ,number , i=1;
printf("\n<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>ܪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n"
"1 <20>ƾ<EFBFBD> 2 <20>^<5E><> ==> ");
subject = getche();
switch(subject){
case '1':
printf("\n<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>ƦW(<28><><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>Ы<EFBFBD>Enter) ==> ");
scanf("%d",&number);
sort_math();
find_student(number , 1);
printf("\n<EFBFBD><EFBFBD><EFBFBD>Ҧp<EFBFBD>U");
printf("\n<EFBFBD>ƦW\t<EFBFBD>m<EFBFBD>W\t\t<EFBFBD>^<5E><>\t<EFBFBD>ƾ<EFBFBD>");
printf("\n-----------------------------------\n");
Student* current = head->rlink;
while (current != tail) {
printf("%d\t%-15s\t%d\t%d\n",i++, current->name, current->english, current->math);
current = current->rlink;
}
break;
case '2':
printf("\n<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>ƦW(<28><><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>Ы<EFBFBD>Enter) ==> ");
scanf("%d",&number);
sort_eng();
find_student(number , 2);
printf("\n<EFBFBD><EFBFBD><EFBFBD>Ҧp<EFBFBD>U");
printf("\n<EFBFBD>ƦW\t<EFBFBD>m<EFBFBD>W\t\t<EFBFBD>^<5E><>\t<EFBFBD>ƾ<EFBFBD>");
printf("\n-----------------------------------\n");
current = head->rlink;
while (current != tail) {
printf("%d\t%-15s\t%d\t%d\n",i++, current->name, current->english, current->math);
current = current->rlink;
}
break;
default :
printf("<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>~");
break;
}
}
//<2F>ھڬ<DABE><DAAC>ؤαƦW<C6A6><57><EFBFBD>ǥ<EFBFBD>
void find_student(int number , int mode){
current = head->rlink;
int i = 1;
while (current != tail && i < number) {
current = current->rlink;
i++;
}
if(current!=tail && number != 0){
printf("\n*****************************\n");
if(mode == 1 ){
printf("<EFBFBD>ƾ<EFBFBD>");
}else if(mode == 2){
printf("<EFBFBD>^<5E><>");
}
printf("<EFBFBD>ƦW<EFBFBD><EFBFBD>%d<><64><EFBFBD>ǥͬ<C7A5>\n\n"
"<EFBFBD>m<EFBFBD>W\t\t<EFBFBD>^<5E><>\t<EFBFBD>ƾ<EFBFBD>\n%-15s\t%d\t%d", number, current->name, current->english, current->math);
printf("\n*****************************\n");
}else{
printf("\n*****************************\n");
printf("<EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD>s<EFBFBD>b");
printf("\n*****************************\n");
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><D2A6>`<60>I
void freeAllNodes() {
current = head->rlink;
while (current != tail) {
Student* temp = current;
current = current->rlink;
free(temp);
}
free(head); // <20><><EFBFBD><EFBFBD> head <20>`<60>I
}
int main() {
char mode ,sort_mode;
init_f();
readStudentsFromFile("YunTechStudents2.txt");
printStudentList();
modify_list();
while(1){
printf("\n******* <20><><EFBFBD>ܶi<DCB6><69><EFBFBD>ƧǩάO<CEAC>ƦW<C6A6><57>n<EFBFBD>W<EFBFBD><57><EFBFBD>ǥ<EFBFBD> *******\n"
"*--------------------------------------*\n"
"* 1 <20>i<EFBFBD><69><EFBFBD>Ƨ<EFBFBD> 2 <20><><EFBFBD>ܱƦW<C6A6><57>n<EFBFBD>W<EFBFBD><57><EFBFBD>ǥ<EFBFBD> 3 <20><><EFBFBD><EFBFBD> *\n"
"\n<EFBFBD>п<EFBFBD><EFBFBD>ܥ\\<EFBFBD><EFBFBD> ==> "); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>\\<5C><> <20>b<EFBFBD><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<7C>ܶýX
mode = getche();
switch(mode){
case '1':
printf("\n\n<EFBFBD><EFBFBD><EFBFBD>ܱƧǤ覡\n"
"*--------------------------------------*\n"
"1 <20>W<EFBFBD>r 2 <20>^<5E><EFBFBD>Z 3 <20>ƾǦ<C6BE><C7A6>Z \n"
"\n<EFBFBD>п<EFBFBD><EFBFBD>ܱƧǤ覡 ==> ");
sort_mode = getche();
switch(sort_mode){
case '1':
printf("\n\n<EFBFBD>H<EFBFBD>W<EFBFBD>r<EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>Ƨ<EFBFBD>\n");
sort_name();
printStudentList();
break;
case '2':
printf("\n\n<EFBFBD>H<EFBFBD>^<5E><EFBFBD>Z<EFBFBD>i<EFBFBD><69><EFBFBD>Ƨ<EFBFBD>\n");
sort_eng();
printStudentList();
break;
case '3':
printf("\n\n<EFBFBD>H<EFBFBD>ƾǦ<EFBFBD><EFBFBD>Z<EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>Ƨ<EFBFBD>\n");
sort_math();
printStudentList();
break;
default:
printf("\n<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>~\n");
break;
}
break;
case '2':
choose_subject();
break;
case '3':
printf("\n\n<EFBFBD><EFBFBD><EFBFBD>¨ϥΡABye~\n");
freeAllNodes();
return 0;
default:
printf("\n<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>~\n");
break;
}
}
}