2012-06-29 3 views
3

머리 후, 연결리스트에 노드를 추가, 나는 바로 머리 후 노드를 작성해야바로 내가 링크 된 목록을

node *head = NULL;하고 결국 내 링크 목록이 있어야합니다 같은 :

head -> node -> NULL ...

을하지만 정상적인 addNode 명 쿵푸를 사용할 때 나는 연결리스트가있을 때

void addNode(node *head) 
{ 
node *temp = head; // a temp to not move the head 
node *newNode = (node*)malloc(sizeof(node)); // The new node 

while (temp -> next != NULL) 
{ 
    temp = temp -> next // Getting to the last node 
} 

temp -> next= newNode; // Adding the new node into the linked list insted of the NULL 
newNode -> next = NULL; // Adding the NULL after the new node 
} 

이 코드는 나에게 좋은 작품 : nction, 그것은 나에게 (내 디버그에 문제가있는 확인되지 않음) 런타임 오류가

이 내가 쓴 것입니다 제공 이미 하나 이상의 노드가 있지만 링크 된 목록에 머리가있는 경우 문제가 발생합니다 ... 어떻게 문제를 해결할 수 있습니까?

(당신이 내 문제를 이해 didnt는 경우 - 내가 여기에 쓴 addNode 명 기능으로, 이미 NULL로 가리키는 머리에 새 노드를 추가하기위한 런타임 오류를 받고 있어요) ...

감사합니다, 아 미트 head이 항목에 NULL 인 경우 :

답변

2

당신은 머리가 null인지 확인해야합니다. 그렇지 않으면 당신은 당신이 머리가 NULL 인 경우는 머리 후 노드를 추가 할 수있는 메모리

에서 임의의 장소에 참조되도록

head->next != NULL 

머리가 NULL 확인하려고 할 때. 머리에 메모리를 할당하고 '다음'포인터를 설정해야합니다. 그런데 왜 머리가 null 인 동안 head-> next를 설정하고 싶은가?

편집

Mayby 당신이 활성 부울 같은 노드에 플래그를 추가하고 당신이 그것을 통과 할 때 false로 설정하려고한다.

다른 방식으로 말하려고합니다. head가 NULL이기 때문에 head-> next를 설정할 수 없습니다. NULL은 아무 것도없는 포인터라는 것을 의미합니다. 변수가있어 주소를 넣을 수는 있지만 다른 것은 쓸 수 없습니다. U가이 구조를 가지고 싶다면, 노드처럼, 당신은 Node 형의 새로운 객체의이 주소를 배치 할 수 있습니다 u는 노드 객체의 선두 어드레스에있을 것이다 그 후

Node element = malloc(sizeof(Node)); 
head = element; 

및 u는 취소 할 수 있습니다 이 구조체 내부의 변수 (예 : 노드 * 다음)에.

당신은 포인터에 대한 포인터를 사용할 수
+0

머리가 null 인 경우 어떻게 새 노드를 추가 할 수 있습니까? ? – AmitM9S6

+0

고마워요. 두 줄을 사용하여'head = null'을했을 때, 머리 뒤에 새로운 노드를 추가 할 수있었습니다 : 'head = (node ​​*) malloc (sizeof (node)); head -> next = null', 이제 작동합니다. – AmitM9S6

+0

문제 없습니다. 내 기쁨 :) 문제가 해결되면 게시 지점 아래의 표시를 클릭하십시오. 사람들은 문제가 해결되었음을 알게 될 것입니다. – Blood

3

그렇지 않으면 널 포인터 역 참조됩니다 확인해야합니다 변경 위해서는

node *temp = head; /* temp set to head, possibly null. */ 

while (temp->next != NULL) /* 'temp' dereferenced, undefined behaviour 
           if 'temp' is null. */ 

는 호출자가 볼 수

, 당신은 전달해야합니다 node** ( wildplasser), C가 값으로 인수를 전달하기 때문입니다. (예를 들어)로 변경

void addNode(node **head) 
{ 
    node *newNode = malloc(sizeof(node)); /* No need to cast. */ 
    if (newNode) 
    { 
     newNode->next = NULL; 

     if (NULL == *head) 
     { 
      *head = newNode; /* Set the head, as there isn't one yet. */ 
     } 
     else 
     { 
      node* temp = *head; 
      while (temp->next) temp = temp->next; 
      temp->next = newNode; 
     } 
    } 
} 

이 호출 될 것이다 :

node* my_list = NULL; 
addNode(&my_list); 
+0

헤드, NULL이고, 나는 확실하지 않다 :

void addNode(node **pp) { node *newNode = malloc(sizeof *newNode); // The new node if (newNode) { newNode->next = *pp; // steal the parent. (this will also work if *pp happens to be NULL) *pp = newNode; // let *pp point to the new node } } 

처럼 호출하려면 어떻게해야합니까 ... '(node ​​* head = NULL)' – AmitM9S6

+0

@ AmitM9S6 아직 존재하지 않는 노드 다음에 노드를 추가하려고하는 이유는 무엇입니까? 연결된 목록이 원하는 것입니까? – Marlon

+0

네, null로 설정하는 머리를 가지고 있고 그 뒤에 노드를 추가해야합니다. 그러나 어떻게해야하는지 잘 모르겠습니다 ... – AmitM9S6

1

: 나는 그 이후에 노드를 추가 할 필요가 있지만

... 
node *head = NULL; 
addNode(&head); 
... 
관련 문제