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?