2011-02-09 3 views
0

У меня очень простой вопрос, спасибо за ваше терпение.Динамическая структура данных с scanf

У меня динамическая структура данных с целым числом и указателем на следующую структуру. Я использую 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; 
} 

Как я могу получить пользовательский ввод в структуру?

ответ

0

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

+0

глупая ошибка. благодаря! – rick

+0

Я думаю, что у вас есть другие проблемы, но вызов 'scanf', но я не использовал' c' много, поэтому ... просто попробуйте и узнайте :). –

1

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

Как правило, при работе со связанной структурой, как связанный список (как в данном случае), вам распределите память для объектов в куче, используя 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

это отличная информация - я узнаю, что все, что вам нужно, написать больше, после того, как вы должны написать функцию. malloc, кажется, способ пойти на эти вещи - особенно, если я должен был создать цикл, чтобы продолжать вводить значения бесконечно. хочу, чтобы я мог проголосовать за вас! благодаря! – rick

Смежные вопросы