본문 바로가기

C언어/복습

[C언어]DAY19_구조체와 리스트, 열거형 상수, 구조체와 함수의 인수

구조체와 리스트

 : 단일연결리스트 : singly linked list (링크드 리스트)

 

리스트 : 데이터 구조 (데이터 여러개. 배열도 데이터 구조)

유연한 데이터 관리가 가능 (배열과 비교)
     1. 리스트 중간에 새로운 데이터 추가/삭제
     2. 리스트의 크기를 동적으로 관리

 


 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct s_Student{
	int id;
	char subject[MAX];
	struct s_Student* next; //자기 자신을 가리키는 포인터

} Student;

//3개의 Student를 가지고 리스트를 만들어 본다.
int main(){

	//1. 포인터 선언
	Student* student1 = 0;
	Student* student2 = 0;
	Student* student3 = 0;
	//for문을 돌릴 포인터변수
	Student* p_student = 0;

	//2. 메모리 할당
	student1 = (Student*)malloc(sizeof(Student));
	student2 = (Student*)malloc(sizeof(Student));
	student3 = (Student*)malloc(sizeof(Student));

	//데이터 입력
	student1->id=1111;
	strcpy(student1->subject, "math");

	student2->id=2222;
	strcpy(student2->subject, "law");

	student3->id=3333;
	strcpy(student3->subject, "computer");

	//node연결
	//node: 리스트를 구성하는 원소 하나 = 배열의 원소와 같은 개념.
	student1->next = student2;
	student2->next = student3;
	student3->next = 0;

	//출력 : linked list를 순회(앞으로 하나씩 전진하면서 방문)하면서 출력
	for(p_student = student1; p_student != 0 ; p_student= p_student->next ){
		printf("%d %s\n", p_student->id, p_student->subject );
	}


	//3. 메모리 반환
	free(student1);
	free(student2);
	free(student3);



}

 


 

열거형 상수 enumrate

 : enum , 상수 정의하는 용도로 사용 (enum은 %d.). 코드 가독성이 뛰어남.

 

enum 정의 방법: typedef를 이용. 대체적으로 대문자(상수)

 


 

#include <stdio.h>
#define MAX 100
#define SIZE 3

typedef enum e_ShcoolYear{ //열거형 이름
	FRESHMEN,	//1학년
	SOPHOMORE,	//2학년
	JUNIOR,		//3학년
	SENIOR		//4학년



} SchoolYear;

//Structure을 정의
typedef struct s_Student{
	int id;
	char major[MAX];
	SchoolYear year;

}Student;

void print_student(Student students){
	printf("%d %s ", students.id, students.major);
	switch(students.year){
	case FRESHMEN:
		printf("Freshmen\n");
		break;
	case SOPHOMORE:
		printf("Sophomore\n");
		break;
	case JUNIOR:
		printf("Junior\n");
		break;
	case SENIOR:
		printf("Senior\n");
		break;
	
	}
}

int main(){
	int i = 0;
	Student students[SIZE] = {{1111, "math", FRESHMEN}, 
							  {2222, "bio", SENIOR},
							  {3333, "art", JUNIOR} };

	for(i=0; i<SIZE; i++){
		//printf("%d %s %d\n", students[i].id, students[i].major, students[i].year);
		print_student(students[i]);
	}

}

 


구조체와 함수의 인수

구조체를 함수의 인자로 넘길 때.

 


 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

//1단계
//Student 구조체 만들기
//메인에서 배열갯수를 입력받기
//배열갯수만큼 메모리를 동적할당 : 동적으로 배열만들기
//사용자로부터 값 입력받기
//배열 출력

//2단계 
//배열입력받는 함수(포인터, 배열갯수)
//배열출력하는 함수(포인터, 배열갯수)

typedef struct s_Student{
	int id;
	char major[MAX];
} Student;

void read_student(Student* p_student, int count){

	int i =0;

	for(i=0; i<count; i++){
		printf("id를 입력하세요\n");
		scanf("%d", &p_student[i].id );
		printf("전공을 입력하세요\n");
		scanf("%s", p_student[i].major);
	}
}

void print_student(Student* p_student, int count){

	int i =0;

	for(i =0; i<count; i++){
		printf("id는 %d, 전공은 %s\n", p_student[i].id, p_student[i].major);
	}
}

void print(Student student){
	printf("id는 %d, 전공은 %s\n", student.id, student.major);
}


int main(){

	int count = 0;
	int i =0;

	//1. 포인터 선언
	Student* p_student = 0;

	printf("배열의 갯수를 입력하세요\n");
	scanf("%d", &count);
	printf("배열의 갯수는 %d\n\n", count);

	//2. 포인터 할당
	p_student = (Student*)malloc(sizeof(Student)*count);


	//사용자로부터 입력
	read_student(p_student, count);//배열은 배열이름(포인터)과 크기(size) **동적할당은 무조건 포인터!!
	printf("\n");

	//출력
	print_student(p_student, count);
	for(i=0; i <count; i++){
		print(p_student[i]);
	}

	//3. 포인터 반환
	free(p_student);


}