#include
#include
#include

#define MAX_NAME_LENGTH 12

typedef struct StudentData {
 char name[MAX_NAME_LENGTH];
 int kor, eng, math;
 int total;
 int ranking;
 float average;
} SD;

typedef struct node {
 SD data;
 struct node *p_next;
}NODE;

void AddNode(NODE* ap_head, NODE* ap_tail, SD* ap_data) {
 if (NULL != ap_head) {
  ap_tail->p_next = (NODE*)malloc(sizeof(NODE));
  ap_tail = ap_tail->p_next;
 }

 else {
  ap_head = (NODE*)malloc(sizeof(NODE));
  ap_tail = ap_head;
 }

 memcpy(&ap_tail->data, ap_data, sizeof(SD));
 ap_tail->p_next = NULL;
 
}

void DeleteALLNode(NODE** ap_head, NODE** ap_tail) {
 NODE* p;

 while (NULL != *ap_head) {
  p = (*ap_head)->p_next;
  free(*ap_head);
  *ap_head =p;
 }

 *ap_head = *ap_tail = NULL;

}

void UpdateRanking(NODE* ap_head, SD* ap_data) {
 NODE* p = ap_head;

 while (NULL != p) {
  if (ap_data->total data(점) total) {
   ap_data->ranking++;
  }

  else {
   p->data.ranking++;
  }
  p = p->p_next;
 }
}

void InputData(SD* ap_data, int a_count) {
 printf("%d 번째 학생 이름 : ", a_count);
 scanf("%s", ap_data->name);
 printf("국어 점수 : ");
 scanf("%d", &ap_data->kor);
 printf("영어 점수 : ");
 scanf("%d", &ap_data->eng);
 printf("수학 점수 : ");
 scanf("%d", &ap_data->math);

 ap_data->ranking = 1;
 ap_data->total = ap_data->kor + ap_data->eng + ap_data->math;
 ap_data->average = ap_data->total / 3.0f;

}

void DisplayData(NODE *ap_head) {
 NODE* p = ap_head;

 printf("-------------------------------------------------\n");
 printf(" 이름     국어  영어  수학  총점  평균  등수\n");
 printf("-------------------------------------------------\n");

 while (NULL != p) {
  printf("%-8s %3d  %3d  %3d  %3d  %3.0f  %2d등\n",
   p->data.name, p->data.kor, p->data.eng, p->data.math,
   p->data(점) total, p->data.average, p->data.ranking);

  p = p->p_next;
 }
}


int main() {

 NODE* p_head = NULL, * p_tail = NULL;
 SD temp;
 int num, count = 0;

 while (1) {
  printf("[ Menu ]\n");
  printf(" 1. 성적 입력\n");
  printf(" 2. 성적 확인\n");
  printf(" 3. 종료\n");
  printf(" --------------\n");
  printf(" 선택(1 ~ 3) : ");

  scanf("%d", #);
  printf("\n\n");

  if (num == 3) break;
  else if (num == 1) {
   InputData(&temp, ++count);
   UpdateRanking(p_head, &temp);
   AddNode(p_head, p_tail, &temp);

  }

  else if (num == 2) {
   DisplayData(p_head);
  }
  printf("\n\n");

 }

 DeleteALLNode(&p_head, &p_tail);
 return 0;

}