6. Structures
๊ตฌ์กฐ์ฒด๋ ํ๋์ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆด ์ ์๋ ์๋ก ๋ค๋ฅธ ํ์ ์ ๋ณ์๋ค์ ๋ชจ์์ด๋ค(PASCAL์์๋ records). ๊ตฌ์กฐ์ฒด๋ ํฐ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ๋ณ์๋ค์ ๋ชจ์์ ํ๋์ ๋ ๋ฆฝ๋ ์์ผ๋ก ์ทจ๊ธํ๊ฒ ํด์ฃผ๋ฏ๋ก ๋ณต์กํ ์๋ฃ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด ์ฌ์์ง๋ค.
ํธํ ์๊ฐํ๋ฉด ๊ฐ์ฒด๋ DB์ ํ ROW๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
6.1. Basics of Structures
๊ตฌ์กฐ์ฒด ์ ์ธ
struct point{
int x;
int y;
}
์๋ฐ๋ ํ์ ์คํฌ๋ฆฝํธ์ ์ธํฐํ์ด์ค ๋ฆฌํฐ๋ด๊ณผ ๊ฐ๋ค.
struct
(type) : ๋ช
๋ น์ด๋ ๊ตฌ์กฐ์ฒด์ ์์์ ๋ํ๋ธ๋ค.
point
(name) : ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ struct
๋ค์ ์จ๋ค.
x,y
(member) :๊ตฌ์กฐ์ฒด์ ์ํ๋ ๋ณ์๋ค์ ๋ฉค๋ฒ๋ผ๊ณ ๋ถ๋ฅด๊ณ {}์์์ ๋ณ์์ฒ๋ผ ์ ์ธํ๋ค.
๋ฉค๋ฒ์ ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ ์๋ฐํ ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ด๋ฆ์ด์ด๋ ์๊ด์๋ค. ๋ ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ด ์ผ์ข ์ ๋ค์์คํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฉค๋ฒ๋ช ์ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด์์ ์ ์ธํด๋ ๋ฌธ์ ์๋ค.
๊ตฌ์กฐ์ฒด type์ ์ ์ธ๊ณผ ๊ตฌ์กฐ์ฒด๋ณ์ ์ ์ธ
struct{...} x, y, z;
์ด๋ ๊ฒ ํ๋ฉด ํด๋น ๊ตฌ์กฐ({...}
)๋ฅผ ๊ฐ๋ ๊ตฌ์กฐ์ฒด๋ฅผ 3๊ฐ(x,y,z
) ์ ์ธํ ๊ฒ์ด๋ค.
๊ตฌ์กฐ์ฒด type๋ง ์ ์ธ
struct{...};
์ด๊ฑด ์ด๋ฐ๊ฐ ์ฐ๋ ๊ฑธ๊น?
์ ์ธ๋ ๊ตฌ์กฐ์ฒด type์ ๊ฐ๋ ๋ณ์ ์ ์ธ
struct point pt
์ด๋ ๊ฒ ๋๋ฉด ์์ ์ ์ธํ point
์ ๊ตฌ์กฐ์ ๊ฐ์ ๋ณ์ pt
๊ฐ ๋ง๋ค์ด์ง๋ค.
์ ์ธ๋ ๊ตฌ์กฐ์ฒด type์ ๊ฐ๋ ๋ณ์ ์ ์ธ๊ณผ ํ ๋น
struct point pt = {320,200};
๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ์ ๊ทผํ๋ ๋ฒ
pt.x; //320
pt.y; //200
๊ตฌ์กฐ์ฒด์ด๋ฆ.๋ฉค๋ฒ์ด๋ฆ
์์ผ๋ก .
์ด๋ผ๋ ๋ฉค๋ฒ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ๊ณผ ๋ฉค๋ฒ ์ด๋ฆ์ ์ฐ๊ฒฐ์ํจ๋ค.
sqrt ๋ฌด์จ ๋ฌธ๋ฒ์ด์์?
double dist, sqrt(double);
dist = sqrt((double)pt.x*pt.x+(double)pt.y*pt.y);
๊ตฌ์กฐ์ฒด์ ๊ตฌ์กฐ์ฒด๋ ์์ ์ ์๋ค(๊ฐ์ฒด์์ ๊ฐ์ฒด์ฒ๋ผ)
struct rect{
struct point pt1;
struct point pt2;
}
๋ฉค๋ฒ๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ฒด์ type์ ๊ฐ๋ ๋ณ์์ ์ ๊ทผ
struct rect screen;
// screen์ pt1์ด๋ผ๋ ๋ฉค๋ฒ์ x์ขํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
screen.pt1.x;
6.2. Structures and Functions
๊ตฌ์กฐ์ฒด๋ก ํ ์ ์๋ ์ฐ์ฐ์ Copy, Assignment, ๊ทธ๋ฆฌ๊ณ &๋ก ๊ตฌ์กฐ์ฒด์ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ๋ฐ์ ์๋ค. Copy์ Assignment๋ ํจ์๋ก ์ธ์๋ฅผ ๋๊ธฐ๊ฑฐ๋ ๊ฐ์ ๋ฐ๋ ๊ฒ์ ํฌํจํด์ ๋ช ์นญํ๋ ๊ฒ์ด๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฐ์ฐ์ ํ๋ ํจ์๋ฅผ ์ฌ์ฉํด๋ณด์. ์ต์ ์ธ๊ฐ์ง ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์๋ค. 1. ๋
๋ฆฝ์ ์ผ๋ก ์์๋ฅผ ๋ณด๋ด๊ฑฐ๋(sqrt(pt.x)
) 2. ํ๋์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณด๋ด๊ฑฐ๋(sqrt(pt)
) 3. ํฌ์ธํฐ๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ(sqrt(&pt)
)
๋๊ฐ์ ์ ์๋ฅผ ๋ฐ์ point๋ผ๋ ๊ตฌ์กฐ์ฒด ๋ฆฌํด
struct point makepoint(int x, int y){
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
makepoint
๋ ์ด๋ ํ ๊ตฌ์กฐ์ฒด์ ์ด๊ธฐํ๋ ๋ฉค๋ฒ์ ์ด๋ค ๊ฐ์ ๋ฃ๋ ํจ์๋ก ์ฌ์ฉํ ์ ์๋ค.
ํจ์๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด์ ์ด๊ธฐํ, ๋ฉค๋ฒ์ ๊ฐ ํ ๋น
struct rect screen; // point ํ ๊ตฌ์กฐ์ฒด ๋๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ rectํ ๋ณ์ sreen ์ ์ธ
struct point middle; // point ํ ๊ตฌ์กฐ์ฒด middle ์ ์ธ
struct point makepoint(int,int); // point ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฆฌํดํ๊ณ int 2๊ฐ ๋ฅผ ์ธ์๋ก ๋ฐ๋ makepoint์ ์ธ
screen.pt1 = makepoint(0,0); // ๊ตฌ์กฐ์ฒด pt1์ ๋ฉค๋ฒ ๊ฐ์ ํจ์๋ฅผ ํตํด ํ ๋น pt.x=0, pt.y=0
screen.pt2 = makepoint(XMAX,YMAX);
middle = makepoint((screen.pt1.x+screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2);
// middle ์ด๋ผ๋ point ํ์
๊ตฌ์กฐ์ฒด์ makepointํจ์๋ฅผ ํตํด ๋ฉค๋ฒ๊ฐ ์ด๊ธฐํ.
๊ตฌ์กฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์
struct point addpoint(struct point p1, struct point p2){
p1.x += p2.x;
p1.y += p2.y;
return p1;
}
์ฌ๊ธฐ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฆฌํดํด์ค๋ค.
๋งค๊ฐ๋ณ์๋ก ๊ตฌ์กฐ์ฒด์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฉค๋ฒ๋ก๊ฐ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ๋ ํจ์
// rect๋ผ๋ ์ฌ๊ฐํ์์ point๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฉด 1 ์๋๋ฉด 0์ ๋ฆฌํดํ๋ ํจ์
// ์ผ์ชฝ๊ณผ ๋ฐ๋ณ์ ์ฌ๊ฐํ ์์ญ์ ํฌํจํ๊ณ ์ค๋ฅธ์ชฝ๊ณผ ์๋ณ์ ํฌํจ๋์ง ์๋๋ค๊ณ ๊ฐ์
// pt1์ด ์ผ์ชฝ ์๋์ ์๋ ์ ์ ์ขํ๋ค.
// pt2๊ฐ ์ค๋ฅธ์ชฝ ์์ ์๋ ์ ์ ์ขํ๋ค.
int ptinrect(struct point p, struct rect r){
return p.x>=r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y;
}
๊ทธ๋ฐ๋ฐ ์ฌ๋์ ๋ฐ๋ผ์ ์ผ์ชฝ ์๋์ ์๋์ ์ pt2
๋ก ๋ฃ์ ์๋ ์์ผ๋ rect
ํ ๋ณ์๋ฅผ ๋ฐ์์ ์ผ์ชฝ ์๋์ ์ ์ pt1
์ผ๋ก ๋ฃ๋, ์ผ์ข
์ ํ์คํ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์.
ํ์คํ(canonical) ํจ์
struct rect cononrect(struct rect r){
struct rect temp;
temp.pt1.x = min(r.pt1.x, r.pt2.x);
// ์ด๋ฐ์์ผ๋ก ๋ ์ ์ค ๋ ์์ x์ ์ขํ ์ฆ, ์ผ์ชฝ์๋์ ์๋ ์ ์ x์ขํ๋ฅผ
// ์๋ก์ด rect๋ณ์์ pt1์ ๋ด๋๋ค. ๋๋จธ์ง๋ ๋ง์ฐฌ๊ฐ์ง.
...
}
๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ
๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ์๊ณผ ๊ฐ๋ค.
struct point *pp
ํท๊ฐ๋ฆด ์๋ ์์ผ๋ ์ ๋ฆฌํ๊ณ ๊ฐ์. pp
๋ ํฌ์ธํฐ์ด๊ณ (*
) ํด๋น ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ์ค์ ๊ฐ์ point
๋ผ๋ ํ์ ๊ฐ์ง ๊ตฌ์กฐ์ฒด์ด๋ค.
pp
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ข
์ ๋๋ฏธ๋ณ์๋ฅผ ๋ง๋ค์ด์ค์ ํฌ์ธํฐ์ ํ ๋น์ ํด์ค์ผํ๋ค.
struct point dummy, *pp;
pp = &dummy;
// ์ด๋ ๊ฒ ํด์ผ๋ง ํฌ์ธํฐ๊ฐ ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํฌ ์ ์๊ฒ ๋๊ณ *pp๋ก ๊ฐ์ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
printf("origin is (%d,%d)\n", (*pp).x, (*pp).y);
ํฌ์ธํฐ๋ก๋ถํฐ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ์ ๊ทผ
p->๋ฉค๋ฒ
๋ง์ฝ p
๊ฐ ํฌ์ธํฐ๋ผ๋ฉด ->
์ฐ์ฐ์๋ฅผ ํตํด์ (*p).๋ฉค๋ฒ
์ ๊ฐ์ ํจ๊ณผ๋ก p->๋ฉค๋ฒ
๋ฅผ ์ธ ์ ์๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ ์ ์๋ค.
struct rect r, *rp = &r;
// ์ฌ๊ธฐ์ rp๋ ํฌ์ธํฐ์ด๋ฉฐ r์ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค.
// ํฌ์ธํฐ์ ํ ๋นํ๋ ๊ฒ์ ๋ณ์์ฌ์ผ ํด์ ๋ฐ๋ก ๋๋ฏธ ๋ณ์ r์ ์ ์ธํด์ค ๊ฒ์ด๋ค.
r.pt1.x;
rp->pt1.x;
(*rp).pt1.x;
// ์ ์ธ๊ฐ์ง๋ ๋ชจ๋ ๊ฐ์ ํํ์ด๋ค.
๊ตฌ์กฐ์ฒด ์ฐ์ฐ์ .
, ->
๋ ํจ์๋ฅผ ๋ถ๋ฅด๊ธฐ ์ํ ()
, ์ธ๋ฑ์ฑ์ ์ํ []
๊ณผ ํจ๊ป ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์ฐ์ฐ์์ด๋ค.
๊ทธ๋์
struct {int len; char *str;} *p;
์ ๊ฐ์ ์ ์ธ์ด ์์ผ๋ฉด ++p->len
๋ ++(p->len)
๊ณผ ๊ฐ์ ์๋ฏธ์ด๋ฏ๋ก p๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ len์ 1์ฆ๊ฐ ์ํจ๋ค.
*p->str
์ ์ฌ์ค์ *(p->str)
์ด๋ฏ๋ก str์ด๋ผ๋ ๋ฉค๋ฒ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ์๋ฏธํ๋ค.
6.3. Arrays of Structure
ํฌ์ธํฐ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์๋ฏ ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด๋ ์๋ค.
๋ฌธ์์ด C
์์ ์ฌ์ฉ๋๋ ํค์๋์ค ์ด๋ ๊ฒ์ด ๋ช ๋ฒ ๋์๋์ง ์ธ๋ ํ๋ก๊ทธ๋จ์ ์๊ฐํด ๋ณด์. ์ด ํ๋ก๊ทธ๋จ์๋ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋ฐฐ์ด๊ณผ ๊ทธ ์๋ฅผ ์ธ๊ธฐ ์ํ ์ ์์ ๋ฐฐ์ด์ด ํ์ํ๋ค. ๊ทธ ํ๊ฐ์ง ๋ฐฉ๋ฒ์ keyword์ keycount ๋ผ๋ ๋๊ฐ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
char *keyword[NKEYS];
int keycount[NKEYS];
์๋๋ฉด ๋ ๊ฐ์ ๋ฐฐ์ด ๋์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด ์ ์ธ
struct key{
char *word;
int count;
} keytab[NKEYS];
์๋ฏธ๋ฅผ ๋ณด๋ฉด key
๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์๋ก ๊ฐ๋ ๊ธธ์ด NKEYS
์ ๋ฐฐ์ด keytab
์ ๋ง๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค. ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
๋ฐฐ์ด์ ์ ์ธ์ด ๋ค์๊ณผ ๊ฐ์์์ ๋ ์ฌ๋ฆฌ๋ฉด ์๊ตฌ๊ฐ ๋ง๋ค.
๋ฐฐ์ด์์์๋ฐ์ดํฐํ์
๋ฐฐ์ด์์ด๋ฆ[๋ฐฐ์ด์ํฌ๊ธฐ]
๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ์ ์ธ๊ณผ ๋์์ ํ ๋น
struct key{
char *word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
};
์๋๋ฉด ์ข ๋ ์๊ฐ์ ์ผ๋ก ์ ๋ณด์ด๊ฒ ์ด๋ ๊ฒ ๊ตฌ์กฐ์ฒด ๋จ์๋ก ๋ฌถ์ ์๋ ์๋ค.
struct key{
char *word;
int count;
} keytab[] = {
{"auto", 0},
{"break", 0},
};
๋ณธ๊ฒฉ ํค์๋ ์ธ๋ ํ๋ก๊ทธ๋จ ์์ฑ
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
int getword(char *, int);
// ์ด ํจ์๋ ๋จ์ด๋ฅผ ์
๋ ฅ๋ฐ์ ๊ทธ ๋จ์ด๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ธ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค.
int binsearch(char *, struct key *, int);
// ์ด ํจ์๋ ๋ฐฐ์ด ๋ด ์์๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ ๋ ์ด์งํ์์ผ๋ก ์ค๊ฐ ๊ฐ์
// ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก, ํน์ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ๋๋ ๊ฐ๋ฉด์ ์ฃผ์ด์ง ๊ฐ์ ์ฐพ๋ ํจ์์ด๋ค.\
// ๊ฐ์ ์ฐพ์ผ๋ฉด ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๊ณ ์ฐพ์ง ๋ชปํ๋ฉด -1์ ๋ฆฌํดํ๋ค.
// O(logn)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
main(){
int n;
char word[MAXWORD];
while(getword(word,MAXWORD) != EOF)
// ์
๋ ฅ ๋ฐ์ ๋ฌธ์๊ฐ ๋ํ๊ธฐ ์ ๊น์ง word์ ์ ์ฅํ๋ค.
if(isalpha(word[0]))
// ์ฒซ ๋ฌธ์๊ฐ ์ํ๋ฒณ์ด๋ฉด
if((n=binsearch(word,keytab,NKEYS))>=0)
// ํด๋น ๋ฌธ์์ด์์ keytab์ word๋ฅผ ์ฐพ๊ณ , ์์ผ๋ฉด
keytab[n].count++;
// ํด๋น ํคํญ์ coutn ๋ฅผ ์ฆ๊ฐ ์ํจ๋ค.
for(n = 0; n < NKEYS; n++)
if(keytab[n].count > 0)
print("%4d %s\n", keytab[n].count, keytab[n].word);
// ์นด์ดํ
์ด ๋๋๋ฉด keytab ๋ฐฐ์ด์ ๊ตฌ์กฐ์ฒด๋ค์ ๋๋ฉฐ ์นด์ดํธ๊ฐ 0๋ณด๋ค ํฐ
// ๋
์๋ค์ ๋จ์ด์ ์นด์ดํธ๋ฅผ ํ๋ฆฐํ
ํด์ค๋ค.
return 0;
}
ํค์๋ ์๋ ๋ฐฐ์ด์ size(์ฉ๋)๋ฅผ ์์์ธ ๊ตฌ์กฐ์ฒด์ size(์ฉ๋)์ผ๋ก ๋๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๋ฅผ ํตํด define๋ฌธ์์ NKEYS ์ฆ ํค์๋์ ๊ฐ์๋ฅผ ์ ํ ์ ์๋ค.
#define NKEYS ((sizof keytab) / sizeof(struct key))
๋๋
#define NKEYS ((sizof keytab) / (sizeof keytab[0]))
6.4. Pointers to Structures
์ด๋ฒ์ ๋ฌธ์์ด C์ ํค์๋ ์ค ์ด๋ค ๊ฒ์ด ๋ช ๋ฒ ๋์๋์ง ์ธ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ฑํด๋ณด์. ๋จ ๋ฐฐ์ด์ ์ธ๋ฑ์ค ๋์ ํฌ์ธํฐ๋ฅผ ์ฐ๊ธฐ๋ก ํ๋ค. main
๊ณผ binsearch
๋ฅผ ์กฐ๊ธ ์์ ํ๋ค.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
int getword(char *, int);
struct key *binsearch(char *, struct key *, int);
// ์ด๋ฒ์ binsearch๊ฐ keyํ์ ๊ตฌ์กฐ์ฒด ๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
main(){
char word[MAXWORD];
struct key *p;
// keyํ์ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ ๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ p ์ ์ธ
while(getword(word,MAXWORD) != EOF)
if(isalpha(word[0]))
if((p=binsearch(word,keytab,NKEYS))!=NULL)
p->count++;
// ์ฌ๊ธฐ์ p๋ keytab[n]์ ํฌ์ธํฐ๋ก ์ฐ์๋ค.
for(p=keytab; p < keytab + NKEYS; p++)
if(p->count > 0)
print("%4d %s\n", p->count, p->word);
return 0;
}
6.5. Self-referential Structures
์ด๋ฒ์ ์ด๋ ํ ์ ๋ ฅ์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๋จ์ด์ ๋ฐ์ํ์๋ฅผ ์ ์ ์๋ ์ข ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํธ๋ ํจ์๋ฅผ ์์ฑํด๋ณด์. ๋จ์ด์ ๋ชฉ๋ก์ ๋ฏธ๋ฆฌ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์ ๋ ฌ์์ผ ์ด์งํ์์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ๋ํ ๋จ์ด๊ฐ ๋์ฌ ๋ ๋ง๋ค ๊ทธ ๋จ์ด๊ฐ ์ด๋ฏธ ๋ํ๋ฌ๋ ๊ฒ์ธ์ง๋ฅผ ์๊ธฐ ์ํด ๋ชจ๋ ๋จ์ด๋ฅผ ๋ค์ ธ๋ณผ ์๋ ์๋ค. ํ๋ก๊ทธ๋จ์ด ๋๋ฌด ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค(O(n2) ์ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค).
ํ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ก์ด ๋จ์ด๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ์ ๋นํ ์์น์ ๊ทธ ๋จ์ด๋ฅผ ๋ฃ์์ผ๋ก์จ ๋ค์ด์จ ๋จ์ด๋ค์ ํญ์ ์ ๋ ฌ์์ผ ๋๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ์ํด ์ด์งํธ๋ฆฌ(binary tree)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด๋ณธ๋ค.
ํธ๋ฆฌ๋ ์๋ก ๋ค๋ฅธ ๊ฐ ๋จ์ด๋ง๋ค ํ๋์ ๋ ธ๋(node)๋ฅผ ๊ฐ๋๋ฐ ๊ฐ ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ๋๋ค.
๋จ์ด์ ํฌ์ธํฐ
๋ฐ๊ฒฌ๋ ํ์
์ผ์ชฝ ์์๋ ธ๋์ ๋ํ ํฌ์ธํฐ
์ค๋ฅธ์ชฝ ์์๋ ธ๋์ ๋ํ ํฌ์ธํฐ
์ด๋ค ๋ ธ๋๋ 2๊ฐ๋ฅผ ๋๋ ์์๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ค. ์์๋ ธ๋๋ 0๊ณผ 1๋ก ํํ๋๋ค. ๊ฐ ๋ถ๋ฌด๋ ธ๋์ ์ผ์ชฝ ์์๋ ธ๋๋ ๋ถ๋ชจ๋ ธ๋๋ณด๋ค ์์ ๊ฐ์ ๊ฐ๋ ๋ ธ๋๋ง์ด ์๊ณ ์ค๋ฅธ์ชฝ ์์๋ ธ๋์๋ ๋ถ๋ชจ๋ ธ๋๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ๋ ๋ ธ๋๋ง ์ค๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ์ ๋น๊ต๋ ๋จ์ด์ ์ฌ์ ์ ์์๋ก ์ผ์๋ค(๋ค๋ฅธ ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๋น๊ตํ ๊ฐ์ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค).
"now is the time for all good men to come to the aid of their party"๋ผ๋ ๋ฌธ์ฅ์ผ๋ก๋ถํฐ ์ ๋ ฌ๋ ์ด์งํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ก์ด ๋จ์ด๊ฐ ๊ทธ ํธ๋ฆฌ์ ์๋ ์๋๋ฅผ ์๊ธฐ ์ํด์๋ ๊ฐ์ฅ ์์ ๋ ธ๋๋ถํฐ ์์ํ์ฌ ๊ทธ ๋ ธ๋์ ์ ์ฅ๋ ๊ฒ๊ณผ ์๋ก์ด ๋จ์ด๋ฅผ ๋น๊ตํ๋ค. ๋ ๋จ์ด๊ฐ ์ผ์นํ๋ฉด ๊ทธ ๋จ์ด๋ ํธ๋ฆฌ์ ์๋ ๊ฒ์ด๊ณ , ๋ง์ฝ ๊ทธ ๋จ์ด๊ฐ ๋ ธ๋์ ๋จ์ด๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ์์ ๋ ธ๋์ ๋น๊ตํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ๋น๊ตํ๋ค. ๋น๊ต๋ ๋ฐฉํฅ์ผ๋ก ๋ง๋ ๋จ์ด๊ฐ ์์ผ๋ฉด ์๋ก์ด ๋จ์ด๋ ํธ๋ฆฌ์ ์๋ ๊ฒ์ด๊ณ ์๋ก์ด ๋จ์ด๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ ๋นํ ๋น ๊ณต๊ฐ์ด ๋ง๋ จ๋๋ค. ์ด๋ฌํ ํ์์ ์ด๋ ํ ๋ ธ๋์ ์ผ์นํ์ง ์์ผ๋ฉด ๊ทธ ์์ ๋ ธ๋์ ๋ํด ๋๊ฐ์ ๊ณผ์ ์ ํ๊ฒ ๋๋ฏ๋ก recursiveํ ๊ณผ์ ์ด ๋๋ค. ๊ฐ ๋ ธ๋๋ฅผ ๋ค์ ์ดํด๋ณด๋ฉด ๋ค์ ๋ค ๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
struct tnode{
char *word;
int count;
struct tnode *left;
struct tnode *right;
}
์ด๋ ๊ฒ ๋ ธ๋๋ฅผ ์ํ์ ์ผ๋ก ์ ์ธํ๋๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์ด์ง๋ง, ์ฌ์ค ์๊ธฐ ์์ ์ ํฌํจํ๊ฒ ๋๋ ๊ฒ์ ์ค๋ฅ๊ฐ ๋ ํ ์ง๋ง tnode์ ํฌ์ธํฐ ๊ฐ์ ๊ฐ์ง๋ ๊ฒ์ด๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๋ค.
์ด์ ํ๋ก๊ทธ๋จ์๋ณด์
Binary tree generator
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
struct tnode *addtree(struct tnode *, char *);
// ๋ฃจํธ๋
ธ๋์ ํฌ์ธํฐ์ ๋ฌธ์๋ฐฐ์ด์ ๋ฐ์ ํธ๋ฆฌ์ ๋ฌธ์๋ฅผ ์ฝ์
ํ ํ ๋ค์ ํธ๋ฆฌ์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
void treeprint(struct tnode *);
// ๋
ธ๋์ ํฌ์ธํฐ๋ฅผ ๋ฐ์์ ํธ๋ฆฌ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ํจ์๋ค.
int getword(char *, int);
// ์ด ํจ์๋ ๋จ์ด๋ฅผ ์
๋ ฅ๋ฐ์ ๊ทธ ๋จ์ด๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ธ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค.
main(){
struct tnode *root;
char word[MAXWORD];
root = NULL;
while (getword(word,MAXWORD) != EOF)
if(isalpha(word[0]))
root = addtree(root,word);
treeprint(root);
return 0;
}
addtree
๋ฃจํด์ ์ํ์ ์ด๋ค. main์์ ์ฝ์ด ๋ค์ธ ํ ๋จ์ด๋ ํธ๋ฆฌ์ ๋งจ ์์ ๋์ธ๋ค. ๊ฐ ๋จ๊ณ๋ง๋ค ๊ทธ ๋จ์ด๋ ๊ทธ ๋
ธ๋์ ์๋ ๋จ์ด์ ๋น๊ต๋์ด์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ ์์๋
ธ๋๋ก ๊ฐ์ ํธ๋ฆฌ๋ฅผ ์ํ์ ์ผ๋ก ํธ์ถํ๊ฒ ๋๋ค.
๊ฒฐ๊ตญ ๊ทธ ๋จ์ด๋ ๊ทธ ํธ๋ฆฌ์ ์๋ ์ด๋ค ๋จ์ด์ ์ผ์นํด์ ์นด์ดํธ๋ฅผ ํ๋ ์ฆ๊ฐ์ํค๋ ์ง ๋๋ ์ผ์นํ์ง ์์์ nullํฌ์ธํฐ๋ฅผ ๋ง๋ ๊ทธ ๋ ธ๋๊ฐ ํธ๋ฆฌ์ ์ฒจ๊ฐ๋์ด์ผ ํจ์ ๋ํ๋ด๊ฒ ๋๋ค. ๋ง์ผ ์๋ก์ด ๋ ธ๋๊ฐ ๋ง๋ค์ด์ง๋ฉด addtree๋ ๊ทธ ๋ ธ๋์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฆฌํด์ํค๊ณ ๊ทธ ํฌ์ธํฐ๋ฅผ ํด๋น๋๋ ๋ฐ๋ก ์์ ๋ถ๋ชจ๋ ธ๋์ ๊ธฐ๋กํ๋ค.
addtree function
struct tnode *talloc(void);
char *strdup(char *);
// addtree : ๋จ์ด w์ ๋
ธ๋๋ฅผ p์ ํน์ p์ ๋ฐ์ ์ถ๊ฐ์ํค๋ ํจ์
struct tnode *addtree(struct tnode *p, char *w){
int cond;
if(p == NULL){
// p๊ฐ ์์ ๊ฒฝ์ฐ ์๋ก์ด ๋
ธ๋๋ฅผ ๋ง๋ ๋ค.
p = talloc();
p->word = strdup(w);
p->count = 1;
p->left = p->right = NULL;
}else if((cond = strcmp(w,p->word)) == 0){
// p๊ฐ ์๊ณ , ๋ ๋จ์ด๋ฅผ ๋น๊ตํ์ ๋ ์ ํํ ๊ฐ์ ๋จ์ด๋ผ๋ฉด ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
p->count++;
}else if(cond<0){
// ๋ ๊ฐ์ด ์์ ๋จ์ด๋ผ๋ฉด(์ฆ ์ฌ์ ์์ผ๋ก ์์ ์๋ ๋จ์ด๋ผ๋ฉด)
// ์ผ์ชฝ ์์๋
ธ๋๋ก ๊ฐ์ addtree๋ฅผ ๋ค์ ํ๋ค.
// ์ด ์์ ์ฌ๊ท์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์์น๋ฅผ ๋ง๋ ๋ ๊น์ง ๊ณ์ ๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ ์ ์๋ค.
p->left = addtree(p->left,w);
}else{
// ๋ฐ๋๋ก ๊ฐ์ด ๋ ํฌ๋ค๋ฉด ์ค๋ฅธ์กฑ ์์๋
ธ๋๋ก๊ฐ์ addtree๋ฅผ ํ๋ค.
p->right = addtree(p->right,w);
}
return p;
// ์ต์ข
์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๋
ธ๋(๊ฐ์ด ํฌ๊ฑฐ๋ ์์๋ค๋ฉด ์๋ก์ด ๋
ธ๋๊ฐ ์ฝ์
๋ ๋ถ๋ชจ๋
ธ๋)
// ์ ํฌ์ธํฐ p๋ฅผ ๋ฐํํ๋ค.
}
์๋ก์ด ๋
ธ๋์ ๋ํ ๊ธฐ์ต์ฅ์๋ ๋
ธ๋๋ฅผ ๊ธฐ์ตํ ์ ์๋ ์ ๋นํ ๊ธฐ์ต๊ณต๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฆฌํด์ํค๋ talloc์ด๋ผ๋ ํจ์์ ์ํด ๋ฐฐ๋น๋๋ค(์๋ง๋ struct tnode dummy, *p = &dummy; return p;
)์์ด ๋ ๊ฑฐ ๊ฐ๋ค).
strdup์ ์ํด ์๋ก์ด ๋จ์ด๋ ์จ๊ฒจ์ง ์ฅ์๋ก ๋ณต์ฌ๋๋ค. ์นด์ดํฐ๋ ์ด๊ธฐํ๋๊ณ ๋ ๊ฐ์ ์์๋ ธ๋๋ NULL๊ฐ์ ๊ฐ๊ฒ ๋๋ค. ์ด ๋ถ๋ถ์ ์์์ ๋ณผ์์๋ฏ ์๋ก์ด ๋ ธ๋๊ฐ ์ถ๊ฐ๋ ๋๋ง ์คํ๋๋ค.
treenode๋ ์ ๋ ฌ๋ ์์๋ก ํธ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฐ๊ฐ์ ๋ง๋์์ ๋จผ์ ์ผ์ชฝ ์์๋ ธ๋๋ฅผ ์ถ๋ ฅํ ํ ๊ทธ ๋จ์ด๋ฅผ ์ถ๋ ฅํ๊ณ ๋ค์์ ์ค๋ฅธ์ชฝ ์์๋ ธ๋๋ฅผ ์ถ๋ ฅํ๋ค.
treeprint
void treeprint(struct tnode *p){
if(p!=NULL){
treeprint(p->left);
printf("%4d %s\n", p->count, p->word);
treeprint(p->right);
}
}
talloc
struct tnode *talloc(void){
return (struct tnode *) malloc(sizeof(struct tnode));
}
strdup
char *strdup(char *s){
char *p;
p = (char *) malloc(strlen(s)+1);
if(p != NULL){
strcpy(p, s);
}
return p;
}
Last updated
Was this helpful?