Transcript 11장 구조체
고급 C 프로그래밍
Chapter 11. 구조체
동적 기억장소 할당
주기억장치의 네 가지 영역
코드 영역
데이터 영역
스택 영역
힙 영역
동적 기억장소 할당의 필요성
동적 할당
malloc 함수 사용법
자료형 *포인터 변수명
포인터 변수명=(자료형 *) malloc(가억장소 크기);
malloc 함수 사용 예
int *ptr;
ptr=(int *) malloc(sizeof(int));
char *ch;
ch=(char*) malloc(512);
동적 할당 기억 장소 해제
free 함수 사용법
free(포인터 변수명);
free 함수 사용 예
free(ptr);
free(ch);
char 형 포인터와 동적 할당
학생 정보를 저장 할 구조체 배열
struct student_info{
char name[10];
int test[3];
double avg;
};
struct student_info stud[100];
이름이 9글자 이상이면?
char 형 포인터와 동적 할당 (2)
저장 장소를 필요한 만큼만 사용하는 방법
struct student_info{
char *name;
int test[3];
double avg;
} stud[100];
char temp[100];
for (i=0; i<100; i++){
gets(temp);
stud[i].name=(char *) malloc(strlen(temp)+1);
strcpy(stud[i].name, temp);
}
linked list
linked list : 구조체 변수(node)들을 포인터로 연결한 형
태의 저장 공간
각 저장 공간을 필요한 만큼만 동적으로 할당 받음.
마지막 node의 포인터는 NULL pointer이어야 함.
linked list 만들기
각 node를 만들기 위한 구조체 선언
struct node {
int value;
/* data stored in the node */
struct node *next;
/* pointer to the next node */
};
첫 번째 node를 가리킬 포인터 선언
struct node *first = NULL;
linked list 만들기 (2)
linked list를 만드는 법
동적 할당으로 빈 node 하나 만들기
생성된 node에 데이터 저장
새 node를 기존의 list에 link로 연결 하기
step 1) node 만들기
struct node *new_node;
new_node=(struct node*) malloc(sizeof(struct node));
새로운 node를 만들 때 사용 할 임시 포인터 정의
linked list 만들기 (3)
step 2) data 저장
new_node->value = 10;
step 3) link 연결
new_node->next = first;
first = new_node;
linked list 만들기 (4)
new_node =
malloc(sizeof(struct node));
new_node->value = 20;
new_node->next = first;
first = new_node;
linked list의 데이터 출력
표준 입력으로 10개의 정수를 받아 linked list를 만들어
저장 한다.
표준 입력으로 10개의 정수를 받아 linked list를 만들어
저장 한다. 단, 새로운 node를 list의 끝에 연결 한다.
list에 저장된 데이터를 순서대로 출력한다.
linked list 검색
linked list에서 특정한 데이터 값을 가지는 노드 찾기
for (p = first; p != NULL; p = p->next){
if (p->data==20){
…
}
}
linked list에서 node 삭제
linked list에서 특정 노드 삭제
삭제할 node 찾아내기
해당 node의 직전 node가 다음 node를 가리키도록 연결
해당 node를 free명령으로 삭제
삭제할 node와 직전 node를 가리킬 두 개의 pointer가
필요
linked list에서 node 삭제 (2)
linked list에서 node 삭제 예
먼저 cur = list, prev = NULL을 실행
linked list에서 node 삭제 (3)
다음 prev = cur, cur = cur->next 실행
linked list에서 node 삭제 (4)
prev = cur, cur = cur->next를 조건 (cur != NULL && cur>value != n)이 만족 되는 동안 반복 실행
linked list에서 node 삭제 (5)
prev->next = cur->next을 실행 하여 linked list를 다시
연결
free(cur)를 실행 하여, 데이터가 20인 node 삭제