Программирование C - введите 3 символа и печатайте в обратном порядке - PullRequest
1 голос
/ 02 июня 2011

У меня проблемы с этой программой.Я думаю, что я почти прав, кроме того, что он выводит мусор на экран:

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Сделай быстрый шаг назад; Я хотел бы предложить некоторые общие рекомендации по программированию, основанные на том, что я вижу из вашего кода:

RECORD* insert (RECORD *it)
{
    RECORD *cur, *q;
    int num;
    char junk;
    char first[strsize];
    printf("Enter a character:");
    scanf("%c", &first);

    cur=(RECORD *) malloc(sizeof(RECORD));

Процедура insert() для записей, подходящих для сложных структур данных, обычно не ожидается / не разрешается / не требуется для выполнения взаимодействия с пользователем; вы смешиваете пользовательский интерфейс с внутренней бизнес-логикой . (Хотя бизнес-логика - это фраза high-falutin , я не знаю лучшего способа сказать «то, что ваша программа должна сделать, чтобы оправдать свое существование» или « «Основные требования, которые должна выполнять программа». Предложения по замене приветствуются.:)

Рассмотрим этот псевдокод как алгоритм замены:

while we need more characters
    prompt user for another character
    store character in datastructure
print datastructure in reverse

Отделите весь код для структуры данных от взаимодействия с человеком . (Это отделение представления от логики часто формализуется как Model View Controller , но важно понимать, что он не ограничен пользовательскими интерфейсами - вы хотите, чтобы ваш стек, список или очередь были полезны в вашем next проект программирования, поэтому создайте общие процедуры, чтобы только работали со стеком, списком или очередью, и вы можете использовать их в следующем проекте.)


Обновление

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

Теперь это больше похоже на это. Хотя я ценю то, что пытается сделать ваш учитель, связанный список не является той структурой данных, которую я выбрал бы для этой проблемы. (Я бы выбрал массив, если размер проблемы был ограничен , стек, если размер проблемы не ограничен.) Это можно решить с помощью связанного списка, и сразу на ум приходят три возможных подхода:

  • Напишите рекурсивную функцию вывода, которая работает следующим образом:

    void print_output(RECORD *r) {
        if this is the last RECORD in the chain
            print the data
        else
            print_output(next record in the chain)
    }
    

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

  • Напишите свои списки с двусвязными элементами списка. Используйте указатели next и prev и тщательно управляйте ими, чтобы вы могли перемещаться по списку в любом направлении. Это требует тонкого кодирования и тщательного продумывания вещей. Или скопируйте правильный порядок операций из опубликованного источника, такого как Кнут или текст ваших любимых алгоритмов. :)

  • На самом деле перевернуть ваш односвязный список . Также требует тонкого, тщательного кодирования или вдумчивого копирования. :)

1 голос
/ 02 июня 2011

В вашей функции RECORD* print(RECORD *it, int j) вы указываете printf, что хотите напечатать символ, но передаете указатель на первый элемент массива fname, который является адресом памяти.

Используйте либо:

printf("%s \n", cur->fname); /* print the string */

или

printf("%c \n", *cur->fname); /* print the first character */

Я не уверен, что вы хотите, так как ваш вопрос очень расплывчатый.

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