CS/자료구조

[ 자료구조 ] 연결리스트를 만들기 위한 구조체 선언과 typedef 활용

psy_er 2021. 10. 27. 00:04
728x90

[ 자료구조 ] 연결 리스트를 만들기 위한 구조체 선언과 typedef 활용

 

연결 리스트를 만들기 위해서는 자기 참조 구조체가 필요하다. 데이터를 저장할 필드가 있어야 하고, 다른 데이터 주소를 포인터로 가리키는 필드가 있어야 한다. 또한 이렇게 만들어진 구조체를 typedef 선언해 더 간단하게 표현할 수 있다.

 

 

정적 기억 장소에 데이터 저장 (활용도 낮음)

 

struct node{
   int data;
   struct node *link;
}

typedef struct node list_node;
typedef list_node * list_ptr;

list_node item1, item2, item3;
item1.data = 10;
item2.data = 20;
item3.data = 30;
item1.link = item2.link = item3.link = NULL;

item1.link = &item2;
item2.link = &item3;

struct node{
   int data;
   struct node *link;
}

typedef struct node list_node;
typedef list_node * list_ptr;

list_node item1, item2, item3;
item1.data = 10;
item2.data = 20;
item3.data = 30;
item1.link = item2.link = item3.link = NULL;

item1.link = &item2;
item2.link = &item3;

 

// 먼저 struct node에 필요한 데이터를 저장할 수 있는 정수형 데이터를 선언한다.

// struct node 포인터 타입 변수인 link를 선언한다. link의 자료형은 자기 자신이므로 자기 참조 구조체라고 할 수 있다.

 

// typedef 선언으로 struct node 타입을 list_node라고 부를 수 있게 한다.

// typedef 선언으로 list_node의 포인터 타입을 list_ptr로 부를 수 있게 한다.

 

 

728x90

 

 

list_node item1, item2, item3;
item1.data = 10;
item2.data = 20;
item3.data = 30;
item1.link = item2.link = item3.link = NULL;

item1.link = &item2;
item2.link = &item3;

list_node item1, item2, item3;
item1.data = 10;
item2.data = 20;
item3.data = 30;
item1.link = item2.link = item3.link = NULL;

item1.link = &item2;
item2.link = &item3;

 

// 앞서 정의한 list_node의 자료형으로 item1, item 2, item 3을 선언한다.

// 각각 구조체의 data 필드에 값을 저장한다

// 구조체의 자기 참조 포인터의 참조 값을 NULL로 설정해 초기화한다.

// item1의 포인터가 item 2를 가리키도록 한다.

// item 2의 포인터가 item3을 가리키도록 한다.

 

 

728x90

 

 

정적 기억 장소 연결 리스트가 완성되었다.

#include <stdio.h>
#include <malloc.h>
struct node{
   int data;
   struct node *link;
}

typedef struct node list_node;
typedef list_node * list_ptr;

int main(){
  list_node item1, item2, item3;
  //-----------------------------------complie
  item1.data = 10;
  item2.data = 20;
  item3.data = 30;
  item1.link = item2.link = item3.link = NULL;

  item1.link = &item2;item2.link = &item3;
  printf("%d %d %d \n", item1.data, item2.data, item3.data);// 10 20 30 출력
  printf("%d %d\n", item1.link->data, item1.link->link->data); // 20 30 출력
  printf("%d\n", (*item1.link).data); // item1.link->data와 (*item1.link).data는 같은 뜻이다.
  printf("%d %d %d\n", &item1, &item2, &item3); // 주소값 출력
  }

#include <stdio.h>
#include <malloc.h>
struct node{
   int data;
   struct node *link;
}

typedef struct node list_node;
typedef list_node * list_ptr;

int main(){
  list_node item1, item2, item3;
  //-----------------------------------complie
  item1.data = 10;
  item2.data = 20;
  item3.data = 30;
  item1.link = item2.link = item3.link = NULL;

  item1.link = &item2;item2.link = &item3;
  printf("%d %d %d \n", item1.data, item2.data, item3.data);// 10 20 30 출력
  printf("%d %d\n", item1.link->data, item1.link->link->data); // 20 30 출력
  printf("%d\n", (*item1.link).data); // item1.link->data와 (*item1.link).data는 같은 뜻이다.
  printf("%d %d %d\n", &item1, &item2, &item3); // 주소값 출력
  }

 

728x90

 

 

동적 기억 장소에 데이터 저장 (활용도 높음)

#include <stdio.h>
#include <malloc.h>
struct node{
    int data;
    struct node *link;
};
typedef struct node list_node;
typedef list_node * list_ptr;

int main(){
    list_ptr first, second, third;
    //--------------------------------compile, 밑 heap영역에 할당
    first = (list_ptr)malloc(sizeof(list_node));
    second = (list_ptr)malloc(sizeof(list_node));
    third = (list_ptr)malloc(sizeof(list_node));
	third->link = NULL;
    first->data = 10;
    second->data = 20;
    third->data = 30;
    first->link = second;
    second->link = third;
    
    printf("%d %d %d\n", first->data, second->data, third->data);
    printf("%d %d %d\n", first->link->data, first->link->link->data);
    printf("%d %d %d\n", first, second, third); // 포인터 주소값 출력
    
}

#include <stdio.h>
#include <malloc.h>
struct node{
    int data;
    struct node *link;
};
typedef struct node list_node;
typedef list_node * list_ptr;

int main(){
list_ptr first, second, third;
    //--------------------------------compile, 밑 heap영역에 할당
    first = (list_ptr)malloc(sizeof(list_node));
    second = (list_ptr)malloc(sizeof(list_node));
    third = (list_ptr)malloc(sizeof(list_node));
third->link = NULL;
    first->data = 10;
    second->data = 20;
    third->data = 30;
    first->link = second;
    second->link = third;
    
    printf("%d %d %d\n", first->data, second->data, third->data);
    printf("%d %d %d\n", first->link->data, first->link->link->data);
    printf("%d %d %d\n", first, second, third); // 포인터 주소값 출력
    
}

728x90