Чтение ввода в C со связанными списками - PullRequest
0 голосов
/ 16 января 2011

Я создал связанный список. Его элементы сохраняют адреса как предыдущего, так и следующего элемента. Он получает команды из входного файла. Он обнаруживает команду и использует следующий оператор в качестве параметра. (текст: add_to_front john -> означает: add_to_front(john))

Код: http://pastebin.com/KcAm1y3L

Когда я пытаюсь дать команды из входного файла, он выдает мне один и тот же вывод снова и снова. Однако, если я пишу входные данные в main() вручную, это работает.

Для исходного входного файла:

add_to_front john
add_to_back jane
add_to_back jane
print

(к сожалению) вывод:

>add_to_front john
>add_to_back jane
>add_to_back jane
>print
 jane
 jane
 jane

Хотя, если я напишу

add_to_front(john);
add_to_back(jane);
add_to_back(jane);
print();

Вместо этой команды проверьте:

while (scanf("%s",command)!=EOF)
{
    if (strcmp(command,"add_to_front")==0)
    {
        gets(parameter);
        add_to_front(parameter);
    }
    else if (strcmp(command,"add_to_back")==0)
    {
        gets(parameter);
        add_to_back(parameter);
    }
    else if (strcmp(command,"remove_from_back")==0)
        remove_from_back(parameter);
    ...
        printf(" HUH?\n");
    }
}

В main() выдает правильный вывод.

Я знаю, это много, чтобы спросить, но эта вещь беспокоит меня в течение 2 дней. Что ты думаешь я делаю не так?

1 Ответ

2 голосов
/ 16 января 2011

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


Глядя на код в контейнере для вставки, это действительно проблема; Вы не копируете строки в свой список - вы просто копируете указатель. Вам нужно будет добавить код, чтобы выделить место для строки и скопировать строку. Если она доступна вам, функция strdup() делает работу аккуратно. Если нет, вы можете легко написать свой собственный. Обратите внимание, что это означает, что вам также придется освободить выделенное пространство.

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