2016-10-29 5 views
1

C++의 링크 된 목록 끝에 삽입하는 간단한 함수를 작성하고 있지만 마지막으로 첫 번째 데이터 만 표시합니다. 나는 틀린 것을 생각할 수 없다.링크 된 목록의 끝에 삽입하십시오.

node* Insert(node* head, int data) 
{ 
    if (head == NULL) { 
     head = new node(); 

     head->data = data; 
     head->link = NULL; 

     return head; 
    } 
    else { 
     node* temp = head; 
     while (temp != NULL) { 
      temp = temp->link; 
     } 

     node* temp2 = new node(); 

     temp2->data = data; 
     temp2->link = NULL; 
     (temp->link) = temp2; 

     return head; 
    } 
} 
+0

'(temp-> link) = temp2;'에서'temp'는 널 포인터입니다 (그렇지 않으면'while (temp! = NULL)'루프에서 계속 회전합니다). 따라서 UB 인 null 포인터를 역 참조합니다. – melpomene

+0

고마워요! :) – mistletoe

답변

0

변경 while의 조건에서 구성 :이 기능입니다

while (temp!=NULL) { 
    temp=temp->link; 
} 

문에서

while (temp->link!=NULL) { 
    temp=temp->link; 
} 

에, temp->link = temp2는, 온도는 널 포인터이다. NULL 포인터를 역 참조했습니다.

노드를 뒤에 추가하려면 temp 포인터가 링크 된 목록의 마지막 노드를 가리켜 야합니다. 따라서 while 루프에서 마지막 노드, 즉 link 멤버가 아무 것도 가리 키지 않은 노드 (has NULL)에 도달하면 연결 목록 통과를 중지해야합니다. while (temp->link!=NULL)은 마지막 노드에서 link 구성원이 NULL을 가리 키므로 마지막 노드에서 중지됩니다.

0
node* Insert(node* head, int data) 
{ 
    if (head == NULL) { 
     head = new node(); 
    } 
    else { 
     while (head->link != NULL) { 
      head = head->link; 
     } 
     head = head->link = new node(); 
    } 
    head->data = data; 
    head->link = NULL; 
    return head; 
} 
+0

코드 덤프는 대답이 아닙니다. –

+0

@EmilyL. 댓글을 게시하기 전에 수정 사항을 읽지 않았습니다. 코드를 고치기 전에 코드에서 코어 덤프를 본 이유를 코드를 분석하려고합니다. – Stargateur

1

이 작업을 수행하여 논리를 단순화 할 수 있습니다 :

void Insert(node **pnode, int data) 
{ 
    while (*pnode) { 
     pnode = &(*pnode)->link; 
    } 
    *pnode = new node(data, NULL); 
} 

당신이 인수에서 datalink를 초기화합니다 node 생성자가 가정.

대신

head = Insert(head, 42); 

로 호출하는 지금

Insert(&head, 42); 
0

변화 동안 (온도를! = NULL)을 할 줄하는 중에 (temp-> 링크를! = NULL)

관련 문제