[자료구조] 구조체와 범용리스트
구조체(structure type)
하나 이상의 변수를 그룹 지어서 새로운 자료형(복잡한 데이터 표현)을 정의하는 것
- 사용자 정의 자료형 - 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있음
- 배열은 같은 타입의 변수 집합이지만 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것
- 구조체의 구성 : 구조체의 멤버(member) / 멤버 변수(member variable)
구조체 정의와 선언
구조체 정의와 선언
형식
struct 구조체이름{
멤버변수1의 타입 멤버변수1의 이름;
멤버변수2의 타입 멤버변수2의 이름;
}
struct 구조체이름{
멤버변수1의 타입 멤버변수1의 이름;
멤버변수2의 타입 멤버변수2의 이름;
} 구조체 변수 이름; // 구조체 선언
구조체 멤버 접근
- 멤버 : 접근 연산자(.)를 사용하여 구조체에서 구조체 멤버로 접근할 수 있음
- 형식 : 구조체변수이름.멤버변수이름
구조체 변수 초기화
- 멤버 연산자(.)와 중괄호({})를 사용하여 구조체 변수를 초기화할 수 있음
- 형식 : 구조체변수이름 = {.멤버변수1이름 = 초기값, .멤버변수2이름 = 초기값, …};
typedef문
- 어떠한 자료형 이름에 대해 새 이름을 부여하는 목적으로 사용
- 이미 존재하는 int, float등과 같은 자료형을 사용자가 자유롭게 정의할 수 있음
- 구조체에 새로운 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됨
- 형식 : typedef struct 구조체 이름 구조체의 새로운 이름;
- e.g.) typedef struct student STD;
구조체의 구현 예
구조체의 정의, 선언, 초기화를 통한 멤버를 출력하는 프로그램
#include<stdio.h>
typedef struct{
char name[20];
int age;
int weight;
} STD;
int main(){
STD s1 = {"Hong gil dong", 30, 65};
STD s2 = {.name = "Lee sun sin", .age = 45, .weight = 60};
printf("첫 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n", s1.name, s1.age, s1.weight);
printf("두 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n", s2.name, s2.age, s2.weight);
return 0;
}
실행 결과
첫 번째 학생의 이름은 Hong gil dong이고, 나이는 30이며, 몸무게는 65입니다.
두 번째 학생의 이름은 Lee sun sin이고, 나이는 45이며, 몸무게는 60입니다.
범용 리스트(generalized list)
유한개의 순서가 있는 노드 또는 리스트들로 구성된 집합
- S = (x1, x2, x3, ……, xn)
- S = 리스트의 이름, n = 리스트의 길이, 원소 xi = 원자(노드) 또는 리스트
- 예
- A = (a, (b, c)) // 리스트의 길이 = 2
- S = ((a, b, c), d, (e, f), (), A)
- T = (A, A, A, A)
활용 예
- 다변수로 구성된 다항식의 표현 - A(x, y, z) = 4x3 + 3x2 + 2 + 5y + 7z3
- 희소행렬
- 특정 PC에서 특정 Web browser를 사용한 기록
- tab별 기록, jump한 기록
용어
- 공백리스트(empty list, 0, nil) => S = ()
- 부분리스트(sublist) => 임의의 주어진 리스트가 다른 리스트의 노드 또는 리스트
- 헤드(head)
- 임의의 주어진 리스트에서 첫 번째에 있는 리스트를 말함
- n ≥ 1인 경우 첫 번째 원소 = X1 <= head(S)
- 테일(tail)
- 임의의 주어진 리스트에서 첫 번째 원소를 제외한 나머지 원소를 말함
- 리스트 = (X2, … Xn) <= tail(S)
- 순환 리스트(recursive list)
- 임의의 주어진 리스트의 항목이 동일한 부분리스트인 경우를 말함
- C = (a, C) => 길이가 2인 순환리스트
- 두 번째 원소 C => 무한리스트 (a, (a, (a, …)에 대응
- 임의의 주어진 리스트의 항목이 동일한 부분리스트인 경우를 말함