Создать логическую функцию, которая проверяет равенство многочленов - C (СИ)
Формулировка задачи:
Здраствуйте,простите что я Вас отвлекаю, не могли б Вы мне помочь.
Многочлен P(x)=an*x^n+an-1*x^n-1+...+a1x+a0 можно представить в виде списка.
|P->| |n|an|->| |n-1|an-1|-> | | ->|0|a0|Nil|
Если ai=0,то соответствующая запись не включается в списку.Описаты тип данных, соответствующий, такому представлений многочленов и создать логическую функцию равна (P,Q), которая проверяет равенство многочленов
P и Q.
Я понимаю ,что список нужно сделать так.
Сам многочлен нужно содержать отсортированным по убыванию степени, чтобы можно было сравнивать легко две очереди между собой.А вот всё это реализовать не могу....
Однним словом здесь нам нужно создать два списка многочлена an*x^n+an-1*x^n-1+...+a1x+a0 и написать функцию ,которая их сравнивает.
Заранее спасибо!!!
typedef struct node_t
{
int st, a;//где st - степень , a - множитель
struct node_t* next;
} TNode;Решение задачи: «Создать логическую функцию, которая проверяет равенство многочленов»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
typedef struct node_t
{
int n;
int a;
struct node_t* next;
} TNode;
//-----------------------------------------------------------------------------
TNode* Push(TNode** list, int factor)
{
TNode* node = (TNode*)malloc(sizeof(TNode));
node->a = factor;
node->n = *list ? ((*list)->n + 1) : 0;
node->next = *list;
*list = node;
return *list;
}
//-----------------------------------------------------------------------------
void Print(const TNode* list, const char ch)
{
printf("%c(x) = ", ch);
for (; list; list = list->next)
{
printf("%d*x^%d + ", list->a, list->n);
}
printf("\b\b \n");
}
//-----------------------------------------------------------------------------
int IsEquals(const TNode* first, const TNode* second)
{
for (; first && second && first->a == second->a
; first = first->next, second = second->next) { ; }
return ((first == NULL) && (second == NULL));
}
//-----------------------------------------------------------------------------
int main()
{
TNode* list1 = NULL;
TNode* list2 = NULL;
Push(&list1, 10);
Push(&list1, 15);
Push(&list1, 20);
Push(&list2, 10);
Push(&list2, 15);
Print(list1, 'P');
Print(list2, 'Q');
printf("equals: %s\n\n", IsEquals(list1, list2) ? "yes" : "no");
Push(&list2, 20);
Print(list1, 'P');
Print(list2, 'Q');
printf("equals: %s\n\n", IsEquals(list1, list2) ? "yes" : "no");
system("pause");
return 0;
}
Объяснение кода листинга программы
В данном коде реализованы функции для работы с односвязным списком, а именно: функция Push добавляет новый элемент в список, функция Print выводит элементы списка на экран, а функция IsEquals проверяет равенство двух списков.
Список представляет собой последовательность узлов, каждый из которых содержит целочисленное значение коэффициента множителя, порядковый номер узла в списке и указатель на следующий узел.
- Создается структура
TNode, которая будет представлять узлы списка. - В функции
Pushсоздается новый узел, заполняется его поля и он добавляется в начало списка. - В функции
Printпроисходит обход списка и выводится значение коэффициента каждого узла и его порядковый номер. - В функции
IsEqualsпроисходит сравнение значений коэффициентов двух списков до тех пор, пока не встретится пустой узел или не будет достигнуто условие равенства двух пустых списков. В основной функцииmainсоздаются два списка, заполняются несколькими узлами и выводится на экран. Затем происходит сравнение двух списков и выводится сообщение о том, равны ли они.