1

リンクリストに頭を悩ませようとしているだけです。「char[50]型に割り当てるときに型が互換性がない」、「文字列定数が長すぎる」というエラーが発生し、最後の構造体で最後に無効な型引数'->'が発生します。何を修正する必要がありますか?

#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

3 に答える 3

3

配列に割り当てるだけでなく、それらの要素をコピーする必要があります。また、c文字列は二重引用符で指定されます"

代わりに、次のようなものが必要になります。

strcpy( first_train->name, "Fantasy Train Set" );
于 2012-12-20T19:47:04.277 に答える
1

ここにはたくさんの問題があります...

1)価格変数int price;のタイプは「int」です。数値全体の値(小数点なし)を意味します。しかし、あなたがそれに割り当てるとき、あなたはこれをします:

first_train->price = 129.99; // <-- wrong, the .99 isn't going to work there

この:

second_train ->price = '69.99'; // <-- wrong... just.. wrong.

これらを小数部の数値にする場合はdoubleまたはfloatを使用する必要があり、数学を行わない場合は文字列を使用する必要があります。

2)2番目の問題は、文字列に一重引用符を使用しようとしていることです。'のように単一の文字に使用され、のように文字列に'a'二重引用符が使用されます""an apple"

したがって、価格を文字列にしたい場合は「69.99」が必要であり、名前は同じ「UncleBobstrainset」である必要があります。

3)これは文字列を割り当てる方法ではありません:

third_train ->name = 'Budha Bread Train';

データを文字列にコピーするには、または関数strcpy()を使用する必要があります。memcpy()

4)あなたのリストは「リンク」されていません。リスト内の次のアイテムの「次へ」をポイントする必要があります。現在、4つの独立した構造があります。「ブロック」のようなメモリ内の構造を考えると、次のようになります。

ここに画像の説明を入力してください

だからあなたはあなたが持っているコードでこれを生成することができます。first_train->price3つの独立した構造があり、たとえば、それらにアクセスできます。しかし、彼らはそれだけです。3つのリンクされていない構造。「リンクされた」部分には、これらの次のポインタが含まれています。次のように、次の各ポインタを次のノードに「ポイント」する必要があります。

root->next = first_train;
first_train->next = second_train; 

これを行うことで、構造を「接続」しているので、次のように考えることができます。

ここに画像の説明を入力してください

これらがこのようにリンクされている場合、ノード(ルート)が1つしかない場合は、誰のデータにもアクセスできます。

root->next->price; //that's first_train's price
于 2012-12-20T20:20:39.253 に答える
0

文字列リテラルは、"文字ではなくCの文字で囲まれてい'ます。文字列を割り当てることはできませんが、文字列をコピーすることはできます。strcpyまたはstrncpyfromを使用しstring.hて、文字列をコピーします。

于 2012-12-20T19:47:08.467 に答える