2012-12-20 4 views
1

출력이 잘못되었습니다. 두 번째 열차의 이름이 첫 번째 열차 대신 나타나고 첫 열차의 이름이 모두 손실됩니다. 논리적 결함은 어디에 있습니까? 또한 뿌리의 목적은 무엇입니까? 이름이 어디로왜 내 연결된 목록이 올바른 순서로 인쇄되지 않습니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
struct trainset { 
    char name[50]; 
    int price; 
    struct trainset *next; 
}; 

void show_list(struct trainset *list); 

int main (void){ 

    struct trainset *root; 
    root = (struct trainset *)malloc(sizeof(struct trainset));  
    strncpy(root ->name, " ", 50); 
    root ->price = 0; 
    root ->next = 0; 

    struct trainset *first_train; 
    first_train = (struct trainset *) malloc(sizeof(struct trainset)); 
    root ->next = first_train; 
    strncpy(first_train->name, "Fantasy Train Set", 50); 
    first_train->price = 129; 
    first_train->next = NULL; 

    struct trainset *second_train; 
    second_train = (struct trainset *)malloc(sizeof(struct trainset)); 
    first_train->next = second_train; 
    strncpy(first_train->name, "Uncle Bobs train set", 50); 
    second_train ->price = 69; 
    second_train ->next = NULL; 

    struct trainset *third_train; 
    third_train = (struct trainset *)malloc(sizeof(struct trainset)); 
    second_train->next = third_train; 
    strncpy(third_train ->name, "Budha Bread Train", 50); 
    third_train ->price = 169; 
    third_train ->next = NULL; 

    show_list(first_train); 
    return 0; 
} 

void show_list(struct trainset *list) 
{ 
    while(list->next!=NULL) 
    { 
     printf("train set name: %s, Train price: %d\n", list->name, list->price); 
     list = list->next; 
    } 
    printf("train set name: %s, train price: %d", list->name, list->price); 
} 

답변

1

그럼 여기 :

strncpy(first_train->name, "Fantasy Train Set", 50); 
... 
strncpy(first_train->name, "Uncle Bobs train set", 50); 

으로는 코드, 알고 있어요 위해 ... 어떤 루트. 루트 노드가 필요 없으며 첫 번째 노드가 무엇인지 기록해야합니다.

0

first_train-> 이름을 다시 쓰는 것 같습니다.

23  strncpy(first_train->name, "Fantasy Train Set", 50); // see here 
24  first_train->price = 129; 
25  first_train->next = NULL; 
26  struct trainset *second_train; 
27  second_train = (struct trainset *)malloc(sizeof(struct trainset)); 
28  first_train->next = second_train; 
29  strncpy(first_train->name, "Uncle Bobs train set", 50); // and here 

루트 포인터에 파인트 수 있습니다, 당신이 할 필요가 없습니다, 당신은 삽입과 창조 작업을 할 수있는 기능과 절차가 있어야합니다, 당신은 빈 루트 노드를 왜 모르겠어요 first_train 노드. 당신이 좋아하는 뭔가를해야

:

while(list->next != NULL) 

당신이처럼 다시 작성할 수 있습니다이 방법은 아웃 마지막 요소를 인쇄하지 않도록 :

list* create(int value) { 
    node = (list*)malloc(sizeof(list)); 
    node->value = value; 
    node->next = NULL; 
} 

list* insert(int value, list* root) { 
    if (!root) { 
     return create(value); 
    } 
    list* aux = root; 
    while(aux->next) { 
     aux = aux->next; 
    } 
    aux->next = create(value); 
    return root; 
} 

또한, 루프 조건에, 당신은 루프의 :

while(list){ ... } 

희망이

하는 데 도움이
관련 문제