+ All Categories
Home > Documents > chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · •...

chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · •...

Date post: 28-Feb-2021
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
40
2011-1학기 프로그래밍입문(1) 9장 구조체와 공용체 9장 구조체와 공용체 Tel: 970-6702 E il jh k1@ lt h k 0 Email: jhpark1@seoultech.ac.kr
Transcript
Page 1: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

2011-1학기 프로그래밍입문(1)

9장 구조체와 공용체9장 구조체와 공용체

박 종 혁박 종 혁

Tel: 970-6702

E il jh k1@ lt h k

0

Email: [email protected]

Page 2: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체와 공용체구조체와 공용체

• C 언어의 확장 방법

- 매크로와 라이브러리

- 사용자 정의 형 (배열, 구조체, 공용체)사용자 정의 형 (배열, 구조체, 공용체)

A Book on C, 4ed. 9-1

Page 3: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체구조체

• 서로 다른 형의 변수들을 하나로 묶어 주는 방법

• 예제 - 카드

A Book on C, 4ed. 9-2

Page 4: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체구조체

• 예제 - 카드

각 카드는 고유의 무늬와 숫자를 가짐- 각 카드는 고유의 무늬와 숫자를 가짐

구조체를 사용하여 표현하면 효율적

- 카드를 위한 구조체 선언

struct card {struct card {

int pips;

h it char suit;

};

A Book on C, 4ed. 9-3

Page 5: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 선언구조체 선언

• 예제 - 카드t t d {struct card {

int pips;

h it char suit;

};

-struct : 키워드

-card : 구조체 태그 이름

-pips, suit : 구조체 멤버

* 이것은 struct card 형의 정의이고 변수 선언은* 이것은 struct card 형의 정의이고, 변수 선언은아님

A Book on C, 4ed. 9-4

Page 6: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법 1구조체 변수 선언 방법 1

• struct card 형 변수 c1, c2

struct card {

int pips;int pips;

char suit;

};};

struct card c1, c2;

A Book on C, 4ed. 9-5

Page 7: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법 2구조체 변수 선언 방법 2

• struct card 형 변수 c1, c2

struct card {

int pips;int pips;

char suit;

} c1 c2;} c1, c2;

A Book on C, 4ed. 9-6

Page 8: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법 3구조체 변수 선언 방법 3

• struct card 형 변수 c1, c2

struct card {

int pips;int pips;

char suit;

};};

typedef struct card card;

card c1 c2;card c1, c2;

A Book on C, 4ed. 9-7

Page 9: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법 4구조체 변수 선언 방법 4

• struct card 형 변수 c1, c2

typedef struct {

int pips;int pips;

char suit;

} card;} card;

card c1, c2;

A Book on C, 4ed. 9-8

Page 10: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법 5구조체 변수 선언 방법 5

• struct 형 변수 선언

struct {

int pips;int pips;

char suit;

} c1, c2;} c1, c2;

- 구조체 태그 이름이 없음에 주의- 구조체 태그 이름이 없음에 주의

-C1, c2와 같은 형의 변수는 다시는 선언할 수없음없음

A Book on C, 4ed. 9-9

Page 11: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 변수 선언 방법구조체 변수 선언 방법

struct {

i t iint pips;

char suit;

} 1 2} c1, c2;

struct {

int pips;

char suit;char suit;

} c3, c4;

* c1, c2는 c3, c4와는 다른 형임

A Book on C, 4ed. 9-10

Page 12: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체 멤버구조체 멤버

• 한 구조체내에서 멤버 이름은 유일해야 하나, 서로 다른 구조체에서는 같은 멤버 이름을 사용할 수 있음른 구조체에서는 같은 멤버 이름을 사용할 수 있음

struct fruit {

char *name;

int calories;

}};

struct vegetable {

char *name;char name;

int calories;

};};

struct fruit a;

struct vegetable b;

A Book on C, 4ed. 9-11

Page 13: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

멤버 접근 연산자 .멤버 접근 연산자 .

• 일반 구조체 멤버 접근 연산자

c1.pips = 3;

c1.suit = 's';

c2.pips = c1.pips;

2 it 1 itc2.suit = c1.suit;

A Book on C, 4ed. 9-12

Page 14: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

멤버 접근 연산자 ->멤버 접근 연산자 ->

• 포인터를 통한 구조체 멤버 접근 연산자

pointer_to_structure -> member_name

• 다른 방법• 다른 방법

(*pointer_to_structure).member_name

A Book on C, 4ed. 9-13

Page 15: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

멤버 접근 연산자 -> 예제멤버 접근 연산자 -> 예제

struct complex {

double re; /* real part */; / p /

double im; /* imag part */

};

typedef struct complex complex;

void add(complex *a, complex *b, complex *c) {

a -> re = b -> re + c -> re;;

a -> im = b -> im + c -> im;

}}

A Book on C, 4ed. 9-14

Page 16: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

멤버 접근 연산자멤버 접근 연산자

선언문과 배정문

struct student tmp, *p = &tmp;

tmp.grade = 'A';

tmp.last_name = "Casanova";

tmp.student_id = 910017

수식 동등한 수식 개념적 값수식 동등한 수식 개념적 값

tmp.grade

tmp last name

p -> grade

p -> last name

A

Casanovatmp.last_name

(*p).student_id

*p -> last_name + 1

p -> last_name

p -> student_id

(*(p -> last_name)) + 1

Casanova

910017

D

*(p -> last_name + 2) (p -> last_name)[2] s

A Book on C, 4ed. 9-15

Page 17: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

연산자의 우선 순위와 결합 법칙연산자의 우선 순위와 결합 법칙

연산자 결합 법칙

() [] . -> ++ (후위) -- (후위) 좌에서 우로

++ (전위) (전위) ! si eof (형)++ (전위) -- (전위) ! ~ sizeof (형)

+ (단항) - (단항) & (주소) * (역참조)우에서 좌로

* / % 좌에서 우로

+ 좌에서 우로+ - 좌에서 우로

<< >> 좌에서 우로

< <= > >= 좌에서 우로

== != 좌에서 우로

& 좌에서 우로

^ 좌에서 우로

| 좌에서 우로

&& 좌에서 우로

|| 좌에서 우로

?: 우에서 좌로

= += -= *= /= %=<<= >>= &= ^= |= 우에서 좌로

A Book on C, 4ed. 9-16

, (콤마 연산자) 좌에서 우로

Page 18: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

함수에서 구조체함수에서 구조체

• 구조체는 함수의 인자로써 함수에 전달될 수 있고, 함

수로부터 리턴될 수도 있음수로부터 리턴될 수도 있음

• 함수의 인자로서 구조체가 전달될 때 구조체는 값으로

전달됨

• 구조체가 많은 멤버를 가지거나 큰 배열을 멤버로 가구조체가 많은 멤버를 가지거나, 큰 배열을 멤버로 가

질 경우, 함수의 인자로 구조체를 전달하는 것은 상대

적으로 비효율적임적으로 비효율적임

• 따라서 대부분의 응용 프로그램에서는 함수의 인자로

구조체의 주소를 사용함

A Book on C, 4ed. 9-17

Page 19: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

함수에서 구조체 예제함수에서 구조체 예제

typedef struct {

char name[25];char name[25];

int employee_id;

struct dept department;p p ;

struct home_address *a_ptr;

double salary;

......

} employee_data;

* department 멤버는 그 자체가 구조체이고, 컴파일러

는 각 멤버의 크기를 미리 알아야 하므로 struct 는 각 멤버의 크기를 미리 알아야 하므로 struct

dept에 대한 선언이 먼저 와야 함

A Book on C, 4ed. 9-18

Page 20: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

함수에서 구조체 예제함수에서 구조체 예제

• 함수 선언 방법 1

employee_data update(employee_data e){

.....

printf("Input the department number: ");printf( Input the department number: );

scanf("%d", &n);

e.department.dept no = n;e.department.dept_no n;.....

return e;

}}

* 함수 호출employee_data e;

e = update(e);

A Book on C, 4ed. 9-19

Page 21: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

함수에서 구조체 예제함수에서 구조체 예제

• 함수 선언 방법 2

Void update(employee_data *p) {

.....

printf("Input the department number: ");printf( Input the department number: );

scanf("%d", &n);

p->department.dept no = n;p >department.dept_no n;.....

}

* 함수 호출

employee data e;employee_data e;

update(&e);

A Book on C, 4ed. 9-20

Page 22: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

구조체의 초기화구조체의 초기화

card c = {13, 'h'}; /* the king of hearts */

complex a[3][3] = {complex a[3][3] {

{{1.0, -0.1}, {2.0, 0.2}, {3.0, 0.3}},

{{4.0, -0.4}, {5.0, 0.5}, {6.0, 0.6}},{{ , }, { , }, { , }},

}; /* a[2][] is assigned zeroes */

struct fruit frt = {"plum", 150};

struct home_address {

char *street;

char *city_and_state;

long zip_code;

} dd {"87 " " l d " 80526}} address = {"87 West Street", "Aspen, Colorado", 80526};

struct home_address previous_address = {0};

A Book on C, 4ed. 9-21

Page 23: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

공용체공용체

• union

• 공용체는 구조체와 비슷한 구문 형식을 가지지만 각

멤버들은 같은 기억장소를 공유함

• 공용체형은 메모리의 같은 위치에 저장될 여러 값의

집합을 정의집합을 정의

• 저장된 값을 올바르게 해석하는 것은 프로그래머의 책저장된 값을 올바 게 해석하는 것은 래머의 책

A Book on C, 4ed. 9-22

Page 24: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

공용체 선언공용체 선언

• 예제i i t fl t {union int_or_float {

int i;

float f;float f;

};

i : 키워드- union : 키워드

- int_or_float : 공용체 태그 이름

- i, f : 공용체 멤버

* int or float 형 변수는 MAX(sizeof(int)* int_or_float 형 변수는 MAX(sizeof(int),

sizeof(float)) 만큼의 메모리 할당될 것임

A Book on C, 4ed. 9-23

Page 25: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

공용체 변수 선언공용체 변수 선언

• 공용체 변수 선언

i i fl bunion int_or_float a, b, c;

- 이 선언으로 식별자 a, b, c에 대한 기억장소가 할

• 컴파일러는 공용체의 멤버 중에서 가장 큰 기억장소를컴파일러는 공용체의 멤버 중에서 가장 큰 기억장소를

요구하는 멤버의 요구만큼 기억장소를 할당

공용체의 멤버 접근 방법은 구조체의 멤버 접근 방법• 공용체의 멤버 접근 방법은 구조체의 멤버 접근 방법

과 동일

A Book on C, 4ed. 9-24

Page 26: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

공용체 예제공용체 예제

int main(void) {

union int or float n;union int_or_float n;

n.i = 4444;

printf("i: %10d f: %16.10e\n", n.i, n.f);p ( \ , , );

n.f = 4444.0;

printf("i: %10d f: %16.10e\n", n.i, n.f);

return 0;

}

• 출력 결과 예:

i: 4444 f: 0.6227370375e-41

i: 1166729216 f: 4.4440000000e+03

A Book on C, 4ed. 9-25

Page 27: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트 필드비트 필드

• 구조체나 공용체에서 int 형이나 unsigned 형의 멤버

에 비트 수(폭)를 지정하는 것에 비트 수(폭)를 지정하는 것

• 폭은 콜론 다음에 음수가 아닌 정수적형 상수 수식으

로 지정되고, 최대 값은 기계 워드의 비트 수와 같음

• 일반적으로 비트 필드는 구조체의 연속적인 멤버로 선일반적으로 비트 필드는 구조체의 연속적인 멤버로 선

언되며, 컴파일러는 이 멤버들을 최소의 기계 워드로

패킹함패킹함

• unsigned 비트 필드에는 음수가 아닌 정수만이 저장

되고, int 비트 필드는 시스템에 따라 다름 - 보통

unsigned 비트 필드를 사용

A Book on C, 4ed. 9-26

Page 28: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트 필드 예제비트 필드 예제

• 카드는 4개의 무늬와 각 무늬당 13개의 숫자로 이

루어짐루어짐

• 카드를 비트 필드로 표현하면 메모리를 절약할 수

있음

struct pcard {struct pcard {

unsigned pips : 4;

unsigned suit : 2;unsigned suit : 2;

};

t t d struct pcard c;

* c는 6 비트에 저장됨

A Book on C, 4ed. 9-27

Page 29: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트 필드 예제비트 필드 예제

• 대부분의 컴퓨터에서는 비트 필드가 워드 경계에 걸치

지 않도록 할당됨지 않도록 할당됨

• 예제

struct abc {

int a : 1 b : 16 c : 16;int a : 1, b : 16, c : 16;

} x;

* 이 경우 x는 두 워드에 다음과 같이 저장됨

- 첫 번째 워드 : 비트 필드 a와 b 저장첫 번째 워드 : 비트 필드 a와 b 저장

- 두 번째 워드 : c 저장

A Book on C, 4ed. 9-28

Page 30: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트 필드 제약사항비트 필드 제약사항

• 비트 필드의 배열은 허용되지 않음

• 비트 필드에 주소 연산자 &를 적용할 수 없음

- 즉, 멤버 접근 연산자 ->를 사용할 수는 있어도,

포인터가 직접 비트 필드를 포인트할 수는 없음포인터가 직접 비트 필드를 포인트할 수는 없음

A Book on C, 4ed. 9-29

Page 31: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트 필드비트 필드

• 패딩과 정렬을 위해 이름 없는 비트 필드나 폭이 0인

비트 필드를 사용할 수 있음비트 필드를 사용할 수 있음

struct small_integers {

unsigned i1 : 7, i2 : 7, i3 : 7,

: 11, /* align to next word */

i4 : 7, i5 : 7, i6 : 7;

}

struct abc {

unsigned a : 1, : 0, b : 1, : 0, c : 1;g , , , , ;

};

A Book on C, 4ed. 9-30

Page 32: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트와 바이트의 접근비트와 바이트의 접근

• 비트와 바이트를 접근하기 위해 다음과 같이 선언할 수 있음typedef struct {typedef struct {

unsigned b0 : 8, b1 : 8, b2 : 8, b3 : 8;

} word_bytes;

typedef struct {typedef struct {

unsigned

b0 : 1, b1 : 1, b2 : 1, b3 : 1, b4 : 1, b5 : 1, b6 : 1,

b7 : 1, b8 : 1, b9 : 1, b10 : 1, b11 : 1, b12 : 1, b13 : 1,, , , , , , ,

b14 : 1, b15 : 1, b16 : 1, b17 : 1, b18 : 1, b19 : 1, b20 : 1,

b21 : 1, b22 : 1, b23 : 1, b24 : 1, b25 : 1, b26 : 1, b27 : 1,

b28 : 1, b29 : 1, b30 : 1, b31 : 1;

} word_bits;

typedef union {

int i;

word_bits bit;

word_bytes byte;

} word;

A Book on C, 4ed. 9-31

Page 33: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

비트와 바이트의 접근비트와 바이트의 접근

int main(void)

{

word w = {0};

void bit_print(int);

w bit b8 = 1;w.bit.b8 = 1;

w.byte.b0 = 'a';

printf("w.i = %d\n", w.i);

bit_print(w.i);

return 0;

}}

w.i = 353

00000000 00000000 00000001 0110000100000000 00000000 00000001 01100001

w.i = 1635778560

01100001 10000000 00000000 00000000

A Book on C, 4ed. 9-32

Page 34: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

접시 보관 방법접시 보관 방법

• 자료구조 (접시 보관장, 접시 개수대, 찬장)

연산 (접시 넣기 접시 꺼내기)• 연산 (접시 넣기, 접시 꺼내기)

A Book on C, 4ed. 9-33

Page 35: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

ADTADT

• ADT (Abstract Data Type:추상 자료형)

- 연산자를 포함한 자료구조

- 구현에 대해서는 고려하지 않음

A Book on C, 4ed. 9-34

Page 36: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

스택스택

• 자료 저장을 위한 자료구조로 자료의 삽입과 삭제가톱이라는 스택의 한쪽 끝에서 일어남톱이라는 스택의 한쪽 끝에서 일어남

• 삭제는 후입선출 방법으로 일어남

• 스택 연산 : push, pop, top, empty, full, reset

• ADT 스택

A Book on C, 4ed. 9-35

ADT 택

Page 37: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

ADT 스택 구현ADT 스택 구현

• 스택 구현 방법

- 배열

- 선형 연결 리스트선형 연결 리스트

A Book on C, 4ed. 9-36

Page 38: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

ADT 스택 구현 예제ADT 스택 구현 예제

#define MAX_LEN 1000

#define EMPTY -1#define EMPTY 1

#define FULL (MAX_LEN - 1)

typedef enum boolean {false, true} boolean;

typedef struct stack {typedef struct stack {

char s[MAX_LEN];

int top;

} stack;

A Book on C, 4ed. 9-37

Page 39: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

ADT 스택 구현 예제ADT 스택 구현 예제

void reset(stack *stk) {

stk -> top = EMPTY;stk > top = EMPTY;

}

void push(char c, stack *stk) {

stk -> top++;

stk -> s[stk -> top] = c;

}

char pop(stack *stk){

return (stk > s[stk > top ]);return (stk -> s[stk -> top--]);

}

A Book on C, 4ed. 9-38

Page 40: chap09 [호환 모드]parkjonghyuk.net/.../programming1/Korean/chap09.pdf · 2011. 3. 7. · • 카드는4개의무늬와각무늬당13개의숫자로이 루어짐 • 카드를비트필드로표현하면메모리를절약할수

ADT 스택 구현 예제ADT 스택 구현 예제

char top(const stack *stk){

return (stk -> s[stk -> top]);( [ p]);

}

boolean empty(const stack *stk) {

return ((boolean) (stk -> top == EMPTY));

}}

boolean full(const stack *stk){boolean full(const stack *stk){

return ((boolean) (stk -> top == FULL));

}}

A Book on C, 4ed. 9-39


Recommended