c & c++
[C] 구조체, 구조체 배열, 연결 리스트
조밈밍
2022. 9. 16. 11:33
💡 구조체
: 다양한 정보를 저장하기 위해 필요에 따라 생성하는 자료형 == 사용자 정의 자료형/구조체
: 다양한 자료형을 그룹화하여 하나의 변수로 처리할 수 있게 만든 자료형
// 구조체 변수 선언 방법 case 1
struct myclass {
// 구조체 멤버 변수
int number;
double height;
double weight;
char *name;
}; // 구조체 정의
struct myclass a; // 구조체 변수 a 선언
struct myclass b;
// 구조체 멤버 변수에 접근 .이용
a.number = 10;
b.number = 20;
// 구조체 변수 선언 방법 case 2
// case 1과 case 2의 결과는 같음
struct myclass {
int number;
double height;
double weight;
char *name;
}a, b; // 구조체 정의와 동시에 변수 선언
: 구조체 초기화값 복사할 수 있다.
// 구조체 Point 정의
struct Point {
int x;
int y;
};
// 구조체 Rectangle 정의
struct Rectangle {
struct Point a;
struct Point b;
};
// 구조체 Rectangle 변수 rect 선언
struct Rectangle rect;
// rect 구조체 멤버 변수 초기화
rect.a.x = 1;
rect.a.y = 2;
rect.b.x = 3;
rect.b.y = 4;
: 해당 자료형의 포인터 변수를 선언하면, 해당 자료형의 주소 정보를 저장할 수 있는 메모리가 할당된다.
#include <stdio.h>
struct Point {
int x, y;
};
main() {
struct Point a; // 구조체 Point 자료형인 변수 a 선언
struct Point* b; // 구조체 Point 자료형인 포인터 변수 b 선언
b = &a; // 구조체 변수 a의 주소 값을 변수 b에 저장
a.x = 1; // 구조체 변수 a의 멤버 변수 x 초기화
a.y = 2; // 구조체 변수 a의 멤버 변수 y 초기화
printf("구조체 a점 x좌표는 %d, y좌표는 %d\n", a.x, a.y);
b->x = 3; // 구조체 포인터 변수를 참조 연산자(->)를 통해 멤버 변수 x 값 설정
b->y = 4;
printf("구조체 a점 x좌표는 %d, y좌표는 %d\n", a.x, a.y);
(*b).x = 5; // 구조체 포인터 변수를 역참조 연산자 (*)를 통해 멤버 변수 x 값 설정
(*b).y = 6;
printf("구조체 a점 x좌표는 %d, y좌표는 %d\n", a.x, a.y);
printf("구조체 a점 x좌표는 %d, y좌표는 %d\n", b->x, b->y);
printf("구조체 a점 x좌표는 %d, y좌표는 %d\n", (*b).x, (*b).y);
}
* (*b).x == a.x == b -> x 셋 다 같은 의미
❗ 프로그래밍/코딩
1. 정보를 저장하는 것
2. 저장된 정보를 목적에 맞게 가공하여 의미 있는 결과를 출력하는 것.
❗ 모든 포인터 변수는 주소를 저장할 수 있는 4바이트로 할당된다.
💡 구조체 배열
struct class a[10]; // 구조체 배열 선언
a[0].name = "John";
a[0].weight = 75;
a[0].height = 180;
a[1].name = "Can";
a[1].weight = 50;
a[1].height = 160;
...
❗ 두 번째 배열 항목이 빌 경우, 나머지 항목을 왼쪽으로 이동시켜야한다.
빈 방을 오른쪽 끝으로 몰지 않을 경우 새로운 데이터 추가 시 빈 방을 찾아야해서 번거롭다.
=> 연결 리스트로 해결
💡 연결 리스트
: 정보가 기차같이 0 -> 0 -> 0 -> 0 같은 형태로 줄줄이 연결되어 있는 리스트
: 자기 참조, 자기 참조 구조체 사용
☞ 자기 참조 : 자기 자신과 같이 생긴 것을 참조한다(가리킨다) -> 포인터를 통해 구현
☞ 자기 참조 구조체 : 자기 자신과 같은 형태의 구조체를 가리킬 수 있다.
: 다양한 자료형 + 자신과 같은 자료형을 가리키는 포인터 변수
struct abc {
int data; // 정수형 변수
struct abc *next; // 자기 참조를 위한 포인터 변수 선언
};
// typeof 키워드로 구조체 별명 짓기
typeof struct abc Type;
Type x;
Type y;
Type z;
struct abc x;
struct abc y;
struct abc z;
x.data = 10;
y.data = 20;
z.data = 30;
x.next = &y; // 흩어진 구조체 연결
y.next = &z;
z.next = &x;
// 구조체 y삭제
x.next = y.next; // x 구조체에 z 구조체 주소값 넣어줌
y.next = NULL;