Сделай быстрый шаг назад; Я хотел бы предложить некоторые общие рекомендации по программированию, основанные на том, что я вижу из вашего кода:
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
и тщательно управляйте ими, чтобы вы могли перемещаться по списку в любом направлении. Это требует тонкого кодирования и тщательного продумывания вещей. Или скопируйте правильный порядок операций из опубликованного источника, такого как Кнут или текст ваших любимых алгоритмов. :)
На самом деле перевернуть ваш односвязный список . Также требует тонкого, тщательного кодирования или вдумчивого копирования. :)