C언어 - 동적 자료형, 연결리스트
-동적자료형의 특징
⇒ 프로그램의 실행 도중 필요에 따라 변수를 생성시키거나 소멸시킬 수 있다. 이것은 프로그램 실행시 한 번 선언된 변수는 함수의 실행이 종료될 때까지 지속되는 정적자료형과는 다른 개념이다.
⇒ 동적자료형의 변수는 정적자료형의 변수처럼 변수 자체가 이름을 갖는 것이 아니라 포인터 변수(참조변수)를 이용하여 간접적으로 접근한다. 이때 참조변수는 동적변수의 주소를 가지고 있다.
- 구조체 복습
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로 출력해 보았고 다음은 구조체 멤버를 이용하여 출력했고 마지막으로 반복문을 이용해 값의 변화를 출력했다.
[내장형]김동화_연결리스트 문제 풀이 보고서
#include"node.h"
#include<stdio.h>
int main()
{
NODE array[5];
NODE *head;
printf("-----------------------------\n");
array[0].iNum = 5;
array[0].next = 0; // NULL을 의미한다.
array[1].iNum = 1;
array[1].next = &array[3];
array[2].iNum = 4;
array[2].next = &array[0];
array[3].iNum = 2;
array[3].next = &array[4];
array[4].iNum = 3;
array[4].next = &array[2];
head = &array[1]; // head의 주소가 array[1]부터 시작한다.
while(head!=NULL)
{
printf("%d -> ", head -> iNum);
head = head -> next;
}
printf("NULL\n");
printf("-----------------------------\n");
head = array; // head의 주소가 array[0]부터 시작한다.
array[0].next = &array[2];
array[1].next = 0;
array[2].next = &array[4];
array[3].next = &array[1];
array[4].next = &array[3];
while(head!=NULL) // 0이 아닐때까지
{
printf("%d -> ", head -> iNum);
head = head -> next;
}
printf("NULL\n");
printf("-----------------------------\n");
return 0;
}
⇒ 출력 결과
'내장형 하드웨어 > C언어' 카테고리의 다른 글
C언어 - double linked list, malloc(), bcopy(), memcpy() (0) | 2011.07.13 |
---|---|
C언어 - 연결리스트2 (0) | 2011.07.11 |
C언어 - 구조체 크기 (0) | 2011.07.07 |
C언어 - 함수 포인터, 다중 포인터, 구조체 (0) | 2011.07.05 |
C언어 - 배열의 값과 주소 표시법, 함수 포인터 배열 (0) | 2011.07.04 |