C언어 자료구조 연결리스트(2) LinkedList


오늘 배워야 할것:   
     지난 시간 배운 연결리스트의 기초 개념을 숙지하여
     기본 동작방식에 대해서 공부해보겠습니다.



첫번째 노드를 가리키는 포인터 Head가 전역변수인 경우 어떤 결과가 생기는 생각해보자.

1)연결리스트의 맨 앞에 새로운 노드 삽입하기
 
    
Node *tmp = (Node *)malloc(sizeof(Node));
tmp -> data = "Ann";
tmp -> next - head;
head = temp

void add_first(char *item)
{
Node *temp = (Node *)malloc(sizeof(Node));
temp->data = item;
temp->next = head;
head = temp;   //여기에서 문제가 생길 수 있다. 
}



메인함수 안에서 head 지역변수라고 가정하고

... add_first("Ann", head); 호출 했다면

매개변수 head 메인함수안의 head와 별개의 함수가 됩니다.
메인함수의 head는 맨앞의 노드를 가리키고
보기엔 자연스럽게 새로운 노드가 추가되어 맨앞에 있던 노드를 가리키고
헤드는 새로운 노드를 가리키면서 , 기존에 연결된 링크는 끊어지면
보기엔 잘된거 처럼 보이지만,

메인의 입장에서 보면 메인안  전역변수 head는 기존에 있던 맨앞노드를 가리키게 되서 Ann 을 접글할 권한이 없게 됩니다.  그래서 여기서 다른 방법으로 작성해야 합니다.

몇가지 방법이 있는데 차례대로 설명합니다.
호출된 함수가 내가 만든 지역변수에 영향을 끼치기 하기 위한 방법은
head의 주소를 매개변수로 받습니다. 아래 코드를 참고부탁드립니다.


1)
void add_first(char *item)
{
Node *temp = (Node *)malloc(sizeof(Node));
temp->data = item;
temp->next = head;
head = temp;
}


2)
//head의 주소를 매개변수로 넘길 때
//포인터 변수 head의 주소를 매개변수로 받는다. 

void add_first(Node **ptr_head, char *item)  
{
Node *temp = (Node *)malloc(sizeof(Node));
temp->data = item;
temp->next = *ptr_head;
*ptr_head = temp;   //바뀐 head노드의 주소를
    // 포인터로 이용하여 변수 head에 쓴다  
}


add_first(&head, item_to_store);

//call by reference 방법을 이용해서  호출된 함수에서
//head의값을 변경 할 수 있게 된다


3)
Node *add_first(Node *head, char *item)
{
Node *temp = (Node *)malloc(sizeof(Node));
temp->data = item;
temp->next = head;
return temp; //새로운 head 노드의 주소를 return한다. 
//리턴해주는 값을 받아서  head에 써준다. 
}


//이렇게 구현할 경우 이 함수는 다음과 같은 식으로 호출해야 한다.
  head = add_first(head, item_to_store);
 







0 comments:

Post a Comment