학생 정보를 구조체로 만들어서 포인터 배열 생성, 동적 할당, 선택 정렬, 메모리 할당 해제 연습
학생 수를 입력하세요: 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;
}
내일은 스택 큐 이진트리 할 듯
0405 TIL - 이진 트리 순회 (0) | 2025.04.05 |
---|