상세 컨텐츠

본문 제목

0403 TIL - 자료구조 연습

C/Today I Learned

by lucar 2025. 4. 3. 22:25

본문

학생 정보를 구조체로 만들어서 포인터 배열 생성, 동적 할당, 선택 정렬, 메모리 할당 해제 연습

 

요구사항

  1. 학생 수 입력
  2. 각 학생의 이름, 나이, 성적 입력
  3. 전체 평균 성적을 출력
  4. 최고 성적 학생 정보 출력
  5. 성적 내림차순으로 정렬하여 전체 학생 정보 출력

실행 예시

학생 수를 입력하세요: 3

[1번째 학생 정보]
이름: Alice
나이: 20
성적: 4.2

[2번째 학생 정보]
이름: Bob
나이: 22
성적: 3.6

[3번째 학생 정보]
이름: Charlie
나이: 21
성적: 4.5

--- 평균 성적: 4.10 ---
--- 최고 성적 학생 ---
이름: Charlie, 나이: 21, 성적: 4.50

--- 성적 순 정렬 결과 ---
1. 이름: Charlie, 나이: 21, 성적: 4.50
2. 이름: Alice, 나이: 20, 성적: 4.20
3. 이름: Bob, 나이: 22, 성적: 3.60

 

#include <stdio.h>
#include <stdlib.h>

typedef struct Student //학생 구조체 선언
{
	char name[20];
	int age;
	float grade;
} Student;


void StudentSort(Student* arr, int size) //포인터 배열을 받아와서 선택 정렬
{
	int max;
	for (int i = 0; i < size - 1; i++)
	{
		max = i;
		for (int j = i + 1; j < size; j++)
		{
			if (arr[j].grade > arr[max].grade) max = j;
		}

		Student temp = arr[i];
		arr[i] = arr[max];
		arr[max] = temp;
	}

}


int main()
{
	int num_1;
	float sum = 0;
	float average = 0;
	printf("학생 수를 입력하세요 : ");
	scanf_s("%d", &num_1);

	Student* s_arr = (Student*)malloc(sizeof(Student) * num_1); //메모리 동적 할당
    //malloc함수는 반환값이 void*이기 때문에 명시적 형변환 필요

	for (int i = 0; i < num_1; i++)
	{
		printf("%d번째 학생 정보\n", i + 1);
		printf("이름 : ");
		scanf_s("%s", s_arr[i].name, 20);
		printf("나이 : ");
		scanf_s("%d", &s_arr[i].age);
		printf("성적 : ");
		scanf_s("%f", &s_arr[i].grade);
	}

	printf("\n");

	for (int i = 0; i < num_1; i++) //성적 평균치 구하기
	{
		Student* ps = &s_arr[i];
		sum += ps->grade;
	}

	average = sum / num_1;
	printf("평균 성적 : %.2f", average);

	StudentSort(s_arr, num_1); //정렬 함수 실행


	for (int i = 0; i < num_1; i++)
	{
		Student* ps = &s_arr[i];
		printf("%d. 이름 : %s, 나이 : %d, 성적 : %.2f \n", i + 1, ps->name, ps->age, ps->grade);

	}

	free(s_arr); //메모리 할당 해제

	return 0;
}

 

출력 결과

 

주요 학습 포인트

 

포인터는 변수의 메모리 위치를 표시함

이중 포인터는 그 포인터 변수의 메모리 위치를 표시함

int a = 10;
int* p = &a;
int** pp = &p;

일 때

p = a의 값 주소(&a)
*p = a의 값(10)

pp = p의 값 주소(&p)
*pp = a의 값 주소(&a) = p의 값
**pp = a의 값(10) = *p

 

연결된 리스트

 

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int index;
	int data;
	struct Node* next;
}Node;

int NodeSearch(Node* node, int target)
{
	while (node != NULL)
	{
		if (node->data == target)
		{
			return node->index;
		}
		node = node->next;
	}
}

Node* deleteNode(Node* node, int target)
{
	Node* current = node;
	Node* prev = NULL;

	int index;

	while (current != NULL)
	{
		if (current->data == target)
		{
			if (prev == NULL)
			{
				Node* newHead = current->next;
				free(current);
				return newHead;
			}
			else
			{
				prev->next = current->next;
				free(current);
				return node;
			}
		}
		prev = current;
		current = current->next;
	}
}

int main()
{
	int numb, value;

	printf("입력할 숫자의 갯수 : ");
	scanf_s("%d", &numb);
	Node* head = NULL;
	Node* current = NULL;

	for (int i = 0; i < numb; i++)
	{
		printf("숫자 %d : ", i + 1);
		scanf_s("%d", &value);

		Node* newNode = (Node*)malloc(sizeof(Node));
		newNode->index = i;
		newNode->data = value;
		newNode->next = NULL;

		if (head == NULL)
		{
			head = newNode;
			current = newNode;
		}
		else
		{
			current->next = newNode;
			current = newNode;
		}
	}

	current = head;
	while (current != NULL)
	{
		printf(" %d ->", current->data);
		current = current->next;
	}
	printf(" NULL\n");


	printf("검색할 값을 입력하세요 : ");
	scanf_s("%d", &numb);
	printf("%d는 %d의 위치에 있습니다.\n", numb, NodeSearch(head, numb) + 1);

	printf("삭제할 값을 입력하세요 : ");
	scanf_s("%d", &numb);

	current = deleteNode(head, numb);
	if (current == NULL) current = head;

	printf("삭제 후 리스트 출력\n");
	while (current != NULL)
	{
		printf(" %d ->", current->data);
		current = current->next;
	}
	printf(" NULL\n");


	current = head;
	while (current != NULL)
	{
		Node* temp = current;
		current = current->next;
		free(temp);
	}

	return 0;
}

내일은 스택 큐 이진트리 할 듯

'C > Today I Learned' 카테고리의 다른 글

0405 TIL - 이진 트리 순회  (0) 2025.04.05

관련글 더보기