Создать логическую функцию, которая проверяет равенство многочленов - 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
создаются два списка, заполняются несколькими узлами и выводится на экран. Затем происходит сравнение двух списков и выводится сообщение о том, равны ли они.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д