9 장 . 구조체

59
9 장 . 장장장 1 C #include <stdio.h> int main(void) { int num; printf(“Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("Is negative.\n"); printf("num = %d\n", num); return 0; }

Upload: akeem-hardy

Post on 02-Jan-2016

46 views

Category:

Documents


6 download

DESCRIPTION

9 장 . 구조체. C. #include < stdio.h > int main(void) { int num; printf (“Please enter an integer: "); scanf ("%d", &num); if ( num < 0 ) printf ("Is negative.\n"); printf ("num = %d\n", num); return 0; }. 학습목표. 9 장 . 구조체. 목차. 9 장 . 구조체. 구조체. 구조체의 기본. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 9 장 .  구조체

9 장 . 구조체

1

C#include <stdio.h>int main(void){ int num; printf(“Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("Is negative.\n"); printf("num = %d\n", num); return 0;}

Page 2: 9 장 .  구조체

■ 구조체란 무엇인지 알아보고 , 구조체를 정의하고 사용하는 방법을 알아본다 .

■ 구조체 변수를 선언하고 초기화하는 방법을 알아본다 .

■ 구조체 배열이나 구조체 포인터를 사용하는 방법을 알아본다 .

■ 공용체란 무엇인지 알아보고 , 공용체를 정의하고 사용하는 방법을 알아본다 .

■ 열거체란 무엇인지 알아보고 , 열거체를 정의하고 사용하는 방법을 알아본다 .

■ typedef 를 정의하는 방법을 알아본다 .

9 장 . 구조체

학습목표

2

Page 3: 9 장 .  구조체

9 장 . 구조체

목차

3

구조체• 구조체의 기본• 구조체의 사용• 비트필드

공용체와 열거체• 공용체• 열거체

typedef• typedef 의 정의• typedef 의 사용 목적

Page 4: 9 장 .  구조체

구조체를 사용하면 관련된 변수들을 하나로 묶어서 사용할 수 있다 .

9 장 . 구조체

구조체의 기본

구조체

4

Page 5: 9 장 .  구조체

구조체의 정의 (1/2)구조체의 멤버로 일반 변수뿐만 아니라 배열이나 포인터를 선언할 수도 있다 .구조체를 정의하면 새로운 데이터형이 만들어진다 .

구조체를 정의한다고 해서 구조체의 멤버가 메모리에 할당되지는 않는다 .구조체형의 변수를 선언하면 , 구조체의 멤버들이 메모리에 할당된다 .

9 장 . 구조체

구조체의 기본

구조체

5

Page 6: 9 장 .  구조체

구조체의 정의 (2/2)

9 장 . 구조체

구조체의 기본

구조체

6

Page 7: 9 장 .  구조체

구조체의 크기구조체의 크기는 모든 멤버들의 크기의 합보다 크거나 같다 .

메모리 정렬 때문에 멤버들 사이에 패딩이 들어갈 수도 있다 .

구조체의 크기를 구하려면 sizeof 연산자를 이용해야 한다 .

9 장 . 구조체

구조체의 기본

구조체

7

Page 8: 9 장 .  구조체

구조체 변수의 선언 (1/3)

struct 키워드 없이 태그명만 사용하면 컴파일 에러가 되므로 주의해야 한다 .

9 장 . 구조체

구조체의 기본

구조체

8

Page 9: 9 장 .  구조체

구조체 변수의 선언 (2/3)구조체 변수를 선언하면 구조체 변수가 가진 멤버들이 메모리에 선언된 순서대로 할당된다 .

9 장 . 구조체

구조체의 기본

구조체

9

Page 10: 9 장 .  구조체

구조체 변수의 선언 (3/3)구조체를 정의하면서 구조체 변수를 함께 선언할 수 있다 .

구조체를 정의하면서 변수를 함께 선언할 때는 태그명을 생략할 수 있다 .

9 장 . 구조체

구조체의 기본

구조체

10

Page 11: 9 장 .  구조체

구조체 변수의 사용 (1/2)구조체의 멤버에 접근할 때는 멤버 접근 연산자인 . 를 이용한다 .

9 장 . 구조체

구조체의 기본

구조체

11

Page 12: 9 장 .  구조체

구조체 변수의 사용 (2/2)

9 장 . 구조체

구조체의 기본

구조체

12

Page 13: 9 장 .  구조체

구조체 변수의 초기화{ } 안에 멤버들의 초기값을 순서대로 나열한다 .{ } 안에 지정한 초기값이 멤버의 개수보다 부족하면 나머지 멤버들은 0 으로 초기화된다 .

9 장 . 구조체

구조체의 기본

구조체

13

Page 14: 9 장 .  구조체

student 구조체의 정의 및 사용 예 (1/2)

9 장 . 구조체

구조체의 기본

구조체

14

01: /* Ex09_01.c */02: #include <stdio.h>03: #include <string.h>04:05: struct student {06: char name[20];07: int korean, english, math;08: double average;09: };10:11: int main(void)12: {13: struct student s1; 14: struct student s2 = {" 박나나 ", 90, 78, 86}; 15:

구조체의 정의

구조체 변수의 선언

구조체 변수의 선언 및 초기화

Page 15: 9 장 .  구조체

student 구조체의 정의 및 사용 예 (2/2)

9 장 . 구조체

구조체의 기본

구조체

15

16: s1.korean = 100;17: s1.english = 100;18: s1.math = 100;19: strcpy(s1.name, " 김모모 ");20: s1.average = (double)(s1.korean+s1.english+s1.math) / 3;21:22: s2.average = (double)(s2.korean+s2.english+s2.math) / 3;23:24: printf("%s : %5.2f\n", s1.name, s1.average);25: printf("%s : %5.2f\n", s2.name, s2.average);26: return 0;27: }

구조체 변수의 사용

Page 16: 9 장 .  구조체

point 구조체의 정의 및 사용 예 (1/2)

9 장 . 구조체

구조체의 기본

구조체

16

01: /* Ex09_02.c */02: #include <stdio.h>03: #include <math.h>04:05: struct point {06: int x, y;07: };08:09: int main(void)10: {11: struct point p1, p2; 12: double dist;13:14: printf("p1 의 x, y 좌표를 입력하세요 : ");15: scanf("%d %d", &p1.x, &p1.y); 16:

구조체의 정의

구조체 변수의 선언

구조체 변수의 값 입력

수학 관련 라이브러리 헤더

Page 17: 9 장 .  구조체

point 구조체의 정의 및 사용 예 (2/2)

9 장 . 구조체

구조체의 기본

구조체

17

17: printf("p2 의 x, y 좌표를 입력하세요 : ");18: scanf("%d %d", &p2.x, &p2.y); 19:20: dist = sqrt( pow(p2.x-p1.x, 2) + pow(p2.y-p1.y, 2) ); 21:22: printf(" 두 점 사이의 거리 : %f\n", dist);23:24: return 0;25: }

두 점 사이의거리 구하기

구조체 변수의 값 입력

Page 18: 9 장 .  구조체

구조체 간의 초기화 및 대입 (1/2)같은 구조체형의 변수들끼리는 서로 초기화나 대입이 가능하다 .구조체간의 초기화 : 멤버 대 멤버 초기화

동일한 멤버 간에 1:1 로 복사해서 초기화구조체간의 대입 : 멤버 대 멤버 대입

9 장 . 구조체

구조체의 활용

구조체

18

struct point p4;

Page 19: 9 장 .  구조체

구조체 간의 초기화 및 대입 (2/2)

9 장 . 구조체

구조체의 활용

구조체

19

Page 20: 9 장 .  구조체

구조체 간의 초기화 및 대입

9 장 . 구조체

구조체의 활용

구조체

20

01: /* Ex09_03.c */02: #include <stdio.h>03:04: struct point {05: int x, y;06: };07:08: int main(void)09: {10: struct point p1 = {10, 20};11: struct point p2 = {30, 40};12: struct point p3 = p1; 13: struct point p4;14:15: printf("p3 의 좌표 : %d, %d\n", p3.x, p3.y);16:17: p4 = p2; 18:19: printf("p4 의 좌표 : %d, %d\n", p4.x, p4.y);20:21: return 0;22: }

구조체 변수의 선언 및 초기화

구조체 간의 초기화

구조체 간의 대입

Page 21: 9 장 .  구조체

구조체 간의 비교구조체 변수 간에는 직접 비교 연산을 할 수 없다 .

두 구조체 변수의 값이 같은지 비교하려면 구조체 변수끼리 비교하는 대신 멤버 대 멤버로 비교해야 한다 .

9 장 . 구조체

구조체의 활용

구조체

21

Page 22: 9 장 .  구조체

구조체 배열 (1/2)같은 구조체형의 변수를 여러 개 사용하려면 구조체 배열을 선언한다 .

구조체 배열도 일반 배열처럼 인덱스를 이용해서 배열의 원소에 접근한다 .

9 장 . 구조체

구조체의 활용

구조체

22

Page 23: 9 장 .  구조체

구조체 배열 (2/2)구조체 배열을 초기화하려면 { } 안에 배열 원소의 초기값을 나열한다 .

9 장 . 구조체

구조체의 활용

구조체

23

Page 24: 9 장 .  구조체

구조체 배열을 이용한 성적 처리 프로그램 (1/3)

9 장 . 구조체

구조체의 활용

구조체

24

01: /* Ex09_04.c */02: #include <stdio.h>03:04: #define MAX_STUDENT 505:06: struct student {07: char name[20];08: int korean, english, math;09: double average;10: };11:12: int main(void)13: {14: struct student std[MAX_STUDENT]; 15: int i;16: double total_average = 0;17:18: printf("%d 명의 학생 정보를 입력하세요 .\n", MAX_STUDENT);

구조체의 정의

구조체 배열의 크기

구조체 배열의 선언

Page 25: 9 장 .  구조체

구조체 배열을 이용한 성적 처리 프로그램 (2/3)

9 장 . 구조체

구조체의 활용

구조체

25

19: for( i = 0 ; i < MAX_STUDENT ; i++ )20: {21: printf(" 이름 : ");22: scanf("%s", std[i].name);23: printf(" 국어 , 영어 , 수학 점수 : ");24: scanf("%d %d %d",25: &std[i].korean, &std[i].english, &std[i].math);26: std[i].average = (double)27: (std[i].korean+std[i].english+std[i].math) / 3;28: total_average += std[i].average;29: }30:31: total_average /= MAX_STUDENT;32:33: printf("\n 이름 국어 영어 수학 평균 \n");

구조체 배열의 입력

Page 26: 9 장 .  구조체

구조체 배열을 이용한 성적 처리 프로그램 (3/3)

9 장 . 구조체

구조체의 활용

구조체

26

34: for( i = 0 ; i < MAX_STUDENT ; i++ )35: {36: printf("%-10s %3d %3d %3d %6.2f\n",37: std[i].name, std[i].korean, std[i].english,38: std[i].math, std[i].average);39: }40: printf(" 전체 평균 : %6.2f\n", total_average);41:42: return 0;43: }

구조체 배열의 출력

Page 27: 9 장 .  구조체

구조체 포인터 (1/2)구조체 변수의 주소를 저장하는 포인터

9 장 . 구조체

구조체의 활용

구조체

27

Page 28: 9 장 .  구조체

구조체 포인터 (2/2)구조체 포인터로 구조체의 멤버에 접근할 때는 -> 연산자를 사용한다 .구조체 변수로 멤버에 접근할 때는 . 연산자를 사용한다 .

9 장 . 구조체

구조체의 활용

구조체

28

Page 29: 9 장 .  구조체

구조체 포인터의 사용 예 (1/2)

9 장 . 구조체

구조체의 활용

구조체

29

01: /* Ex09_05.c */02: #include <stdio.h>03: #include <math.h>04:05: struct point {06: int x, y;07: };08:09: double GetDistance(struct point* p1, struct point* p2);10:11: int main(void)12: {13: struct point pt1 = {0, 0};14: struct point pt2 = {10, 10};15: double distance;16:17: distance = GetDistance(&pt1, &pt2); 18: printf(" 두 점 사이의 거리 : %5.2f\n", distance);19:

구조체의 정의

구조체 포인터를 매개변수로 갖는 함수 선언

구조체 변수의 주소를 함수의 인자로 전달

Page 30: 9 장 .  구조체

구조체 포인터의 사용 예 (2/2)

9 장 . 구조체

구조체의 활용

구조체

30

20: return 0;21: }22:23: double GetDistance(struct point* p1, struct point* p2)24: {25: int dx = p2->x - p1->x;26: int dy = p2->y - p1->y;27:28: return sqrt(dx*dx + dy*dy);29: }

구조체 포인터를 인자로 갖는 함수 정의

Page 31: 9 장 .  구조체

비트필드 (1/3)구조체가 가진 멤버를 비트 단위로 사용한다 .비트필드를 정의할 때는 멤버 이름 다음에 : 을 쓰고 비트 수를 적어주면 된다 .

9 장 . 구조체

비트필드

구조체

31

Page 32: 9 장 .  구조체

비트필드 (2/3)메모리에 할당할 때 , 첫 번째 멤버를 최하위 비트에서부터 할당한다 .비트필드의 멤버에 주어진 비트로 표현 가능한 범위 밖의 값을 저장하면 오버플로우가 발생한다 .

비트필드도 구조체와 같은 방법으로 사용한다 .

9 장 . 구조체

비트필드

구조체

32

Page 33: 9 장 .  구조체

비트필드 (2/3)비트필드를 정의할 때는 중간에 일부 비트를 비워두고 멤버를 특정 비트에 할당할 수있다 .

9 장 . 구조체

비트필드

구조체

33

Page 34: 9 장 .  구조체

비트필드의 사용 예 (1/2)

9 장 . 구조체

비트필드

구조체

34

01: /* Ex09_06.c */02: #include <stdio.h>03:04: struct time {05: unsigned int sec : 6;06: unsigned int min : 6;07: unsigned int hour : 5;08: };09:10: int main(void)11: {12: struct time t1; 13:14: printf("time 구조체의 크기 : %d\n", sizeof(struct time)); 15:

비트필드의 정의

비트필드 변수의 선언

비트필드의 크기

Page 35: 9 장 .  구조체

비트필드의 사용 예 (2/2)

9 장 . 구조체

비트필드

구조체

35

16: t1.hour = 5;17: t1.min = 30;18: t1.sec = 70; 19:20: printf("%02d:%02d:%02d\n", t1.hour, t1.min, t1.sec);21:22: return 0;23: }

비트필드 멤버의 오버플로우 발생

Page 36: 9 장 .  구조체

공용체의 정의공용체는 여러 멤버들이 메모리를 공유해서 사용한다 .

공용체를 정의하면 공용체도 구조체처럼 새로운 데이터형이 된다 .

9 장 . 구조체

공용체

공용체와 열거체

36

Page 37: 9 장 .  구조체

공용체의 사용 (1/3)공용체 변수의 멤버들은 모두 같은 주소에 할당된다 .공용체의 크기는 공용체의 멤버 중 가장 크기가 큰 멤버에 의해 결정된다 .

9 장 . 구조체

공용체

공용체와 열거체

37

Page 38: 9 장 .  구조체

공용체의 사용 (2/3)공용체 변수를 초기화할 때는 첫 번째 멤버의 초기값만 지정한다 .

공용체의 멤버에 접근할 때도 . 와 -> 연산자를 사용한다 .

9 장 . 구조체

공용체

공용체와 열거체

38

Page 39: 9 장 .  구조체

공용체의 사용 예 (1/2)

9 장 . 구조체

공용체

공용체와 열거체

39

01: /* Ex09_07.c */02: #include <stdio.h>03:04: union data {05: unsigned long dword;06: unsigned char byte[4];07: };08:09: int main(void)10: {11: union data d1; 12: int i;13:14: printf("data 공용체의 크기 : %d\n", sizeof(union data));15:

공용체의 정의

공용체 변수의 선언

공용체의 크기 구하기

Page 40: 9 장 .  구조체

공용체의 사용 예 (2/2)

9 장 . 구조체

공용체

공용체와 열거체

40

16: d1.dword = 0x12345678;17: printf("d1.dword = %08x\n", d1.dword);18: for( i = 0 ; i < 4 ; i++ )19: printf("d1.byte[%d] = %02x\n", i, d1.byte[i]);20:21: return 0;22: }

공용체의 사용

Page 41: 9 장 .  구조체

리틀 엔디안과 빅 엔디안리틀 엔디안 : 최하위 바이트부터 메모리에 저장하는 방식빅 엔디안 : 최상위 바이트부터 메모리에 저장하는 방식인텔 계열의 CPU 는 리틀 엔디안 방식을 사용하고 , 모토로라 계열의 CPU 는 빅 엔디안 방식을 사용한다 .

9 장 . 구조체

공용체

공용체와 열거체

41

Page 42: 9 장 .  구조체

공용체의 사용 (3/3)공용체의 멤버들은 동시에 사용되지 않는다 .

job_code 가 0 이면 job_info 공용체 변수의 school_name 을 사용하고 , job_code가 1 이면 company_name 을 사용한다 . 공용체의 멤버인 school_name 과 company_name 이 동시에 사용되는 경우는 없으며 , 항상 둘 중 한 가지 값을 저장하는 용도로 사용된다 .

9 장 . 구조체

공용체

공용체와 열거체

42

Page 43: 9 장 .  구조체

구조체와 공용체의 비교

9 장 . 구조체

공용체

공용체와 열거체

43

공용체의 정의

구조체의 정의

Page 44: 9 장 .  구조체

열거체의 정의나열된 정수 값 중 하나를 갖는 정수형의 일종

9 장 . 구조체

열거체

공용체와 열거체

44

Page 45: 9 장 .  구조체

열거체의 사용열거체도 일종의 사용자 정의형이므로 열거체를 일단 정의하고 나면 , 열거체형의 변수를 선언하거나 배열 또는 구조체를 선언할 수 있다 .열거체 변수에는 열거체 정의에 나열된 열거 상수 중 하나를 저장하고 사용한다 .

열거 상수만 정수형 상수로 정의할수도 있다 .

열거체와 열거 상수는 프로그램의 가독성 (readability) 을 향상시키는 기능이다 .

9 장 . 구조체

열거체

공용체와 열거체

45

Page 46: 9 장 .  구조체

열거체의 사용 예 (1/2)

9 장 . 구조체

열거체

공용체와 열거체

46

01: /* Ex09_08.c */02: #include <stdio.h>03:04: enum week {sun, mon, tue, wed, thu, fri, sat}; 05:06: int main(void)07: {08: enum week weekday; 09:10: weekday = mon; 11:12: switch( weekday )13: {14: case sun:15: printf(" 일요일입니다 .\n");16: break;17: case mon:18: printf(" 월요일입니다 .\n");19: break;

열거체형 변수의 선언

열거체의 정의

열거 상수의 사용

Page 47: 9 장 .  구조체

열거체의 사용 예 (2/2)

9 장 . 구조체

열거체

공용체와 열거체

47

20: case tue:21: printf(" 화요일입니다 .\n");22: break;23: case wed:24: printf(" 수요일입니다 .\n");25: break;26: case thu:27: printf(" 목요일입니다 .\n");28: break;29: case fri:30: printf(" 금요일입니다 .\n");31: break;32: case sat:33: printf(" 토요일입니다 .\n");34: break;35: }36:37: return 0;38: }

Page 48: 9 장 .  구조체

typedef 의 정의typedef 는 기존의 데이터형에 새로운 이름을 붙인다 .

typedef 의 정의typedef

48

Page 49: 9 장 .  구조체

구조체와 typedef구조체나 공용체 , 열거체를 정의할 때 , typedef 가 유용하게 사용된다 .

typedef 정의를 한 다음에도 원래의 데이터형을 그대로 사용할 수도 있다 .

typedef 의 정의typedef

49

Page 50: 9 장 .  구조체

typedef 의 사용 예

9 장 . 구조체

typedef 의 정의

typedef

50

01: /* Ex09_09.c */02: #include <stdio.h>03:04: struct point {05: int x;06: int y;07: };08:09: typedef struct point POINT; 10:11: int main(void)12: {13: struct point p1 = {10, 20};14: POINT p2;15:16: p2 = p1; 17: printf("p2 의 좌표 : %d, %d\n", p2.x, p2.y);18:19: return 0;20: }

typedef 정의

같은 구조체 변수 간의 대입

구조체의 정의

Page 51: 9 장 .  구조체

typedef 의 사용 목적 (1/2)프로그램의 이식성을 향상시키기 위한 목적으로 사용된다 .

typedef 의 사용 목적typedef

51

Page 52: 9 장 .  구조체

typedef 의 사용 목적 (2/2)프로그램의 가독성을 향상시키기 위한 목적으로 사용된다 .

typedef 의 사용 목적typedef

52

Page 53: 9 장 .  구조체

구조체구조체 : 서로 다른 데이터 형의 변수들을 하나로 묶어서 사용하는 기능구조체의 정의struct student { char name[20];

int korean, english, math; double average;

};

구조체 변수의 선언 : 구조체 변수 선언 시 멤버들이 메모리에 할당된다 .struct student s1;

구조체의 멤버 접근 : 멤버 접근 연산자 (.) 를 이용한다 . s1.average = (double)(s1.korean+s1.english+s1.math)/3;

구조체의 초기화 : { } 안에 초기값을 나열한다 . struct student s1 = {" 김모모 ", 100, 100, 100, 0.0};

구조체 배열 및 포인터 : 구조체 배열을 선언하거나 포인터를 선언할 수 있다 .

9 장 . 구조체

학습정리

53

Page 54: 9 장 .  구조체

공용체와 열거체공용체 : 공용체의 멤버들은 모두 같은 주소에 할당되므로 메모리를 공유union data { unsigned long dword; unsigned char byte[4];};

열거체 : 정수형의 일종으로 변수가 가질 수 있는 값을 열거 상수로 나열enum week {sun, mon, tue, wed, thu, fri, sat};

typedeftypedef 란 : 기존의 데이터 형에 새로운 이름을 만드는 기능typedef unsigned int UINT;

typedef 의 사용목적 : typedef 는 이식성과 가독성을 제공

9 장 . 구조체

학습정리

54

Page 55: 9 장 .  구조체

실습하기 : 학생들의 학사 data : 개인 + 수강정보

55

일반적인 구현이 어려우면 ,

자신의 학사데이터라고 가정합니다 .

학과 : string, 즉 char 배열 , size 는 넉넉히 20,

학과이름의 길이는 어느 정도 제한되어 있으므로 굳이 pointer

필요없음 .

학번 : int 가 아닌 string 으로

학년 : int

생일 : 생년 , 월 , 일 구조체

수강과목 정보 ( 최대 5 과목 ) : 과목이름 , 담당교수 , 학점 , 시간 등등

구조체

여러 과목이므로 구조체의 배열

필요한 정보와 기능은 무엇인가 ?

여기서는

학과 , 학번 , 학년 , 이름 , 생일 , 수강과목의 정보들만 .!

추가 / 삭제 / 삽입 / 보기 등의 기능만 . 데이터 구조 설계 하기

데이터들의 type 정하기

( 기본을 정하고 확장 / 수정하세요 )

학사 data 정의하기

Page 56: 9 장 .  구조체

실습하기 : 학생들의 학사 data : 개인 +수강정보

• 데이터 구조

56

변수 / type

학과 char dept[20]

학번 char sid[10];

학년 int grade

이름 char name[10];

생년월일 년 int year

구조체 월 int month;

Birth 일 int day;

수강과목( 최대 5 과

목 )과목명 char title[50];

구조체 배열 담당교수 char prof[10];

Courses 학점 char grade[2];

..

Page 57: 9 장 .  구조체

파일에서 데이터 읽어 처리하기 예 )int main(){ FILE *fp1 = NULL; FILE *fp2 = NULL; struct student s[100]; int i=0, num = 0 ;

fp1 = fopen("d:\\test\\sample.txt", "r"); // 읽기용화일포인터fp2 = fopen("d:\\test\\result.txt", "w"); // 쓰기용화일포인터

if( fp1 != NULL ) {

while(!feof(fp1)){ fscanf(fp1, "%d",&s[i].number); fscanf(fp1, "%s",s[i].name); fscanf(fp1, "%lf",&s[i].height); i++;}

}else printf(" 파일열기실패 \n");

num = i-1; // 학생 수 i=0;

57

<sample.txt>

20091020 김길동 178.120101008 홍길동 180.120111113 박길동 165.120081115 박길동 167.0..

struct student{ int num; char name[10]; double height;}

if( fp2 != NULL ) {fprintf(fp2, "\n ####################### \n");fprintf(fp2, " 번호 학번 이름 키 ");fprintf(fp2, "\n ####################### \n");while(i< num){ // 파일에 쓰기

fprintf(fp2, "%d %d %s %lf \n",i+1, s[i].number, s[i].name, s[i].height);

i++;}

fprintf(fp2, "\n ###################### \n");

} else printf(" 화일쓰기실패 \n");

printf("\n--------------------END----------------------\n");

fclose(fp1); fclose(fp2); return 0;}

Page 58: 9 장 .  구조체

Linked list 구현하기

• 1. 리스트에서 필요한 자료구조를 그려보세요 .

• 2. 만들어진 자료구조에 데이터 add 하는 로직을 생각합니다 .

• 3. 만들어진 자료구조에서 데이터 delete 하는 로직을 생각합니다 .

• 4. 만들어진 자료구조에 데이터 insert 하는 로직을 생각합니다 .

58

1 2 4 5 6

3

NULL

Page 59: 9 장 .  구조체

간단한 리스트와 추가하기 예

struct num list;struct num *p;

list.i=0; list.ptr= NULL;

//list 에 추가하기 : p = &list;p->ptr = malloc(sizeof(struct num));p=list.ptr;p->i = 3;p->ptr = NULL;print(&list);

59

struct num{int i;struct num *ptr;

};

void print(struct num *list){ int n=0;

while(list.ptr != NULL){printf("list[%d].i = %d \n", n, list->i);list = list->ptr;n++;

}}

struct num *list2;struct num *p;

list2=(struct num *)malloc(sizeof(struct num));

list2->i=0; list2->ptr = NULL;

//list 에 추가하기 : p = list2;p->ptr = malloc(sizeof(struct num));p=list2->ptr;p->i = 3;p->ptr = NULL;print(list2);