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;