본문 바로가기
프로그래밍 언어/c언어

[ C 언어 ] 학생 성적 - 연결 리스트 이용

by 구구름 2021. 1. 26.

 

학생 성적을 입력받아 출력하는 것입니다.

연결리스트를 사용합니다.

 

- 요구

- 음수 값이 들어오면 입력을 종료
- 모든 학생의 점수를 출력한다.

 

- 소스코드

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h> 
#include<stdlib.h> 

struct linked_list {
    int score;
    struct linked_list* next;
};
typedef struct linked_list NODE;
typedef NODE* LINK;

LINK createNode(int score);
LINK append(LINK head, LINK newNode);
int printList(LINK head); //연결 리스트의 모든 노드 출력 함수

int main(void) {
    int score;
    LINK head = NULL; //연결 리스트의 헤드로 사용
    LINK newNode; //현재 새로이 생성된 노드를 가리키는 포인터
    printf("점수를 입력하고 Enter를 누르세요.\n");
    printf("(입력을 종료는 음수입니다)\n");
    printf(">> ");
    scanf("%d", &score);
    while (score >= 0) {
        newNode = createNode(score); //노드 동적 할당
        if (newNode == NULL) {
            printf("동적메모리 할당에 문제가 있습니다.\n");
            exit(1);
        }
        head = append(head, newNode);
        scanf("%d", &score);
    }
    printList(head); //연결 리스트 모두 출력
    return 0;
}
LINK createNode(int score) {  //노드를 생성하는 함수
    LINK newNode;  //새로 생성되는 노드의 주소를 저장할 변수 newNode를 선언
    newNode = (LINK)malloc(sizeof(NODE));
    if (newNode == NULL) {
        printf("노드 생성을 위한 메모리 할당에 문제가 있습니다.\n");
        return NULL;
    }
    newNode->score = score;
    newNode->next = NULL;
    return newNode;
}
LINK append(LINK head, LINK newNode) { //newNode 노드를 연결 리스트에 추가하는 함수
    LINK cur = NULL;
    LINK nextNode = head;
    if (head == NULL) { //연결리스트의 노드가 하나도 없는 경우
        head = newNode; //추가하려는 노드가 head가 됨
        return head;
    }
    while (newNode->score > nextNode->score) { //삽입 위치까지 이동
        if (nextNode->next != NULL) { // 다음 멤버가 있을때
            cur = nextNode;
            nextNode = nextNode->next;
        }
        else { // 맨 끝에 추가
            nextNode->next = newNode;
            return head;
        }
    }
    newNode->next = nextNode;  // 삽입 위치 찾음
    if (cur != NULL) 
        cur->next = newNode; //중간에 추가
    else 
        head = newNode; //맨앞에 추가할때

    return head;
}
int printList(LINK head) { //연결 리스트 모두 출력하는 함수
    int cnt = 0; //방문한 노드의 수를 저장
    LINK nextNode = head;
    while (nextNode != NULL) {
        printf("%3d번째 학생의 성적: %d\n", ++cnt, nextNode->score);
        nextNode = nextNode->next;
    }
    return cnt;
}

 

- 결과화면

 

 

 

 

도움이 되었기를 바랍니다.

 

감사합니다.