2011-04-11 4 views
2

아래 링크 된 목록 프로그램이 1 인데 그 not.can을 인쇄하면 왜 그럴까요?연결된 목록 프로그램

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

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

typedef struct node NODE; 
void display(NODE *); 
void add(NODE *,int); 

int main() 
{ 
    NODE *head=NULL; 
    add(head,1); 
    display(head); 
    printf("\n"); 
    getch(); 
    return 0; 
} 

void display(NODE *pt) 
{ 
    while(pt!=NULL) 
    { 
    printf("element is"); 
    printf("%d",pt->data); 
    pt=pt->link; 
    } 
} 

void add(NODE *q,int num) 
{ 
    NODE *temp; 
    temp = q; 
    if(q==NULL) 
    { 
    q=(NODE *)malloc(sizeof(struct node)); 
    temp = q; 
    } 
    else 
    { 
    while((temp=temp->link)!=NULL); 
    temp->link = (NODE *)malloc(sizeof(struct node)); 
    temp=temp->link; 
    } 

    temp->data = num; 
    temp->link = NULL; 
} 
+0

출력은 어느 것입니까? – Marco

+1

디버거를 사용하고 각 단계에서 링크 목록 구조의 내용이 무엇인지 살펴 보았습니까? –

답변

1

add 처음 호출 할 때 (head == NULL) 첫 번째 노드를 목록에 추가하면 head이 새로 할당 된 노드를 가리 키도록 변경해야합니다.

add은 변경된 head을 호출자에게 통신하지 않기 때문에 발생하지 않습니다.

// pass the address of head. 
add(&head,1); 

..... 

// change type of q from NODE * to NODE ** 
void add(NODE **q,int num) 
{ 
    // same as before but change q to *q. 

    // any changes made to the list here via q will be visible in caller. 
} 
2

지역 변수 main()에서 head은 당신의 add() 기능에 의해 수정되지 않습니다. 즉, 매개 변수가 NULL 인 display()을 호출하고 있음을 의미합니다.

NODE **q을 add에 전달한 다음 add()에서 업데이트해야합니다.

+0

즉, 값이 아닌 참조로 전달됩니다. 또는'head'의 새로운 값을 반환 할 수 있으며 항상'head = add (head, 1)'를 사용하십시오. – Rup

1

add() 함수는 q 인수를 수정하지만 값으로 전달합니다. add() 호출 후 헤드는 NULL로 남습니다.

0
int main() 
{ 
    NODE *head=NULL; 
    add(head,1); 
    display(head); 

: 당신은 같은 기능 add에 주소 포인터 head를 전달할 수 있습니다

// call as before but assign the return value to head. 
head = add(head,1); 

..... 

// return type changed from void to NODE * 
NODE* add(NODE *q,int num) 
{ 
    // make the changes as before 

    // return the head pointer. 
    return q; 
} 

나 :

함수에서 수정 된 head을 반환 당신도 할 수있는이 문제를 해결하려면 NODE * 헤드는 메인에 로컬입니다. 값이 NULL입니다. 을 전달하여 추가하면 NODE가 작성되고 해당 데이터가 1로 설정됩니다. 그런 다음 main으로 돌아갑니다 ... ... 머리가 STILL NULL입니다. head의 주소를 전달해야하므로 add()에서 실제 값이 변경됩니다. 또한 포인터로 작업하려면 add()를 변경해야합니다.

메인은 EXIT_SUCCESS 또는 EXIT_FAILURE를 반환해야합니다. struct 노드를 typedef하지 마십시오. 가독성에 해롭고 여기에서는 추상화를 사용하지 않습니다.

0

Add를 호출하면 새로운 헤드 포인터가 반환되지 않습니다. 따라서 여전히 NULL을 가리 킵니다.

0

아 ... 당신은 포인터에 의해 넘어지고 있습니다 ... 본질적으로 "머리"를 수정하려면, THAT에 대한 참조를 보내야합니다 ... 그렇지 않으면 포인터를 수정하는 것입니다 ... 여기에 코드를 변경 : 문제는 add 메소드의 서명에

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

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

typedef struct node NODE; 
void display(NODE *); 
void add(NODE **,int); 

int main() 
{ 
    NODE *head=NULL; 
    add(&head,1); 
    display(head); 
    printf("\n"); 
    getch(); 
    return 0; 
} 

void display(NODE *pt) 
{ 
    while(pt!=NULL) 
    { 
     printf("element is "); 
     printf("%d",pt->data); 
     pt=pt->link; 
    } 
} 

void add(NODE **q,int num) 
{ 
    NODE *temp; 
    temp = *q; 
    if(*q==NULL) 
    { 
     *q=(NODE *)malloc(sizeof(struct node)); 
     temp = *q; 
    } 
    else 
    { 
     while((temp=temp->link)!=NULL); 
      temp->link = (NODE *)malloc(sizeof(struct node)); 
      temp=temp->link; 
    } 

    temp->data = num; 
    temp->link = NULL; 
} 
1

을,이

void add(NODE **,int); 

작업처럼, NODE의 포인터에 대한 포인터를 전달해야 프로그램 작업을 만들기 위해 그와 함께. 다음

if(*q==NULL) 

경우

에 당신은 메모리를 할당 할 수 있으며, 그래서 작동이

*q=(NODE*)malloc(sizeof(struct node)); 

으로 새로운 HEAD 에 NULL 포인터를 교체합니다.

문제는 메모리를 할당 할 때 널 포인터의 로컬 복사본을 NODE로 바꾸지 만 주 기능의 헤드에는 영향을주지 않습니다.