Для начала, не используйте глобальные переменные, такие как first
и current
.
Интерфейс функции несовместим. Например, функция edit_flavo
, с одной стороны, сначала принимает головной узел через свой первый параметр. С другой стороны, он использует глобальную переменную current
.
Функция sort
неверна. Он не меняет значения элемента данных available
. Это сравнение в операторе if
if (temp2->name < temp1->name) {
не имеет смысла, поскольку сравниваются адреса строковых литералов вместо сравнения самих указанных строковых литералов с использованием строковой функции C strcmp
.
В списке не должны храниться адреса строковых литералов, но должны создаваться копии переданных строк в динамически выделенной памяти.
И правильнее будет менять местами целые узлы в функции сортировки вместо замены элементов данных. из заостренных узлов.
В функции edit_flavor
это если оператор
if (current->name == old_name) {
в целом также неверен. Сохранение компилятором одинаковых строковых литералов в виде отдельных символьных массивов или в виде одного массива зависит от параметров компилятора. Поэтому нет необходимости, чтобы, например, условие в таком операторе if
if ( "Hello" == "Hello" )
приводило к истине. Опять же, вам нужно использовать стандартную строковую функцию C strcmp
для сравнения строковых литералов.
В Main вы объявили два указателя на строковые литералы.
char *old = "";
char *new = "";
Вы не можете изменить строковые литералы. Любая попытка изменить строковый литерал приводит к неопределенному поведению. Вам необходимо объявить символьные массивы, в которых будут храниться введенные пользователем строки. Итак, еще один список должен хранить глубокие копии строк, а не их адреса.
Эти утверждения
scanf("%s", &old);
scanf("%s", &new);
неверны. Во-первых, выражения аргументов должны иметь тип char *
в качестве типа переменных old
и new
вместо типа char **
, который имеют выражения &old
и &new
. И, во-вторых, такой вызов вызывает неопределенное поведение, потому что функция scanf
будет пытаться изменить строковые литералы, на которые указывают указатели.
Так что вам нужно изменить свой список. Начните с удаления глобальной переменной first
, и указатель на головной узел создает в локальной переменной переменную, инициализируя ее NULL
. Затем измените функцию insert
, динамически выделяя память для копии, переданной в строку функции. Перепишите функцию sort
, которая будет заменять целые узлы вместо отдельных элементов данных. А для введенных строк используйте символьные массивы.