2017-11-06 1 views
-4

하나의 정수가 들어있는 구조체를 기반으로 링크 된 노드의 머리에 새 노드의 숫자를 추가하는 함수를 만들도록 요청하는 연습 문제가 있습니다. 이것은 구조체입니다.링크 된 목록에 노드 삽입하기

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 

지금까지는 문제가 없습니다. 그래서 2 개의 인자를 취한 함수를 만들었습니다. 덧붙일 정수와 연결된리스트의 머리 부분에 대한 포인터입니다.하지만 작동하지 않았습니다.

void push(struct Node* head, int new_data) 
{ 
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); 

    new_node->data = new_data; 

    new_node->next = head; 

    head = new_node; 
} 

그럼, 내가 한 것은 내가 그 후 나는 새 노드를 연결리스트의 새로운 머리를 만들어, 머리가 가리키는 동일한 노드에 new_node 포인트를 만든 것입니다 : 이것은 내 코드입니다 . 그것이 작동하지는 않지만 매우 논리적 인 것처럼 보입니다.

:

void push(struct Node** head_ref, int new_data) 
{ 
    /* 1. allocate node */ 
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); 

    /* 2. put in the data */ 
    new_node->data = new_data; 

    /* 3. Make next of new node as head */ 
    new_node->next = (*head_ref); 

    /* 4. move the head to point to the new node */ 
    (*head_ref) = new_node; 
} 

이 두 번 **와 함수에 대한 주요이다 : 나는 머리의 ADRESS에게 기능을 대신 포인터 자체의 포인터를 줄 때 다른 한편으로, 그것은 작업을 수행

int main() 
{ 
    struct Node* head = NULL; 
    push(&head,7); 
    push(&head,6); 
    push(&head,3); 
    return 0; 
} 

나는 두 번째 기능이 작동한다는 것을 이해하지만, 머리의과 주소하지 머리 자체를 사용할 필요가 왜 표시되지 않습니다. 아무도 나에게 그 이유를 설명 할 수 있다면 기뻐할 것이다. 고마워.

+2

C++에서 [컨테이너]있다 (http://en.cppreference.com/w/cpp/container). – Ron

+1

1) [std :: list] (http://en.cppreference.com/w/cpp/container/list) & [std :: forward_list] (http://en.cppreference.com/w/cpp/) container/forward_list) 이미 있습니다 - * 사용하십시오 *. 2) 연결된 목록은 대개 현대 컴퓨터의 끔찍한 * 데이터 구조입니다. [std :: vector] (http://en.cppreference.com/w/cpp/container/vector)는 거의 항상 더 나은 선택입니다. –

+2

언어를 선택하십시오 C 또는 C++ – PaulMcKenzie

답변

1

하지만 왜 머리가 아닌 머리말을 사용해야 할 지 모르겠다.

보통 코드에는 (C++과는 달리) 참조가 없지만 포인터 만 있습니다.

head 포인터 변수에 저장된 값은

push() 호출 내에서 변경되어야하므로이 (단일 포인터 *) 값을 변경 head 변수의 어드레스를 전달할 필요가있다.
void push(struct Node** head_ref, int new_data) 
{ 

    // ... 

    /* 3. Make next of new node as head */ 
    new_node->next = (*head_ref); // Dereferencing head_ref yields the current 
            // content of head 

    /* 4. move the head to point to the new node */ 
    (*head_ref) = new_node; // Store the newly allocated memory address 
           // into the head pointer 
} 

당신이 당신의 질문 태그 된 것처럼

int main() 
{ 
    struct Node* head = NULL; 
    push(&head,7); 
    // ... 
} 
원래이 C++ 코드를 사용하지 않아도됩니다.

하면도 참조하여 포인터 파라미터를 취할 수

void push(struct Node*& head_ref, int new_data) 
        //^
{ 
    // ... 

    /* 3. Make next of new node as head */ 
    new_node->next = head_ref; 

    /* 4. move the head to point to the new node */ 
    head_ref = new_node; // <<<<<<<<<< 
} 

int main() { 
    struct Node* head = nullptr; 
    push(head,7); 
    push(head,6); 
    push(head,3); 
    return 0; 
} 
+1

포인터에 대한 참조는 C++이 아니지만이 경우에는 작동합니다. – tadman

+0

C 언어의 경우는 필요하게됩니다. 내 질문은 왜이 경우 위의 경우입니다. 문제를 해결하기 위해 새로운 트릭을 찾고있는 것은 아니지만 포인터의 주소를 사용하면서 일어나는 일을 이해하기를 원하며 포인터 만 사용하는 동안에는 발생하지 않습니다. –

+0

@BilalEnnouali _ "하지만 포인터의 주소를 사용하여 무슨 일이 일어나고 있는지 이해하고 싶습니다."_ 미안하지만, 내가 잘 설명했다고 생각했습니다. 포인터 변수의 주소를 전달하면 포인터 값을 변경할 수 있습니다. 그렇지 않으면 포인터 값의 사본을 수정하기 만하면 수정 사항이 함수 외부에있는 변수에 영향을 미치지 않습니다. – user0042