2012-06-09 5 views
0

비어있는 경우 노드를 추가하는 코드를 작성했습니다. 내 코드와 논리가 정확하다고 생각하지만 여전히 답을 얻을 수 없습니다. 그것의 컴파일하지만 결과가 표시되지 않고 실행 후.연결된 목록에 노드가 추가되지 않았습니다.

#include<stdio.h> 
#include<stdlib.h> 

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

void append(struct node *,int); 
void display(struct node*); 

void append(struct node *q, int num) 
{ 
    struct node *temp,*r; 
    if(q == NULL) 
    { 
     temp = (struct node*)malloc(sizeof(struct node)); 
     temp -> data = num; 
     temp -> nxt = NULL; 
     q = temp; 
    } 
    else 
    { 
     temp = q; 
     while(temp->nxt != NULL) 
     { 
      temp = temp->nxt; 
     } 
     r = (struct node*)malloc(sizeof(struct node)); 
     r -> data = num; 
     r -> nxt = NULL; 
     temp->nxt = r; 
    } 
} 

void display(struct node *q) 
{ 
    while(q != NULL) 
    { 
     printf("%d",q->data); 
     q = q->nxt; 
    } 
} 


int main() 
{ 
    struct node *a; 
    a= NULL; 
    append(a,10); 
    append(a,11); 
    append(a,12); 
    display(a); 
    return 0; 
} 

답변

1

당신은 주소로 append 방법에 첫 번째 매개 변수 (목록 헤드)의 주소를 전달해야 할 이유를 말해주십시오. 작성된 것처럼 첫 번째 호출 (및 이후의 각 호출)에서 값을 전달하므로 NULL을 전달합니다. 이 같은 통화를 한 후

void append(struct node **q, int num) 

을 그리고 :

프로토 타입은 다음과 비슷한 모습이 될 것입니다 필요 append 기능이 제대로 매개 변수 변경을 치료하기 위해 그에 따라 업데이트 할 것을

append(&a,10); 

참고.

1

APPEND의 시제품 ​​

void append(struct node **q, int num); 

로 변경이 기능 &aa의 주소를 전달해야한다. 이는 C가 값을 통한 전달 만 지원하기 때문입니다. 이 here에 대해 자세히 알아보십시오.

아래와 같이 수정 APPEND 기능을 찾아주세요 :

Chane 아래 행 : 또한

void append(struct node **q, int num) 
{  
    struct node *temp,*r;  

    if(*q == NULL)  
    {   
    temp = (struct node*)malloc(sizeof(struct node)); 
    temp -> data = num; 
    temp -> nxt = NULL; 
    *q = temp; 
    } 
    else 
    { 
    temp = *q; 
    while(temp->nxt != NULL) 
    { 
     temp = temp->nxt; 
    } 
    r = (struct node*)malloc(sizeof(struct node)); 
    r -> data = num; 
    r -> nxt = NULL; 
    temp->nxt = r; 
} 
} 

printf("%d",q->data); 

printf("%d\n",q->data); 

의 printf는 그렇지 않을 수 있습니다 데이터를 플러시 어떤 터미널에 개행 문자가 없다면 말이다.

+0

처리 한 대부분의 시스템에서 새 행은 데이터를 플러시 할 필요가 없습니다. 그러나, OP가 개행 문자 (또는 적어도 함수 끝에서 개행 문자가있는 값 사이의 공백)를 원한다는 것이 맞습니다. –

+0

@Mark Wilkins, 당신이 말했듯이, OP는 출력물이 뷰어에게 명확하게 보이도록 개행을 필요로합니다. 그러나 프로그래밍을 처음 접했을 때 나는이 문제를 오래 전에 보았습니다.하지만 지금은 터미널을 기억하지 못합니다. 또한 참조 용 : http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin – Jay

+0

끝까지 탐색 할 이중 포인터가 있으면 if/else는 필요하지 않습니다. (; q = & (* q) -> nxt) {;}에 대해 void append (struct node ** q, int num) { (* q) -> data = num; (* q) -> nxt = NULL; } ' – wildplasser

관련 문제