1

この出力は正しくありません。最初の列車の代わりに 2 番目の列車の名前が表示され、最初の列車の名前は完全に失われます。論理障害はどこにありますか? また、ルートの目的は何ですか?

#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

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 に答える