-동적자료형의 특징

⇒ 프로그램의 실행 도중 필요에 따라 변수를 생성시키거나 소멸시킬 수 있다. 이것은 프로그램 실행시 한 번 선언된 변수는 함수의 실행이 종료될 때까지 지속되는 정적자료형과는 다른 개념이다.

⇒ 동적자료형의 변수는 정적자료형의 변수처럼 변수 자체가 이름을 갖는 것이 아니라 포인터 변수(참조변수)를 이용하여 간접적으로 접근한다. 이때 참조변수는 동적변수의 주소를 가지고 있다.


- 구조체 복습

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로 출력해 보았고 다음은 구조체 멤버를 이용하여 출력했고 마지막으로 반복문을 이용해 값의 변화를 출력했다.