본문 바로가기

비전공자를 위한 컴공 편입 전공면접/자료구조

2. 배열, 구조체, 포인터

본 카테고리에 게시되는 글은 제가 편입을 준비하며 정리한 자료들입니다.


참조한 서적은 다음과 같습니다.

1. C언어로 쉽게 풀어 쓴 자료구조. 천인국·공용해·하상호. 생능출판사

2. 윤성우의 열혈 자료구조. 윤성우. 오렌지미디어


학부 편입 면접을 위해 준비한 자료이기 때문에 지나치게 긴 코드 또는 너무 깊은 내용은 배제했습니다.


1. 배열

ㆍ 기본적인 배열에 관한 내용은 C언어 정리 참조. 여기서는 배열의 응용을 다룸.

(1) 배열의 응용 : 다항식(1)

ㆍ n차 방정식인 경우 n+1크기의 배열을 선언하고, 각각의 인덱스를 차수로 삼아 모든 차수에 대한 계수 값을 저장하는 방법.

ex)

 


ㆍ 다항식 구조체 polynomial

#define MAX_DEGREE 101 // 다항식이 가질 수 있는 최대 차수 100 + 1

typedef struct {

int degree; // 배열에 저장된 다항식의 최고 차수 (, 몇차식인지에 대한 정보)

float coef[MAX_DEGREE] // 계수가 저장될 배열

}polynominal;


ex) 

polynomial a = {5, {10, 0, 0, 0, 6, 3} };

 

장점 : 차수별로 저장되어 있으므로 덧셈, 뺄셈 알고리즘 구현이 간단함.

ㆍ단점 : 대부분의 항이 0인 희소 다항식의 경우 공간 낭비가 심함

ex) 101개의 공간중 2개만 사용


(2) 배열의 응용 : 다항식(2)

[계수, 차수]필드를 가지는 구조체 배열을 선언해, 0이 아닌 항들만 저장하는 방법.

ㆍ의미있는 항들만 저장하므로, 희소 다항식의 경우 공간을 절약할 수 있다.

    (, 희소 다항식이 아닌 경우 공간의 낭비가 오히려 심하다. 첫번째 방법은 계수값만 저장하는 방식인데 반해 두 번째 방법은 계수와 차수를 모두     저장하기 때문이다.)

ㆍ전역 변수로 선언한 후, 하나의 배열에 여러 개의 다항식을 저장해 사용할 수 있다.

    (, 다항식의 시작과 끝을 가리키는 변수를 관리해야 한다.)

ex) 구조체

#define MAX_TERMS 101

struct {

    float coef;

    int expon;

} terms[MAX_TERMS];


ex) 두 개의 다항식 저장


 

(3) 배열의 응용 : 희소 행렬(Sparse matrix)의 효율적인 저장 방법

ㆍ 희소 행렬 : 많은 항들이 0으로 되어 있는 행렬. 메모리 낭비가 심하고, 엄청난 크기의 희소 행렬인 경우 컴파일러에 따라 사용하지 못하는 경우도 있다.

ㆍ 행렬을 압축하여, 0이 아닌 요소만을 (, , )으로 표시할 수 있음. , [, , ]필드를 가진 구조체 배열을 선언해 효율적으로 저장 가능.


ㆍ 희소 행렬 구조체

하나의 요소를 나타내는 elemenet 구조체를 선언한 후 element 구조체형 배열을 선언한다.

1) 하나의 요소를 나타내는 element 구조체

 //값 필드를 가짐

typedef struct {

    int row;

    int col;

    int value;

} element;

 

2) SparseMatrix 구조체

ㆍ element 구조체 배열 필드(데이터 필드)를 가짐

    ex) element data[MAX_TERMS]

ㆍ rows, cols, terms 필드를 가짐(row, col 이랑 헷갈리지 말것!)

rows : 배열의 행 개수를 나타냄.

cols : 배열의 열 개수를 나타냄.

terms : 배열의 데이터 개수를 나타냄.

ㆍ typedef struct SparseMatrix {

element data[MAX_TERMS];

int rows;

int cols;

int terms;

    }SparseMatrix;


rows, cols, terms 필드 쓰는 이유 : 우리는 지금 압축된 행렬을 다루고 있다. 행렬은 그냥 더할 수 없다. ‘같은 크기의 행렬끼리만 더할 수 있다.’ , 행렬의 덧셈 이전에 행렬 크기 검사가 우선되어야 한다!! rows, cols는 행렬 크기 비교에 사용된다

 

2. 구조체

(1) 구조체

데이터 타입이 다른 데이터들의 모임

ㆍ구조체 대입(같은 구조체일 경우) : 구조체A = 구조체B 바로 대입 가능

구조체 비교 : 구조체 자체끼리 비교 불가. 구조체 항목끼리 비교해야 함

(2) 자기 참조 구조체

ㆍ구조체 멤버로 자기자신의 구조체를 가리키는 포인터를 가짐

ㆍ연결 리스트, 트리 등을 구성


ㆍ 자기참조 구조체 코드

typedef struct ListNode {

char data[10];

struct ListNode *link;

} ListNode;

 

3. 포인터

ㆍ 다른 변수의 주소를 가지는 변수

ㆍ 포인터 연산자

ㆍ 상세한 내용은 C언어 정리를 참조

&

변수의 주소값을 반환

*

포인터가 가리키는 변수의 내용을 반환

 

'비전공자를 위한 컴공 편입 전공면접 > 자료구조' 카테고리의 다른 글

4. 스택  (0) 2019.05.14
3. 리스트  (0) 2019.03.21
1. 자료구조와 알고리즘  (1) 2019.02.09