• 검색 결과가 없습니다.

데이터 구조1 실습 (11주차)

N/A
N/A
Protected

Academic year: 2021

Share "데이터 구조1 실습 (11주차)"

Copied!
5
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

데이터 구조1 실습 (11주차)

2021. 5. 12

1. 다음 main() 함수를 고려하라. 단, 리스트는 배열로 표현된다.

#define MAX_LIST_SIZE 10

typedef struct { // 리스트 타입 정의

int array[MAX_LIST_SIZE];

int size; // 리스트에 포함된 항목 개수

} ArrayListType;

int main() {

ArrayListType list; // 리스트 생성 init(&list); // 리스트 초기화

insert_last(&list, 10); // 리스트 마지막에 항목 추가 insert_last(&list, 20);

insert_last(&list, 30);

print_list(list); // 리스트에 포함된 모든 항목 출력

delete(&list, 0); // 리스트의 array 인덱스 0의 위치한 항목 삭제 insert(&list, 1, 40); // 리스트의 인덱스 1의 위치에 항목 추가 insert(&list, 0, 50);

delete(&list, 1); // 리스트의 인덱스 1의 위치한 항목 삭제 print_list(list); // 리스트에 포함된 모든 항목 출력 return 0;

}

a. main()에 포함된 모든 리스트 연산 수행 후 리스트의 상태는 무엇인가? 리스트의 상태는 array와 size 로 표현된다.

b. 다음의 리스트 관련 함수를 작성하라. 또한, is_full(), is_empty() 함수를 포함시켜라.

int is_empty(ArrayListType list) // 리스트가 비어 있는지 검사 int is_full(ArrayListType list) // 리스트가 꽉 차 있는지 검사 insert_last(ArrayListType* list, int item) // 리스트 마지막에 항목 삽입 insert(ArrayListType* list, int pos, int item) // 리스트의 pos 위치에 항목 삽입 delete(ArrayListType* list, int pos) / 리스트의 pos 위치의 항목 삭제 print_list(ArrayListType list); // 리스트에 포함된 모든 항목 출력

(2)

c. main() 함수를 실행시켜라. 실행 결과와 a)에서의 리스트 상태와 비교하라.

// 소스 코드

#include <stdio.h>

#define MAX_LIST_SIZE 10

typedef struct { // 리스트 타입 정의

int array[MAX_LIST_SIZE];

int size; // 리스트에 포함된 항목 개수

} ArrayListType;

void init(ArrayListType* list); // 리스트 초기화

int is_empty(ArrayListType list); // 리스트가 비어 있는지 검사 int is_full(ArrayListType list); // 리스트가 꽉 차 있는지 검사

void insert_last(ArrayListType* list, int item); // 리스트 마지막에 항목 삽입 void insert(ArrayListType* list, int pos, int item); // 리스트의 pos 위치에 항목 삽입 void delete_list(ArrayListType* list, int pos); // 리스트의 pos 위치의 항목 삭제

void print_list(ArrayListType list); // 리스트에 포함된 모든 항목 출력

int main() {

ArrayListType list;

init(&list); // 리스트 초기화; size <- 0

insert_last(&list, 20); // 리스트 마지막에 항목 추가 insert_last(&list, 40);

insert_last(&list, 30);

delete_list(&list, 0); // 리스트의 인덱스 3의 위치한 항목 삭제 insert(&list, 1, 50); // 리스트의 인덱스 1의 위치에 항목 추가 insert(&list, 0, 10);

delete_list(&list, 2); // 리스트의 인덱스 3의 위치한 항목 삭제

print_list(list); // 리스트에 포함된 모든 항목 출력

return 0;

}

void init(ArrayListType* list) { // 리스트 초기화

list->size = 0;

}

int is_empty(ArrayListType list) {

(3)

int is_full(ArrayListType list) { // 리스트가 꽉 차 있는지 검사

// return list.size == MAX_LIST_SIZE;

if (list.size == MAX_LIST_SIZE) return 1;

else return 0;

}

void insert_last(ArrayListType* list, int item) { // 리스트 마지막에 항목 삽입

if (!is_full(*list)) {

list->array[list->size] = item; // 마지막에 항목 추가 list->size++; // size 필드 값 증가

} }

void insert(ArrayListType* list, int pos, int item) { // 리스트의 pos 위치에 항목 삽입

if (!is_full(*list) && pos >=0 && pos<= list->size) {

for (int i = list->size - 1; i >= pos; i--) { // 마지막 항목부터 pos 항목까지 한칸씩 뒤로 이동 list->array[i + 1] = list->array[i];

}

list->array[pos] = item; // pos 위치에 항목 추가 list->size++; // size 필드 값 증가

} }

void delete_list(ArrayListType* list, int pos) { // 리스트의 pos 위치의 항목 삭제

if (!is_empty(*list) && pos >= 0 && pos <= list->size-1) {

for (int i = pos+1; i < list->size; i++) { // pos 항목부터 마지막 항목까지 한칸씩 앞으로 이동 list->array[i - 1] = list->array[i];

}

list->size--; // size 필드 값 감소 }

}

void print_list(ArrayListType list) { // 리스트에 포함된 모든 항목 출력

for (int i = 0; i < list.size; i++) // 처음부터 마지막 항목까지 순차적으로 출력 printf("%d\n", list.array[i]);

}

(4)

2. 다음 main() 함수를 고려하라. 단, 리스트는 연결리스트로 표현된다.

typedef struct ListNode { // 리스트 노드 타입 정의 int data;

struct ListNode *link;

} ListNode;

int main() {

ListNode *list = NULL; // 리스트 초기화

list = insert_first(list, 10); // 리스트 첫 번째 항목으로 추가 list = insert_first(list, 20);

list = insert_first(list, 30);

print_list(list); // ① 리스트에 포함된 모든 항목 출력 list = delete_first(list); // 리스트의 첫번째 항목 삭제 list = insert_first(list, 40);

list = insert_first(list, 50);

list = delete_first(list);

print_list(list); // ② 리스트에 포함된 모든 항목 출력 // list->10->20->...

return 0;

}

a. 위 코드의 ① 지점에서의 리스트 상태를 그려라

b. 위 코드의 ② 지점에서의 리스트 상태를 그려라 list->40->20->10->NULL

c. 매개변수로 전달된 항목 item을 포함하는 노드를 생성하여 반환하는 get_node(int item)를 C 함수로 작성하라.

ListNode *get_node(int item) { ListNode *p;

p = (ListNode *)malloc(sizeof(ListNode)); // 노드 생성 p->data = 50; p->link = NULL; // 노드 초기화 return p;

}

d. insert_first(ListNode *list, int val)을 C 함수로 작성하라. 이 함수는 val의 항목을 포함하는 노드를 생 성하고, 이 노드를 list의 첫 번째 노드로 추가한 결과 리스트의 헤드 포인터를 반환한다. c)에서 작성 한 get_node()를 이용하라.

insert_first(ListNode *list, int val) { ListNode *p;

p = getNode(val); // 노드 생성 및 초기화

(5)

e. print_list(ListNode *list)를 C 함수로 작성하라. 이 함수는 리스트에 포함된 모든 노드를 순차적으로 방문하면서 노드에 포함된 항목을 출력한다.

void print_list(ListNode *list) { ListNode *p = list;

while(p != NULL) { print(p->data);

p = p->link;

} }

f. delete_first(ListNode *list)를 C 함수로 작성하라. 이 함수는 list의 첫 번째 노드를 삭제하고, 그 결과 리스트의 헤드 포인터를 반환한다.

g. main() 함수를 실행시키고, 각 지점에서의 리스트 출력을 a), b)에서 작성한 리스트 상태와 비교하라.

참조