강좌 & 팁
-동적자료형의 특징
⇒ 프로그램의 실행 도중 필요에 따라 변수를 생성시키거나 소멸시킬 수 있다. 이것은 프로그램 실행시 한 번 선언된 변수는 함수의 실행이 종료될 때까지 지속되는 정적자료형과는 다른 개념이다.
⇒ 동적자료형의 변수는 정적자료형의 변수처럼 변수 자체가 이름을 갖는 것이 아니라 포인터 변수(참조변수)를 이용하여 간접적으로 접근한다. 이때 참조변수는 동적변수의 주소를 가지고 있다.
- 구조체 복습
struct _node
{
int iNum;
};
⇒ _node는 tag이며 type이 아닌 이유는 변수명 앞에 혼자 쓸수가 없기 때문이다.
(C++에서는 가능하다.)
⇒ 위의 구조체에서 type은 struct _node이다.
typedef struct _node NODE;
⇒ NODE가 type이 된다.
⇒ 그리고 아래와 같이 풀어 쓴다.
typedef struct _node
{
int iNum;
}NODE;
⇒ 위 구조체에서 연결리스트를 위해
typedef struct _node
{
int iNum;
struct _node *next;
}NODE;
를 추가한다.
⇒ struct _node *next;(자기참조 구조체)
- 연결리스트의 구조
⇒ 연결리스트는 구조체를 이용하여 만든다. 연결 리스트는 구조체 내에 다른 구조체를 가리키는 포인터를 가짐으로서 만들 수 있다.
#include<stdio.h>
/*struct _node
{
int iNum;
};
*/
typedef struct _node
{
int iNum;
struct _node *next;
}NODE;
int main()
{
NODE one;
NODE two;
NODE three;
NODE *P;
one.iNum = 1;
two.iNum = 2;
three.iNum = 3;
printf("-------------------\n");
printf("one.iNum = %d\n", one.iNum);
printf("two.iNum = %d\n", two.iNum);
printf("three.iNum = %d\n", three.iNum);
printf("-------------------\n");
one.next = &two;
two.next = &three;
three.next = NULL;
P=&one;
printf("%d -> ", P -> iNum); // 포인터를 이용한 출력
P=P->next;
printf("%d -> ", P -> iNum);
P=P->next;
printf("%d -> ", P -> iNum);
printf("NULL\n");
printf("-------------------\n");
printf("%d -> ", one.iNum); // 구조체 출력
printf("%d -> ", one.next->iNum);
printf("%d -> ", one.next->next->iNum);
printf("NULL\n");
printf("-------------------\n");
P=&one;
while(1) // 반복문 이용 1
{
printf("%d -> ", P -> iNum);
P=P->next;
if(P==NULL)
{
break;
}
}
printf("NULL\n");
printf("-------------------\n");
for(P=&one;P!=NULL;P=P->next) // 반복문 이용 2
{
printf("%d -> ", P -> iNum);
}
printf("NULL\n");
printf("-------------------\n");
return 0;
}
⇒ 처음에는 포인터를 이용하여 1 -> 2 -> 3 -> NULL로 출력해 보았고 다음은 구조체 멤버를 이용하여 출력했고 마지막으로 반복문을 이용해 값의 변화를 출력했다.