Динамическая структура данных с scanf - PullRequest
0 голосов
/ 09 февраля 2011

У меня очень простой вопрос, спасибо за ваше терпение.

У меня есть динамическая структура данных с целочисленным значением и указателем на следующую структуру.Я использую scanf, чтобы получить пользовательский ввод, чтобы получить 5 значений для добавления в структуру, и пытаюсь напечатать вывод в конце.У меня проблемы с синтаксисом, чтобы получить вход в структуру.Я посмотрел вокруг StackOverflow и Google, но безрезультатно (возможно, потому что это слишком просто!)

вот код:

#include <stdio.h>

struct List
{
    int value;
    struct List *nextaddr;
};

int main()
{
    int int1, int2, int3, int4, int5;

    printf("please enter the first integer: ");
    scanf("%d", int1);
    struct List t1 = {int1};

    printf("please enter the second integer: ");
    scanf("%d", int2);
    struct List t2 = {int2};

    printf("please enter the third integer: ");
    scanf("%d", int3);
    struct List t3 = {int3};

    printf("please enter the fourth integer: ");
    scanf("%d", int4);
    struct List t4 = {int4};

    printf("please enter the fifth integer: ");
    scanf("%d", int5);
    struct List t5 = {int5};

    struct List *first;

    first = &t1;
    t1.nextaddr = &t2;
    t2.nextaddr = &t3;
    t3.nextaddr = &t4;
    t4.nextaddr = &t5;
    t5.nextaddr = NULL;

    printf("%i\n%i\n%i\n%i\n%i\n",first->value,t1.nextaddr->value,t2.nextaddr->value,t3.nextaddr->value,t4.nextaddr->value);

    return 0;
}

Как я могу получить ввод данных в структуру

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Несколько вещей -

Как правило, при работе со связанной структурой, такой как связанный список (как в данном случае), вы выделяете память для объектов в куче, используя malloc, а не в стеке. Это объясняется тем, что вы хотите, чтобы элементы связанной структуры пережили функцию, которая их создает, и поэтому выделение стека отдельными ячейками вряд ли будет работать правильно. Вы, вероятно, хотите создать структуру, написав что-то вроде

struct List* entry = malloc(sizeof(struct List));

В качестве продолжения, поскольку логика чтения содержимого ячейки связанного списка от пользователя и добавления его в список идентична для каждой ячейки, которую вы читаете, вы, вероятно, не хотите просто копировать код для этого пять раз. Вместо этого подумайте о написании такой функции:

struct List* ReadListEntry(void) {
    struct List* entry = malloc(sizeof(struct List));
    /* ... initialize 'entry' ... */

    return entry;
}

Таким образом, ваш код в main может быть в пять раз короче, и если вы обнаружите какие-либо ошибки в коде (как вы, похоже, и сделали), вам нужно будет изменить его только один раз, а не пять раз.

Что касается вашего исходного вопроса, я думаю, что проблема в том, что вы пишете

scanf("%d", myValue);

вместо

scanf("%d", &myValue);

Эта первая версия неверна и может вызвать сбой во время выполнения. scanf предполагает, что вы предоставляете указатель на целое число, а не на целое число, в качестве аргумента всякий раз, когда вы используете спецификатор формата %d, поэтому явный амперсанд, вероятно, причиняет вам боль.

Комбинируя это с приведенной выше идеей использовать вспомогательную функцию для создания выделенных в куче ячеек списка, вы можете попробовать написать такую ​​функцию:

struct List* ReadListEntry(void) {
    struct List* entry = malloc(sizeof(struct List));

    scanf("%d", &entry->value);
    entry->nextaddr = NULL;

    return entry;
}

Учитывая это, вы, вероятно, можете переписать вашу функцию main, чтобы она была намного проще, чем у вас есть сейчас. Я оставлю это в качестве упражнения для читателя. : -)

Надеюсь, это поможет!

0 голосов
/ 09 февраля 2011

scanf должен получить адрес целого числа, как в: scanf("%d", &int1);

...