2016-06-23 6 views
3

내가, 내 푸시 작업이, 이것은 내가 지금까지 시도 무엇 링크 된 목록푸시 작업은

에 데이터를 삽입하지 않는 단일 연결리스트를 사용하여 스택을 만들려고하고 실패

typedef struct element { 
    int data; 
    struct element *next; 
}node; 

푸시 방법 내 주요 방법은

void push(node *root, int data) { 
    if(root == NULL) { 
     root = (node *) malloc (sizeof(struct element)); 
     root->data = data; 
     root->next = NULL; 
    } 
    else { 
     node *temp = (node *) malloc (sizeof(struct element)); 
     temp->data = data; 
     temp->next = root; 
     root = temp; 
    } 
} 

, 안 malloc 머리 포인터, 에드 있고 이것은 내가 푸시 메서드를 호출하는 방법입니다,

push(head, data); 

어떻게 푸시 작업을 수행 할 수 있습니까?

답변

3

. 이 값은 main으로 전파되지 않습니다. 이를 수행하는 한 가지 방법은 root 포인터를 반환하는 것입니다.

node* push(node *root, int data) { 
    if(root == NULL) { 
    root = (node *) malloc (sizeof(struct element)); 
    root->data = data; 
    root->next = NULL; 
    } 
    else { 
    node *temp = (node *) malloc (sizeof(struct element)); 
    temp->data = data; 
    temp->next = root; 
    root = temp; 
    } 
    return root; 
} 

그리고 메인에, 당신은 다음과 같이 호출 할 필요가

head = push(head, data); 
0

나는이 코드의 문제가있는 줄 믿습니다 : 당신은 temp라는 또 다른 지역 node*root라는 지역 node*를 할당되지만,이 과제는 push() 기능의 외부를 "고집"되지

root = temp; 

. 이 충실하려면, 당신은 다음과 역 참조 수 :

*root = *temp; 

전체 코드 :

void push(node *root, int data) { 
    if (root == NULL) { 
     root = (node *) malloc (sizeof(struct element)); 
     root->data = data; 
     root->next = NULL; 
    } 
    else { 
     node *temp = (node *) malloc (sizeof(struct element)); 
     temp->data = data; 
     temp->next = root; 
     *root = *temp; 
    } 
} 
1

귀하의 root 값이 포인터이지만, 주소를 수정하는 경우 즉, 값에 의해 전달됩니다 주소, 그것은 부작용이 없습니다 기능 범위를 벗어납니다.

사용 :

void push(node **root, int data) 

루트

의 값을 수정할 수 및하려면 : root 포인터가 push 기능에 수정

push(&head, data)