2012-03-28 4 views
0

링크 된 목록의 끝에 노드를 추가하려고합니다. void 함수를 사용하여 내 구조체를 전달하지만 한 번 추가 함수를 통해 실행 된 내 구조체 여전히 비어 있습니다. 여기 코드가 있습니다. 그것은 처음에 함수에 전달 될 때링크 된 목록의 끝에 노드 추가

struct part { 
    char* name; 
    float price; 
    int quantity; 
    struct part *next; 
}; 

typedef struct part partType; 

void addEnd(partType *item) 
{ 
    partType *temp1=NULL, *temp2=NULL; 
    char temp[100]; 

    temp1=(struct part *)malloc(sizeof(partType)); 

    if (!temp1) 
    printf("malloc failed\n"); 

    temp1->name = malloc(sizeof(char)*100); 

    printf("Please enter item name: \n"); 
    fgets(temp, 100, stdin);  
    strcpy(temp1->name, temp);  


    printf("Please enter item price: \n"); 
    fgets(temp, 100, stdin); 
    sscanf(temp, "%f", &temp1->price);  


    printf("Please enter item quantity: \n"); 
    fgets(temp, 100, stdin); 
    sscanf(temp, "%d", &temp1->quantity); 

    // Copying the Head location into another node. 
    temp2=item; 

    if(item == NULL) 
    { 
    // If List is empty we create First Node. 
    item=temp1; 
    item->next=NULL; 
    printf("%s%.2f\n%d\n", item->name, item->price, item->quantity); 
    } 
    else 
    { 
    // Traverse down to end of the list. 
    while(temp2->next != NULL) 
     temp2=temp2->next; 

    // Append at the end of the list. 
    temp1->next=NULL; 
    temp2->next=temp1; 
    printf("%s%.2f\n%d\n", item->name, item->price, item->quantity); 
    } 

} 

항목은 널 (null)이지만, 어떤 이유가 null 나오는 동안 나는 TEMP1 동일한 항목을 설정하는 경우 문이 비록.

+0

로이 부를 것이다 디버거? 이는 변수가 어떻게 변하는 지, 프로그램이 제어 구조 (명령문 및 루프 인 경우)를 통해 흐르는 방식을 확인하는 좋은 방법입니다. IDE의 내장 된 시각적 디버깅 도구를 사용하거나 명령 줄을 통해 GDB를 사용하십시오. – Cam

답변

2

당신은 포인터의 값을 수정해야합니다, 그래서 당신은 간접 더 높은 수준의 필요 : 당신이 함께이 단계별로 시도 가지고

void addEnd(partType **item) 
{ 
    ... 
    temp2 = *item; 
    ... 
    if (*item == NULL) 
    { 
    *item = temp1; 
    (*item)->next = NULL; 
    printf("%s%.2f\n%d\n", (*item)->name, (*item)->price, (*item)->quantity); 
    ... 
} 

을하고

partType *newItem; 
... 
addEnd(&newItem); 
+0

그래, 그게 문제일지도 모른다. 나는 그것을 시도하고 다시보고 할 것이다. –

+0

오류가 발생했습니다 "구조체가 아닌 '다음 멤버'에 대한 요청" * item-> next = NULL; –

+0

'* item-> next' 또는'(* item) -> next'? 그 괄호는 선택 사항이 아닙니다. –

2

item 경우에는 함수를 호출 할 때, 기능 후도 NULL될 수밖에 없다, NULL입니다. C는 참조 매개 변수를 알지 못하지만 포인터로 "시뮬레이션"됩니다. 함수 내에서 포인터를 변경하려면 포인터에 대한 포인터가 필요합니다.

0

실제로이 함수를 호출하는 방법을 보여주지 않았기 때문에 이것은 단지 추측입니다. 난 당신이 NULL로 설정 타입 부품의 어딘가에 항목이라는 포인터가 있다고 가정합니다. 그런 다음 해당 변수로이 함수를 호출합니다. 이것은 실제로 그 타입의 포인터에 대한 포인터를 의미하지는 않습니다. 이 함수는 현재 NULL을 가리키는 함수 호출을 수행 할 때 해당 포인터 변수의 로컬 복사본을 만듭니다. 해당 항목 포인터의 로컬 복사본을 temp로 설정하면 함수의 끝 부분에서 해당 로컬 복사본이 손실됩니다.

관련 문제