2016-10-04 3 views
2

목록 앞에 항목을 추가하려고합니다. 기본적으로, 내가 여기서하려고하는 것은 :C++ 더 명확한 방법으로 연결된 목록에 항목을 추가하십시오.

  • null 목록으로 시작;

  • 숫자 읽기;

  • 번호를 저장하기 위해 새 노드가 만들어지고 다음 포인터가 null을 가리키는 호출 기능.

  • 목록이 비어 있으면

    는,이 새로운 노드는리스트 (단 요소)이 목록의 헤드에 더 많은 요소,이 새로운 노드 점이며 경우

  • 가된다의 시작 새로운 머리.

내 함수는 (적어도 디버거에서는 볼 수 있습니다.)하지만 내 목록을 반환 한 후에는 비어 있고 머리는 다시 null입니다.

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

void insert_front(node *list, int num){ 
    node * newnode = new (node); 
    newnode->data = num; 
    newnode->next = nullptr; 

    if (list == nullptr) 
     list = newnode; 
    else{ 
     newnode->next = list; 
     list = newnode; 
    } 
} 

int main() 
{ 
    int n; 
    node *head = nullptr; 

    cout << "Input numbers to store (0 finishes input): "; 
    cin >> n; 
    while (n != 0){ 
     insert_front(head, n); 
     cin >> n; 
    } 
    return 0; 
} 

또한이 시도하지만 그것도 컴파일되지 않습니다 :

void insert_front(node &lst, int num){ 
    node *newnode = new node(); 
    newnode->data=num; 
    newnode->next=lst; 
    lst=newnode; 
} 

나는 의도적으로 "깨끗한"코드를 내가받을 수만큼 등 OOP, 템플릿, 형식 정의를 사용하여 피 모든 것이 어떻게 작동하는지 이해할 수 있습니다. 노드 * & 목록

void insert_front(node* &lst, int num){ 
    node *newnode = new node(); 
    newnode->data=num; 
    newnode->next=lst; 
    lst=newnode; 
} 

당신이 당신의 "LST"포인터의 사본을 수정됩니다 참조를 사용하므로하지 않는 경우 목록 것 :

+0

. 사본을 수정해도 원래 변수는 수정되지 않습니다. 포인터를 참조로 전달하십시오. –

답변

2

당신은 포인터 varibable에 대한 참조가 필요합니다 이 기능을 종료 한 후 이전 정면을 가리 키십시오. C++의 참조 매개 변수 접두사는 "&"기호입니다. 단일 오래된 C (귀하의 경우가 아니라) 포인터 대신 포인터가 필요합니다.

+0

나는 그것이 가능하다는 것을 모르고 : D 고마워! –

+0

설명이 필요합니다. –

+0

실제로 무엇이 잘못되었는지 설명하는 요소는 무시 무시한 수정보다 훨씬 더 중요합니다. –

0

할당 할 수 없으므로 참조로 전달하지 마십시오. 그런 다음

node* insert_front(node* list, int val) 
{ 
    node* n = new node(); 
    n->data = val; 
    n->next= list; 
    return n; // return the new head of the list 
} 

삽입 :

while (n != 0){ 
    head = insert_front(head, n); // head will always change every time you add to the front 
    cin >> n; 
} 

또는 양자 택일로, 당신은 당신의 삽입 기능은 또한 새로운 머리를 반영하기 위해 list를 업데이트 할 수 있습니다,하지만 당신은 헤더 포인터 자체에 대한 포인터를 전달해야 할 것 :

void insert_front(node** pList, int val) 
{ 
    node* n = new node(); 
    n->data = val; 
    n->next= *pList; 
    *pList= n; 
} 


while (n != 0){ 
    insert_front(&head, n); // head will always change every time you add to the front 
    cin >> n; 
} 
+0

참조로 포인터를 전달하지 않으시겠습니까? 참조로 전달 된 매개 변수에 할당 할 수 있습니다. –

+0

어느 쪽이든 갈 수 있습니다. 포인터를 통해 전달하는 것은 호출자에게 "입력/출력 매개 변수이며 변경 될 수 있습니다"라는 것을 명시 적으로 나타냅니다. 컴파일러는 동일한 코드를 생성합니다. – selbie

+0

감사합니다. 매우 유용합니다 :) –

0

값을 기준으로 목록을 전달합니다.

는 비유에 대해이 작업을 참조하십시오 : 당신은 목록에 포인터의 사본을 전달하는

int x; 
void modify_x_where_x_is_passed_by_reference(int & x_ref); 
void modify_x_where_x_is_passed_by_a_pointer(int * x_ptr); 
// Usage 
modify_x_where_x_is_passed_by_reference(x); 
modify_x_where_x_is_passed_by_a_pointer(&x); // the address of x 

// But when your variable is a pointer! 
int * y; 
void modify_y_where_y_is_passed_by_reference(int* & y_ref); 
void modify_y_where_y_is_passed_by_a_pointer(int* * y_ptr); 
// Usage 
modify_y_where_y_is_passed_by_reference(y); 
modify_y_where_y_is_passed_by_a_pointer(&y); // the address of y 
+0

위대한 설명과 매우 유용합니다. 고맙습니다! –

관련 문제