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-strings 用双引号指定"

您将需要这样的东西:

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.

如果您希望它们是带有小数部分的数值,则需要使用双精度或浮点数,或者如果您不对它们进行数学运算,则必须使用字符串

2)第二个问题是你试图对字符串使用单引号。'用于单个字符,如'a',双引号"用于字符串,如"an apple"

因此,如果您希望价格是一个字符串,您需要“69.99”,并且您的名字应该是相同的“Uncle Bobs train set”

3)这不是你分配字符串的方式:

third_train ->name = 'Budha Bread Train';

您需要使用strcpy()ormemcpy()或函数将数据复制到字符串中。

4)您的列表没有“链接”。您需要将“下一个”指向列表中的下一项,现在您只有四个独立的结构。如果您将内存中的结构想象为“块”,则如下所示:

在此处输入图像描述

因此,您可以使用您拥有的代码生成它。first_train->price您有三个独立的结构,例如,您可以访问它们。但他们就是这样。三个未链接的结构。“链接”部分与那些下一个指针一起出现。您需要将每个 next 指针“指向”下一个节点,如下所示:

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

通过这样做,你正在“连接”结构,你可以这样想:

在此处输入图像描述

如果它们像这样链接,如果我只有一个节点(根),我可以访问任何人的数据:

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

字符串文字用"C 中的字符而不是字符括起来'。您不能分配字符串,但可以复制字符串。使用strcpystrncpystring.h复制字符串。

于 2012-12-20T19:47:08.467 回答