Я прочитал ваш код.
У вас есть проблемы с памятью внутри функции addPolyomials.
Эта проблема вызвана неправильной логикой: Leeor дал вам решение в своем ответе: вам нужно добавить слова else
до 2-го и 3-го if
s.
Если вы этого не сделаете, тогда, когда 1-й, если дает TRUE, создается новый указатель и добавляется в список, а сделан шаг.
Таким образом, когда достигается 2-й if
, сравнение выполняется с помощью этих новых продвинутых указателей.
Это логическая ошибка.
Делая это изменение на программу, есть некоторые проблемы.
Поскольку вы инициализируете polyomial3 для мусора, это показано в конечном результате.
Возможно, вам также нужно инициализировать компоненты exp и coef (to 0?).
polynomial3->exp = 0;
polyoomial3->coef = 0;
У вас ошибка в main()
при "создании" polynomial2.
Там вы используете список polyomial1.
линия должен быть изменено:
polynomial2 = addTerm(polynomial2,exp,coef);
С тезисами изменениями, мы можем наблюдать логик себя программу.
Я получил бессмысленное решение.
Я думаю, что вашей идеи определения некоторого «ожидающего» флага недостаточно.
Ваша логика, кажется, рассматривает полиномы, как если бы они были показателями по порядку.
Но пользователь не будет вводить полиномы таким образом.
Ваши примеры в верхней части вашего вопроса имеют неупорядоченные экспоненты (первый многочлен).
Я думаю, что было бы неплохо обработать ваши списки в момент их ввода, введя условия в порядок. Поскольку термины добавляются по одному в то время, это можно легко достичь, выполнив поиск в списке сверху и правильно вставляя термины.
Например, если у вас есть 5x^2 + 6x^3 + 9
, первый шаг будет вставлять 5 2 в верхней части списка polyomial1. На следующей итерации пара 6 3 будет вставлена снова вверху, перед парой (5, 2) и т. Д. Ваш окончательный список будет:
(6, 3, next), (5, 2, next), (9, 0, next), NULL
Эта процедура гарантирует, что вы можете выполнять итерацию по своему усмотрению. (Существует небольшая проблема: что произойдет, если пользователь вводит повторный показатель? В этом случае новый элемент не добавляется в список: просто добавьте новый коэффициент!)
Наконец, мы можем проанализировать «ожидающие рассмотрения», коэффициенты задаются в сумме.
Обратите внимание, что ваш while()
выполняет итерацию только в том случае, если оба списка не являются NULL.
Когда while()
приходит к своему концу, только три ситуации:
(polynomial1 != NULL && polynomial2==NULL)
or well (polynomial2 != NULL && polynomial1==NULL),
or well both are NULL.
Достаточно проверить (! Polynomial1 = NULL) и (polynomial2! = NULL).
В первом случае просто «вставьте» ожидающие члены полинома1 в полином 3.
Во втором случае сделайте то же самое для polyomial2.
И, наконец, в функции дисплея вы можете лучше обращаться с терминами с коэффициентом 0.
Наверное, лучше, чтобы члены с коэффициентом 0 не были показаны.
Ваша программа нуждается в гораздо большем улучшении, но это выходит за рамки вашего вопроса.
Отправьте код, который дает неверный ответ. – WhozCraig
В кратком фрагменте у вас мало контекста, на который можно ответить. Вам нужно показать, как ваш код проходит через термины и как вы захватываете полученный полином. – lurker
Задайте вопрос, как решить проблему с помощью бумаги. Затем обновите вопрос с помощью кода, реализующего этот алгоритм. Затем обновите вопрос с тем, что не так в коде, о котором у вас есть вопросы. – dcaswell