1

输出不正确。第二列火车的名字出现而不是第一列火车的名字,第一列火车的名字完全丢失了。逻辑错误在哪里?另外,root的目的是什么?

#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);
}
4

2 回答 2

1

好吧,这就是名字的去向:

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

至于 root 的用途......这是你的代码,谁知道呢。你不需要根节点,你只需要记录第一个节点是什么。

于 2012-12-20T21:53:32.020 回答
0

您似乎正在重写 first_train->name。

 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 节点。

您应该执行以下操作:

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->next != NULL)

您可以像这样重写它,这样您就可以避免将最后一个元素打印出循环:

while(list){ ... }

希望这可以帮助

于 2012-12-20T22:07:26.970 回答