본문 바로가기

C 언어/임베디드 C

연결리스트


Linked List


#include <stdio.h>

/*struct _node
{
  int iNum;
};  //1번

typedef struct _node{} NODE;*/
  //2번

typedef struct _node
{
  int iNum;
  struct _node *next;
}NODE;  //1번+2번(이렇게 쓰는 구조체가 편리)

int main()
{
  NODE one;
  NODE two;
  NODE three;
  NODE *p;
  //초기값
  one.iNum = 1;
  two.iNum = 2;
  three.iNum = 3;
  //값출력
  printf("one.iNum = %d\n", one.iNum);
  printf("two.iNum = %d\n", two.iNum);
  printf("three.iNum = %d\n", three.iNum);
  //각주소를 next에 저장
  one.next = &two;
  two.next = &three;
  three.next = '\0';
  //각각 저장값 표현
  p = &one;
  printf("%d -> ", p -> iNum);

  p = p -> next;
  printf("%d -> ", p -> iNum);
  
  p = p -> next;
  printf("%d -> ", p -> iNum);
  printf("NULL\n");
  //멤버가 갈 수록 길어져서 좋지 않다
  printf("%d -> ", one.iNum);
  printf("%d -> ", one.next -> iNum);
  printf("%d -> ", one.next -> next -> iNum);
  printf("NULL\n");
  //다수면 for문 쓰는게 최고
  for(p = &one; p != NULL; p = p->next)
  {
    printf("%d -> ", p -> iNum);
  }  
  printf("NULL\n");
  
  return 0;
}



결과는 같지만 for문을 이용하는 방법이 가장 효율적이다.



위에 입력한 NODE구조체를 node.h 따로 저장
#ifndef __NODE_H__
#define __NODE_H__

typedef struct _node
{
  int iNum;
  struct _node *next;  
}NODE;

#endif //이 endif는 __NODE_H__

자기 참조 구조체란 자기 자신의 구조체를 가리키는 포인터를 멤버로 하는 구조체를 말한다.


#include "node.h"
#include <stdio.h>

int main()
{
  NODE array[5];
  NODE *head;
  
  array[0].iNum = 5;
  array[0].next = &array[1];
  
  array[1].iNum = 1;
  array[1].next = &array[2];
  
  array[2].iNum = 4;
  array[2].next = &array[3];
  
  array[3].iNum = 2;
  array[3].next = &array[4];

  array[4].iNum = 3;
  array[4].next = 0;
  
  head = array;
    
  while(head != 0)
  {
    printf("%d -> ", head -> iNum);
    head = head -> next;
  }
  printf("NULL\n");
  return 0;
}

결과

5 -> 1 -> 4 -> 2 -> 3 -> NULL

이것을 순서를 맘대로 바꿀 수도 있다.

예를 들어 1 -> 2 -> 3 -> 4 -> 5 -> NULL 하려면,

#include "node.h"
#include <stdio.h>

int main()
{
  NODE array[5];
  NODE *head;
  
  array[0].iNum = 5;  //0번에 5값이 있다
  array[0].next = 0;  //마지막은 널
  
  array[1].iNum = 1;  //처음에 1값
  array[1].next = &array[3];  //3번주소로
  
  array[2].iNum = 4;  //2번에 4값이 있다
  array[2].next = &array[0];  //0번주소로
  
  array[3].iNum = 2;  //3번에 2값이 있다
  array[3].next = &array[4];  //4번주소로

  array[4].iNum = 3;  //4번에 3값이 있다
  array[4].next = &array[2];  //2번주소로
  
  //head = array;
  head = &array[1];  //1번주소에 1이 있으니 1번주소로..
    
  while(head != 0)
  {
    printf("%d -> ", head -> iNum);
    head = head -> next;
  }
  printf("NULL\n");
  return 0;
}

&array[]을 다음 값을 보고 바꿔주면 된다.

반대로 5 -> 4 -> 3 -> 2 -> 1-> NULL도  위 처럼 값을 보고 주소설정을 해주고
head = &array[1];을
0번주소에 5값이 있으므로
head = &array[0];으로 바꿔주면 된다.

'C 언어 > 임베디드 C' 카테고리의 다른 글

공용체(메모리 겹쳐쓰기를 허용)  (0) 2011.08.22
열거형  (0) 2011.08.17
구조체를 함수의 인수로 전달하는 방법  (0) 2011.07.07
구조체를 가리키는 포인트변수  (0) 2011.07.07
구조체의 배열  (0) 2011.07.07