#include#include#include#include//함수들을 명시struct name_grade {char *name;int grade;struct name_grade *link;};//학생 이름과 성적을 저장하는 자기 참조 구조체 정의int temp = 1;struct name_grade * insertNewElement(struct name_grade * header);//새로운 구조체를 동적으로 생성(malloc 또는 calloc 함수 사용)한다.//새로 생성된 구조체에 키보드로부터 학생의 이름와 점수를 입력받아 저장한다.//새로운 구조체를 파라미터로 넘겨 받은 리스트의 첫 부분에 추가한다.//새로운 원소의 삽입이 성공하면 리스트의 현재 원소의 수를 출력한다.//구조체가 추가된 리스트의 헤더 정보를 반환한다.//precondition(struct name_grade * deleteElementBasedName(struct name_grade * header, char* name);//기존 리스트에서 특정 이름을 가진 원소를 모두 삭제한다.//기존 리스트와 삭제할 원소의 이름을 파라미터로 받는다.//삭제가 완료되면 삭제된 원소의 수를 출력하고 수정된 히스트의 헤더 정보를 반환한다.struct name_grade * deleteElementBasedGrade(struct name_grade * header, int grade);//기존 리스트에서 특정 점수를 가진 원소를 모두 삭제한다.//기존 리스트와 삭제할 원소의 점수를 파라미터로 받는다.//삭제가 완료되면 삭제된 원소의 수를 출력하고 수정된 리스트의 헤더 정보를 반환한다.void printList(struct name_grade * header);//기존의 원소의 정보를 순서대로 출력한다.struct name_grade * sortByName(struct name_grade * header);//기존의 리스트를 이름을 기준으로 오름차순으로 정렬한다.//정렬된 리스트의 헤더를 반환한다.//정렬은 형 변수 선언struct name_grade *HEADER = NULL; //구조체 포인터 변수 HEADER 를 널로 초기화char dname[30];//문자형 배열 이름 값int dgrade = 0;//성적 값while(1){printf("----------------MENU-----------------n");printf("* 1.Insert New Element *n");printf("* 2.Delete Element Based Name *n");printf("* 3.Delete Element Based Grade *n");printf("* 4.Sort by Name *n");printf("* 5.Sort by Grade *n");printf("* 6.print List *n");printf("* 7.Exit *n");printf("*************************************n");printf("숫자 입력 : ");scanf("%d",&ch);//입력switch(ch){case 1:HEADER = insertNewElement(HEADER);break;//성적과 이름을 입력case 2:printf("삭제할 이름 : ");scanf("%s", dname);HEADER = deleteElementBasedName(HEADER,dname);break;//이름을 삭제case 3:printf("삭제할 성적 : ");scanf("%d",&dgrade);HEADER = deleteElementBasedGrade(HEADER,dgrade);break;//성적을 삭제case 4:HEADER = sortByName(HEADER);;break;//링크를 이용한 이름 정렬case 5:HEADER = sortByGrade(HEADER);;break;//링크를 이용한 성적 정렬case 6:printList(HEADER);break;//입력된 값들을 출력case 7: return 0;default: printf("nn1~7의 숫자를 누르십printf("성적 : ");scanf("%d",&igrade);Element->name = (char *) malloc( strlen(iname) + 1);//Element가 가리키는 곳의 name 값의 크기를 입력받은 이름의 크기만큼 할당.+1은 널값strcpy(Element->name,iname);//Element가 가리키는 name에 입력받은 값 저장Element->grade=igrade;//grade 에 입력값 저장Element ->link = header;//구조체 Element의 링크값을 header로 포인터header=Element;//header 에 Element 값을 넣어준다.while(header != NULL)//header가 널이 아닐 동안{header=header->link;//해더의 링크를 이동한다.temp++;//증가치}printf(" total element : %dn", temp);//헤더가 이동하면 널이 오기 전까지는 입력된 구조체 값들이므로 그 수치를 출력한다.return Element; // 값 반환}struct name_grade * deleteElementBasedName(struct name_grade * header, char *name)//함수 정의{struct name_grade * prv = header;//새로운 구조체 변수 prv에 header 값을 넣어준다.struct name_grade * node = header;// **int count = 0;//지운 갯수를 카운트 하기 위한 변수while(node != NULL)// 구조체 변수 node 가 널이 아닌 동안{if(strcmp(node->name,name)==0)//node가 포인터처하는 name과 입력받은 name의 데이터 값이 같은지 비교{if(prv = node)//참{header=node->link;//header에 node의 링크가 포인터 하는 곳을 포인터한다.free(node);// node 메모리 해제node = header;//nod);//지운 총 갯수return header;// 값 반환}struct name_grade * deleteElementBasedGrade(struct name_grade * header,int grade)//함수 정의{struct name_grade * prv = header;//새로운 구조체 포인터 변수 prv에 해더값 포인터.struct name_grade * node = header;//새로운 구조체 포인터 변수 node에 해더값 포인터.int count = 0; //지운 갯수를 위한 변수while(node != NULL){if((node->grade)==grade)//정수형이기 때문에 strcmp를 안쓴다. 그냥 비교{if(prv = node)//참{header=node->link;//header에 node의 링크가 포인터 하는 곳을 포인터한다.free(node);// node 메모리 해제node = header;//node에 header값prv = header;//prv에 header 값count++; //지운 갯수를 카운트}else{ //거짓prv->link = node->link;//prv가 링크하는 곳을 node가 링크하는 곳으로 포인터 해준다.free(node);//node 메모리 해제node = prv->link; // node에 prv의 링크가 포인터 하는 곳을 포인터한다.count++;// 지운 갯수 카운트}}else//거짓{node = node->link;//지울 것이 없기에 node의 포인터를 옮겨준다.}}printf("All Delete Element : %dn",count);// 지운 총 갯수return header;// 값 반환}void printList(struct name_grade * header)//함수 정의{while(header != NULL)//구조체의 끝인 널까지..{printf("name : %sn", header->name);//이름 출력printf("grade : %dnn", header->grade); 0;//for문 루프용 변수(버블)int j = 0;//for문 루프용 변수(버블)if(node == NULL)//정보가 없을 경우{printf("NO INPUT DATAn");return 0;// 메뉴로 리턴.}while(node != NULL)//정보의 개수를 알기 위해{node = node -> link;//node를 널까지 이동num++;}if(num == 1)//정보가 하나 뿐일때 출력{printList(header);return header;//정보가 있기 때문에 header값 반환}node = header;//위에서 node는 널까지 갔기 때문에 처음으로 보낸다.for(i=0; i < num-1; i++)//버블 포문. 큰 범위{for(j=0; j < num-i-1; j++)//버블 포문. 작은 범위{if( (strcmp(node->name, node->link->name)) > 0 )//구조체에 있는 이름과 입력받은 이름 데이터 크기 비교{if(header == node)// 제일 앞부분 정렬 , 참{header = node->link;//해더를 노드가 포인터 하는 구조체의 링크가 포인터 하고 있는 곳을 포인터 하게 한다.node->link = header -> link;//노드가 가르키는 링크가 해더가 가르키는 링크를 포인터하게한다.header->link = node;//해더가 가르기는 링크가 노드를 포인터 하게 한다.prv = header;}else{temp = node->link;//temp를 node가 link하는 곳을 포인터.node->link = temp->link;//node 의 link가 temp의 link가 포인터 하는 곳을 포인터.prv->link=temp;//prv의 link를 temp로 포인터temp->link = node;//temp의 link를 node로 포인터prv = temp;//temp = NULL;// temp NULL로 초기화}}else{prv = node;//링크를 이동node = node->link;//링 삽입