Присвоение значения целому числу в связанном списке C - PullRequest
3 голосов
/ 16 июня 2010

У меня есть вопрос относительно связанных списков. У меня есть следующие структуры и функции, например.

struct node {
    int value;
    struct node *next;
};

struct entrynode {
    struct node *first;
    struct node *last;
    int length;
};
void addnode(struct entrynode *entry) {
    struct node *nextnode = (struct node *)malloc(sizeof(struct node));
    int temp;
    if(entry->first == NULL) {
        printf("Please enter an integer.\n");
        scanf("%d", &temp);
        nextnode->value = temp;
        nextnode->next = NULL;
        entry->first = nextnode;
        entry->last = nextnode;
        entry->length++;
    } else {
        entry->last->next = nextnode;
        printf("Please enter an integer.\n");
        scanf("%d", nextnode->value);
        nextnode->next = NULL;
        entry->last = nextnode;
        entry->length++;
    }

}

В первой части оператора if я сохраняю входные данные во временной переменной, а затем назначаю их полю в структуре. В ветке else я попытался назначить ее напрямую, что не сработало. Как мне назначить его напрямую?

Спасибо за ваше время.

Ответы [ 5 ]

5 голосов
/ 16 июня 2010

Попробуйте scanf("%d", &(nextnode->value));

2 голосов
/ 16 июня 2010
    scanf("%d", nextnode->value);

Вам нужно передать указатель на член-значение, чтобы scanf () был доволен. Исправлено:

    scanf("%d", &nextnode->value);

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

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

1 голос
/ 16 июня 2010

Во-первых, у вас есть ошибка.

Одна из строк должна быть:

scanf("%d", &(nextnode->value));

И извините, но ваш код ужасен!

  • Используйте лучшее имя, чем entrynode.Если это связанный список, почему бы вам просто не назвать его так?

  • Я предлагаю вам реализовать метод следующей подписи:

    bool addnode (structentrynode * entry, int value);

  • Возвращаемое значение позволяет узнать, было ли добавление успешным.

  • У вас много кодадублирования.Попробуйте удалить это.

  • Используйте вышеуказанный метод после , сделав вызов printf и scanf.

Это делаетМне страшно видеть, что printf и scanf замусорены в методах вставки структуры данных и избыточные копии кода, замусоренные, если это не так.

0 голосов
/ 16 июня 2010

Также, пожалуйста, проверьте возвращаемое значение malloc() звонков. Также, пожалуйста, не приводите возвращаемое значение malloc() на языке программирования C.

0 голосов
/ 16 июня 2010

Это должен быть адрес значения: scanf("%d", &(nextnode->value));

Вообще говоря, в качестве комментария к вашему коду, избегайте повторения кода, известного как антипаттерн copy-paste.Повторно используйте его по максимуму.Обычно, если вы попадаете в ситуацию, чтобы повторить код, создайте небольшую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...