58
Chapter 12 Structure and ADTs 프프프프프 프프프 프프

Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents Declaring Structures Accessing a Member Operator Precedence

Embed Size (px)

Citation preview

Page 1: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12

Structure and ADTs

프로그래밍 기초와 실습

Page 2: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 2

Contents

Declaring Structures

Accessing a Member

Operator Precedence and Associativity Structures, Functions, and Assignment

Problem Solving : Student Records

Initialization of Structures

The Use of typedef

Page 3: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 3

Self-Referential Structures Linear Linked Lists Dynamic Allocation List Operations

Contents

Page 4: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 4

Declaring Structures

Array 와 structure 의 차이점

– array

• Array 의 모든 element 는 같은 type 이여야 한다 .

• Index 를 사용하여 각 element 를 access 한다 .

– structure

• 다른 type 의 element 로 구성 될 수 있다 .

• 각 element 는 name 을 갖는다 .

• Name 에 의해 각 element 를 access 한다 .

Page 5: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 5

Declaring Structures

struct declaration– Collection of members(/elements)

[Ex] struct { /* 3 elements 로 구성된 structure */ int number; char name [20] ; int on_hand;} part1;

{ } 의 형태로 variable ‘part1’ 을 선언한다 .Part1 은 int, char array, int type 의

3 member 를 포함하는 struct type 의 variable

Page 6: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 6

Declaring Structures

structure tag

- 정의 되는 특정 structure 를 지정하기 위한 name.

- 한 번 structure tag 인 part 가 정의되면 , 이제 tag 를 사용하여 같은 structure type 으로 선언할 수 있다 .

[Ex] struct part { int number; char name [20] ; int on_hand;};

[Ex] struct part part1, part2 ; /* correct declaration */part part1, part2; /* wrong declaration */

struct tag:생략 가능하지만 생략 시

이 후에 선언 불 가능

Page 7: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 7

Declaring Structures

structure tag 와 변수 동시 선언가능– structure tag 를 이용하여 선언된 변수는 같은 structure

type[Ex] struct part {

int number; char name [20] ; int on_hand;} part1, part2;

struct part part3;

part1, part2, part3 는 모두 compatible

Page 8: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 8

Declaring Structures

Initializing Struct variables

[Ex] struct student { int number; char name [20] ; int score;

} part1 = {1, “handong”, 95}, part2;

part1

part1.number part1.name part1.score

1 handong 95

Page 9: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 9

Declaring Structures

Compatible structure– 같은 type 의 structure variable 이면 서로 assign 가능

– compatible types 의 조건• Structure 정의와 동시에 선언되는 모든 variables

• 같은 type 의 structure 즉 같은 tag 에 의해 선언된 모든 variables.

[Ex] part1 = part2; /* legal operation */

part2 의 모든 member 의 values들은 part1 의 각 member 로 copy 된다 .

[Ex] struct part { int number; char name [20] ; int on_hand;

} part1, part2;

[Ex] struct part part3, part4;

/* part1, part2

part3, part4 모두 compatible

types */

Page 10: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 10

Declaring Structures

Compatible structure

– compatible type 이 아닐 경우 =, ==, != 불가능

[Ex] struct { struct { int x, y; int x, y; } data1; } data2;

data1 = data2; /* illegal operation */

/* 같은 member 로 구성되어도 각 기 정의하여 선언 한다면 서로 다른 type 으로 not compatible */

Page 11: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 11

Declaring Structures

[Ex] struct { int a[10];} a1, a2; a1 = a2; /* legal */

int a1[10], int a2[10]={0}; a1=a2; /* illegal*/

[Ex] struct {struct { int number;

char name[20]; int on_hand;

} part1;

struct { int number;

char name[20]; int on_hand; } part2 ;

part1 and part2 are notcompatible

Page 12: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 12

Declaring Structures

[Ex] struct { int number; char name [20] ; int on_hand;

} part1;

Memory Allocation

– Structure 로 선언된 데이터 type 은 각 member 들이 메모리 내에 순차적으로 할당된다 .

– part1 의 base address 가 200 이고 , integer 의 size 가 4bytes 라고 가정하면 , 오른쪽 그림과 같이 메모리가 할당됨 .

200

204:

222

223

224

228

part1.number

part1.name[0]

part1.name[18]part1.name[19]part1.on_hand

Page 13: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 13

Accessing a Member struct member operator ‘.’

– Structure 의 각 member 를 access 하기 위해 ‘ .’ 를 사용한다 .[Ex] struct {

int number; char name[20]; int on_hand; } part1={1, “Monitor”, 10};

printf (“Part number : %d\n”, part1.number);printf (“Part name : %s\n”, part1.name);printf (“Quantity on hand : %d\n”, part1.on_hand);

part1

part1.number part1.name part1.on_hand

1 Monitor 10

Part number : 1Part name : MonitorQuantity on hand : 10

Page 14: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 14

Accessing a Member

member operation

[Ex] struct { int number; char name[20]; int on_hand; } part1;

scanf (“%d”, &part1.on_hand); /* reading using scanf() */scanf(“%s”, part1.name); part1.number = 258; /* assignment */part1.on_hand++; /* increment */

Page 15: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 15

Accessing a Member

structure pointer

[Ex] struct complex { double re; double im;

};

struct complex c1, c2, *a=&c1, *b=&c2; /* a 는 structure ‘c1’ 을 refer, b 는 ‘ c2’ 을 refer*/

a->re = b->re + 2 ; /* c1.re = c2.re + 2; 와 동일 */ b->im = a->im – 3; /* c2.im = c1.im – 3; 와 동일 */

printf (“value ; %f\n ”, a->im);

Page 16: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 16

Accessing a Member

[Ex] struct shape { int x, y ; char name[10] ;

};

struct shape s, *p = &s;scanf (“%d %d %s”, &p->x , &p->y, p->name ) ;

/* operator ‘->’ 는 ‘ &’ 를 우선한다 . &p->x &(p->x)*/

s.x = p->x * 2; /* p->x = s.x *2; 와 동일 */p->y = s.y % 5;

printf (“%d %d %s\n”, p->x , p->y, p->name ) ;

12 23 handong24 3 handong

Page 17: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 17

Accessing a Member

[Ex] struct shape { int x, y ; char name[10] ;

};

struct shape s, *p = &s;scanf (“%d %d %s”, &(*p).x , &(*p).y, (*p).name ) ;

/* operator ‘.’ 는 ‘ &’ 를 우선한다 . &p->x &(*p).x*/

s.x = (*p).x * 2; /* p->x = s.x *2; 와 동일 */(*p).y = s.y % 5;

printf (“%d %d %s\n”, (*p).x , (*p). y, (*p). name ) ;

12 23 handong24 3 handong

괄호를 생략할경우 ‘ .’ 가 우선선위가 높으므로p.y 를 먼저 수행 . p 는 pointer 이므로 error 발생

Page 18: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 18

Precedence and Associativity of Operators

( ) [ ] . -> ++(postfix) --(postfix) left to right

++(prefix) --(prefix) ! ~ sizeof(type)+(unary) -(unary) &(address) *(dereference)

right to left

* / % left to right

+ - left to right

<< >> left to right

< <= > >= left to right

== != left to right

& left to right

^ left to right

| left to right

&& left to right

|| left to right

? : right to left

= += -= *= /= %= >>= <<= &= ^= |= right to left

Page 19: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 19

Structures, Functions, and Assignment

Structures as Argument– call-by-value 로 struct 가 copy 되어 사용 된다 .

[Ex] struct card { int pips; char suit;}c1 = {5, ’d’};

: assign_values(c1);

printf(“%d %c”, c1.pips, c1.suit); :

void assign_values(struct card c) { c.pips = 1; c.suit = ‘c’;}

parameter 를 struct card c 로사용할 경우 struct 가 memory 에

복사하게 되므로 call-by-value 가 되어 return 후 변경된 값이 유지 되지 않는다 .

5 d

Page 20: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 20

Structures, Functions, and Assignment

Struct pointer 사용– call-by-reference 로 struct 의 address 를 전달한다 .

[Ex] struct card { int pips; char suit;}c1 = {5, ’d’};

: assign_values(&c1);

printf(“%d %c”, c1.pips, c1.suit); :

void assign_values(struct card *c) { c->pips = 1; c->suit = ‘c’;}

parameter 를 struct card *c 로사용할 경우 struct 의 address 가

전달되어 call-by-reference 가 되므로 return 후 변경된 값이 유지 된다 .

1 c

Page 21: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 21

Structure 사용

5

d 5

d

main() assign_values()

Structure 의 copy

X 1

X c

Structure Pointer사용

5

d

main()

Address 의 copy

같은 structure의 point X 1

X c

assign_values()

Structures, Functions, and Assignment

Call -by-Value Call -by-Reference

Page 22: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 22

Structures, Functions, and Assignment

Structures Pointer 사용[Ex] struct card {

int pips; char suit;

};

void assign_values(struct card *c_ptr, int p, char s) { c_ptr -> pips = p;

c_ptr -> suit = s; }

void extract_values(struct card *c_ptr, int *p_ptr, char *s_ptr) { *p_ptr = c_ptr -> pips; *s_ptr = c_ptr -> suit;

}

Page 23: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 23

Structures, Functions, and Assignment

[Ex] void prn_values(struct card *c_ptr) { int p; char s; char *suit_name; extract_values(c_ptr, &p, &s); switch(s) { case ‘c’ :

suit_name = “clubs”; break; case ‘d’ :

suit_name = “diamonds”; break; case ‘h’ :

suit_name = “hears”; break; case ‘s’ :

suit_name = “spades”; break; default :

suit_name = “error”; } printf(“card: %d of %s \n”, p, suit_name);}

Page 24: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 24

Structures, Functions, and Assignment

[Ex] int main(void) { int i; struct card deck[52];

for( i = 0; i < 13; i++) {assign_values(deck + i, i + 1, ‘c’ );assign_values(deck + i + 13, i + 1, ‘d’ );assign_values(deck + i + 26, i + 1, ‘h’ );assign_values(deck + i + 39, i + 1, ‘s’ );

}

for( i = 0; i < 13; i++) /* print out the hearts */prn_values(deck + i + 26);

return 0;}

card : 1 of heartscard : 2 of hearts :card : 13 of hearts

&deck[ i+13] 와 같은 표현으로struct 의 address 를 전달

Page 25: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 25

Problem Solving : Student Records

Nested Structure

[Ex] struct person_name { char first[10]; char middle_initial; char last[10];};

struct student { struct person_name name ; int id, age; char sex; } student1, student2;

student1

student1.name.middle_initial student1.id

student1.name.first

student1.name.laststudent1.age student1.sex

Page 26: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 26

Problem Solving : Student Records

Nested Structure– nested member name 으로 access 가능

– 정의된 member ‘name’ 으로 access 가능

[Ex] strcpy ( student1.name.first, “Fred”) ;strcpy ( student1.name.last, “Gordon”) ;

[Ex]display_name ( student1.name); /* 하나의 argument 로 사용 가능 */

struct person_name new_name={“Young”,’s’, “Kim”} ;student1.name = new_name ; /* 같은 struct 로 assignment 가능 */

Page 27: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 27

Problem Solving : Student Records

[Ex]

void display_name ( struct person_name name) { printf(“name : %s %c. %s\n”,

name.first, name.middle_initial, name.last);}

void display(struct student s) {printf(“id : %d\n”, s.id);display_name(s.name);printf(“age : %d\n”, s.age);printf(“gender : %c”, s.gender);

}

Page 28: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 28

Problem Solving : Student Records

Arrays of Structure[Ex] struct part int number; char name[10]; int on_hand; } inventory[100];

inventory[0]

inventory[0].number inventory[0].on_hand

1 Monitor 10

inventory[1]

inventory[1].number inventory[1].on_hand

5 Memory 53 ………

inventory[0].name

inventory[1].name

Page 29: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 29

Problem Solving : Student Records

[Ex] #define CLASS_SIZE 50#define NCOURSES 10

struct student { char *last_name; int student_id;

char grade;};

struct date { short day; char month[10]; short year;};

struct personal { char name[20]; struct date birthday;};

Page 30: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 30

Problem Solving : Student Records

struct student_data { struct personal p; int student_id; char grade[NCOURSES];};

[Ex] /* struct date type 의 variable 에 data 를 입력받음 */

void read_date(struct date *d) { printf(“Enter day(int) month(string) year(int) : “); scanf(“%hd%s%hd”, &d->day, d->month, &d->year);}

:struct student_data temp;read_date(&temp.p.birthday);

struct personalstruct date

&(d->day) 와 같은 표현

Page 31: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 31

Problem Solving : Student Records

[Ex] /* student_data type 의 member 중 char[ ] grade 를 입력받음 */

void read_grades(char g[ ]) { int i; printf(“Enter %d grades: “, NCOURSES); for( i = 0; i < NCOURSES; ++i)

scanf(“ %c”, &g[ i]);}

:

read_grades(temp.grade);

char[ ] type:array name 은 array 의 base address 를

나타내는 char pointer 로call-by-reference 가 된다 .

Page 32: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 32

Problem Solving : Student Records

[Ex] /* struct student_data type variable 의 information 을 struct student 의 variable 에 convert */

#define C_PROGRAMMING 0#define UNIX 1

void extract (struct student_data *s_data, int n, struct student *undergrad) {

undergrad -> student_id = s_data -> student_id; undergrad -> last_name = s_data -> p.name; undergrad -> grade = s_data -> grade[n];}

: struct student_data temp;

struct student student[100];extract(&temp, C_PROGRAMMING, &student[0]);

Page 33: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 33

Initialization of Structures

Initializing an array of Structures

[Ex] struct dialing_code { char *country; int code;

} ;

const struct dialing_code country_codes[ ] = { {“Argentina”, 54},

{“Bangladesh”, 880}, {“Korea”, 82},

: } ;

Array size 는 compiler 에 의해 자동 삽입

Page 34: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 34

Initialization of Structures

Initializing a nested Structures

struct student st = { {"Kim", 's', "Handong"}, 197001, 25, 'T'

};

Array size 는 compiler 에 의해 자동 삽입

[Ex] struct person_name { char first[10]; char middle_initial; char last[10];};

struct student { struct person_name name ; int id

int age; char sex; };

Page 35: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 35

The Use of typedef

The use of typedef– data type 의 name 을 재 정의 하기 위해 사용– readability 의 증가

[Ex] #define N 3 /* size of all vectors and matrices */

typedef double scalar;typedef scalar vector[N];typedef scalar matrix[N][N];

typedef vector maxrix[N]와 같은 표현

double 의 1 차원 array type 의 vector 선언

[Ex] void add(vector x, vector y, vector z) { int i; for( i = 0 ; i < N; ++i)

x[ i ] = y [ i ] + z [ i ];}

Page 36: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 36

The Use of typedef

[Ex] scalar dot_product(vector x, vector y) { int i; scalar sum = 0.0;

for(i = 0; i < N; ++i) sum += x[ i] * y [ i];

return sum;}

void multiply(matrix a, matrix b, matrix c) { int i, j, k;

for(i = 0; i < N; ++i) for(j = 0; j< N; ++j ) { a[ i][ j] = 0.0; for( k = 0; k < N; ++k) a[ i][ j] += b[ i][ k] * c[ k][ j];}

}

double sum=0.0; 과 동일

double a[N][N] 과 동일

Page 37: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 37

typedef 를 사용 , struct type 을 새로운 type 으로 선언[Ex] typedef struct {

int number; char name[20]; int on_hand;

} part;

part part1, part2

The Use of typedef

새로운 type part 가 정의

[Ex] struct part { int number; char name[20]; int on_hand;

};

typedef struct part part;

새로운 type part 가 정의

Page 38: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 38

The Use of typedef

[Ex] typedef struct part part;

struct part p1;part *p2 = &p1;

:display1(&p1);display2(&p1);

display1(p2);display2(p2);

void display1 (struct part* p) { printf(“%d, %s, %d”, p->number, p->name, p->on_hand);}

void display2 (part* p) { printf(“%d, %s, %d”, p->number, p->name, p->on_hand);}

Page 39: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 39

Self-Referential Structures– struct member 중에 같은 struct type 을 reference

하는 pointer 를 가지고 있음

– compatible, 즉 같은 type 의 structure 를 link 하기 위해 사용

[Ex] struct list { int data; struct list *next;

}

Self-Referential Structures

next 를 통해서 같은 type 의 다른 structure 와 연속적으로 link 됨

data next

Page 40: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 40

[Ex] struct list a, b, c;

a.data = 1;b.data = 2;c.data = 3;a.next = b.next = c.next = NULL; /* Point nothing */

Self-Referential Structures

NULL1

a

NULL2

b

NULL3

c

data next data next data next

Page 41: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 41

[Ex] a.next = &b;

b.next = &c;

printf(“%d\n”, a.next -> data); /* b.data */

printf(“%d\n”, a.next -> next -> data ); /* c.data */

Self-Referential Structures

1

a

2

b

NULL3

c

data next data next data next

2 3

Page 42: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 42

Linear Linked List– 여러 개의 structure 가 연속적으로 link

– structure 는 data part 와 address part 로 구성된다 .

– Address part 는 같은 type 의 structure 를 point 하는 member 로 구성된다 .

– head 는 첫번째 Element 를 point

– 각각의 Element 는 다음의 Element 를 point

– 마지막 Element 의 address part 는 NULL

– Element 는 dynamic allocation 에 의해 생성된다 .

Linear Linked Lists

NULL

headdata data dataaddres

saddres

saddres

s

Page 43: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 43

Linear Linked Lists

[Ex] /* filename : list.h */

#include <stdio.h>

typedef char DATA;

struct linked_list { DATA d; struct linked_list *next;}

typedef struct linked_list ELEMENT; typedef ELEMENT * LINK;

stdio.h 에서 NULL 을 define

linked list 를 구현하기 위한type 을 정의하고 있는head file ‘list.h’ 작성

Page 44: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 44

Dynamic Allocation

Creates Element list

Linear Linked Lists

[Ex] LINK head;head = (LINK)malloc(sizeof(ELEMENT));/* head 는 할당된 ELEMENT type 의 struct 를 point */

system 으로부터 ELEMENT type 의 struct 를 저장하기 위한 memory 할당

[Ex] LINK head;head = (LINK)malloc(sizeof(ELEMENT));

head -> d = ‘n’; /* data part 에 data 입력 */head -> next = NULL; /* address part 를 초기화 */

‘n’ NULL

head

Page 45: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 45

Linear Linked Lists

[Ex] head -> next =(LINK) malloc(sizeof(ELEMENT));head -> next -> d = ‘e’;head -> next -> next = NULL;

‘n’

head

‘e’ NULL

[Ex] head -> next -> next = (LINK)malloc(sizeof(ELEMENT));head -> next -> next -> d = ‘w’;head -> next -> next -> next = NULL;

‘e’

head

‘w’ NULL‘n’

New element 의 생성 및 list 에 추가

Page 46: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 46

List Operations

[Ex] /* List creation by recursion */

#include “list.h”

LINK string_to_list(char s[ ]) { LINK head;

if(s[ 0] == ‘\0’) /* base case */return NULL;

else {head = (LINK)malloc(sizeof(ELEMENT));head -> d = s [0];head -> next = string_to_list[s+1];return head;

}}

다음 Element 의 address 또는NULL 을 return

String(‘s’) 을 입력 받아char 를 data 로 하는

linked list 를 생성하는 function

Page 47: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 47

List Operations[Ex] /* List creation by iteration */

#include “list.h”

LINK string_to_list(char s[ ]) { LINK head, temp; int i=0;

if(s[ 0] == ‘\0’) return NULL;

head = (LINK)malloc(sizeof(ELEMENT)); head -> d = s[ 0]; head -> next = NULL; temp = head;

while(s[++i] != ‘\0’) {temp -> next = (LINK)malloc(sizeof(ELEMENT));temp = temp -> next;temp -> d = s [ i];temp -> next = NULL;

} return head;}

String 을 입력 받아char 를 data 로 하는

linked list 를 생성하는 function

Page 48: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 48

Counting

Counting and Lookup

[Ex] /* count the elements in a list recursively */

#include “list.h”

int count(LINK head) {

if(head == NULL) /* base case */return 0;

elsereturn ( 1 + count(head->next) );

}

Page 49: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 49

Counting and Lookup

[Ex] /* count the elements in a list by iteration */

#include “list.h”

int count(LINK head) {

LINK temp = head; int cnt = 0; while(temp != NULL) {

cnt++; temp = temp -> next } return cnt;}

Page 50: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 50

Lookup

Counting and Lookup

[Ex] /* Lookup c in the list pointed to by head (recursion)*/

#include “list.h”

LINK lookup(DATA c, LINK head) {

if(head == NULL) /* 없는 경우 */return NULL;

else if( c == head -> d) /* 찾은 경우 */ return head;

else /* 그 다음 element 의 search */return (lookup(c, head-> next));

}

Page 51: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 51

Counting and Lookup

[Ex] /* Lookup c in the list pointed to by head (iteration)*/

#include “list.h”

LINK lookup(DATA c, LINK head) {

LINK temp = head;

while(temp != NULL) {if( c == temp -> d) return temp;temp = temp -> next;

} return NULL;}

Page 52: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 52

Insertion

– before insertion

– after insertion

Insertion and Deletion

[Ex] #include “list.h”void insert(LINK p1, LINK q) { /* p1 뒤에 q 를 insert */ q -> next = p1 -> next; p1 -> next = q;}

B NULL

p1C NULLA

q

B

p1C NULLA

q

Page 53: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 53

Deletion

– before deletion

– after deletion

Insertion and Deletion

[Ex] #include “list.h”void delete(LINK p1, LINK q) { /* p1 뒤의 q 를 delete */ p1 -> next = q -> next; free(q);}

Bp1

C NULLA

q

Bp1

C NULLA

q

System 이 memory 를 사용할 수 있도록 q 가 reference 하는 부분을 해제시킴

즉 그 영역은 다시 free 가 되어 다른 program 에서 그 영역의 사용 가능

free

Page 54: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 54

Insertion and Deletion

[Ex] /* Recursive deletion of a list */

#include “list.h”

void delete_list(LINK head) {

if(head != NULL) {delete_list(head -> next);free(head);

}} List 의 모든 element 삭제

Page 55: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 55

Insertion and Deletion

[Ex] /* Iterative deletion of a list */

#include “list.h”

void delete_list(LINK head) {

LINK temp;

if(head != NULL) {temp = head;head = head -> next;free(temp);

}}

List 의 모든 element 삭제

Page 56: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 56

Displaying list

[Ex] /* Display all elements in a list */

#include “list.h”

void display(LINK head) {

LINK temp = head;

while(temp != null) {printf(“ELEMENT (at %p)”, temp);

printf(“\tDATA : %c”, temp -> d);printf(“\tnext : %p\n”, temp -> nexttemp = temp -> next;

}}

List 의 모든 element 를 출력

Page 57: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

Chapter 12 Structure and ADTs 57

[Ex] /* Sample main( ) */

#include “list.h”

LINK string_to_list(char[ ] s);void display(LINK head);

:

int main(void) {

char s[10] = "Handong"; LINK head;

head = string_to_list(s); display(head);}

ELEMENT (at 20a78) DATA : H next : 20a88ELEMENT (at 20a88) DATA : a next : 20a98ELEMENT (at 20a98) DATA : n next : 20aa8ELEMENT (at 20aa8) DATA : d next : 20ab8ELEMENT (at 20ab8) DATA : o next : 20ac8ELEMENT (at 20ac8) DATA : n next : 20ad8ELEMENT (at 20ad8) DATA : g next : 0

string 으로 linked list 를 생성하고list 의 모든 element 를

출력하는 program

Displaying list

Page 58: Chapter 12 Structure and ADTs 프로그래밍 기초와 실습. Chapter 12 Structure and ADTs 2 Contents  Declaring Structures  Accessing a Member  Operator Precedence

수고하셨습니다 .

Structure and ADTs