배열
첨자(index)와 값(value)의 쌍들의 집합.
int list[5];
int *plist[5];
list[0]의 주소 = a라고 가정
list[1]의 주소 = a + sizeof(int)
배열을 인자로 전달 시 배열의 시작주소가 복사됨. (Call by reference)
배열의 동적 할당.
int *A = (int*) malloc(sizeof(int)*100);
int *B = (int*) calloc(100,sizeof(int));
같은 동적할당이지만 malloc은 쓰레기값이 들어있고 calloc은 0으로 초기화된다
A = (int*) realloc(A,sizeof(int)*200);
용량을 늘리고싶어 재할당을 했다.
이때 메모리상에 원래크기의 배열A 뒷부분에 공간이 없다면..?
새로 할당할 크기만큼의 자리를 찾아 그 공간으로 배열을 모두 복사해서 넘겨야 한다.
이 과정에서 시간이 많이 걸릴 수 있으니 웬만하면 처음부터 넉넉하게 할당받자.
이차원배열의 경우(A[10][20])
int **A=(int**) malloc(블라블라)
우선 주소를 저장할 10칸짜리 배열이 먼저 만들어지고..
각각의 칸에 각각 20칸짜리 배열의 주소가 적혀져있게된다
구조체
배열이 한 가지 자료형의 모음이었다면 구조체는 다양한 자료형을 포함함.
struct humanBeing{
char name[10];
int age;
double salary;
};
typedef struct humanBeing human_being;
구조체 A, B가 있다고 하자
B에다가 A의 내용을 그대로 넣고싶은데
B=A;를 했을때 동작할까?
동작 한다.
구조체는 통째로 복사가 된다.
구조체를 인자로 받는 함수 작성 시
예를들어 f(human_being A, human_being B)라는 함수가 있다고 하자.
이 때 구조체A, B가 각각 복사되어 전달되기 때문에 메모리낭비가 생긴다.
구조체를 인자로 받을 때는 주소를 전달하는 것이 효과적이다.
구조체 비교시
A와 B의 모든 속성들이 같은지 비교하고싶을 때
if(A==B)이런건 안되니까 주의하자.
그 대신 memcmp라는 함수를 사용하면 된다.
memcmp(&A,&B,sizeof(human_being));
자기 참조 구조체: 구조체의 속성 중 하나가 스스로를 가리키는 구조체.
struct list{
char data;
struct list *link;
};
대략 이런 모양새.
연결 리스트 구현 할 때 많이 사용된다.
Union
union의 필드들은 메모리를 공유한다.
멤버변수 중 가장 메모리 할당량이 큰 변수 만큼의 메모리공간만 할당한다
struct human{
enum {female,male} gender;
union{
int children;
int beard;}u;
};
이걸로 예를 들면..
보통의 경우 female은 childeren과 관련있고 male은 beard와 관련있기 때문에,
한 사람이 children,beard 둘 다 값을 가질 필요는 없다.
이런경우에 사용하면 알맞을 것 같다..
근데.. 어라라
children에도 값을 넣고 beard에도 값을 넣으면..?어떻게되는겨?
값이 덮어씌워지고 사라진대나 뭐래나
C언어에서 union필드들이 적절하게 사용됐는지 검사해주지 않기때문에 주의를 해야한다.
순서 리스트
데이터들의 순서가 유지되는 집합이다.
예를 들면 한 주의 요일들(월화수목금토일) 뭐 이런게 있겠다.
순서리스트는 배열에 저장하면..편할것같네.
어라라?
그러고보니 순서리스트vs연결리스트 비교가 하고싶어진다.
리스트에서 i번째 데이터를 검색, 대체하는건 뭐가 빠를까?
배열로 쓰면 A[i]=8; 뭐 이런식으로 단번에 바꿀 수 있겠지만
연결리스트의 경우 i번만큼 p->next로 이동해야해서 정말 힘들것같다.
그렇다면, 리스트에서 i번째 위치에 새로운 데이터를 추가하는 경우는 어떨까?
배열은.. i번째 리스트에 값을 추가하면 그 뒤에있던 데이터가 싹 다 한칸씩 밀리면서.. 뒤에있는걸 다 수정해야한다
연결리스트의 경우 주소 연결만 시켜주면 되기 때문에 단번에 가능하다
'2022-2 > 자료구조' 카테고리의 다른 글
2장 - 희소 행렬(Sparse Matrix)의 표현 (1) | 2022.09.25 |
---|---|
2장 - 다항식의 덧셈 구현하기 (1) | 2022.09.25 |
마방진 그리기(홀수형) (0) | 2022.09.18 |
시간복잡도 (big - O,big - Omega,big - Theta) 표기법 (0) | 2022.09.17 |
선택정렬, 이진탐색, 순열 (0) | 2022.09.14 |
댓글