Создать логическую функцию, которая проверяет равенство многочленов - 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. Я понимаю ,что список нужно сделать так.
typedef struct node_t
{
   int st, a;//где st - степень , a - множитель
   struct node_t* next;
}  TNode;
Сам многочлен нужно содержать отсортированным по убыванию степени, чтобы можно было сравнивать легко две очереди между собой.А вот всё это реализовать не могу.... Однним словом здесь нам нужно создать два списка многочлена an*x^n+an-1*x^n-1+...+a1x+a0 и написать функцию ,которая их сравнивает. Заранее спасибо!!!

Решение задачи: «Создать логическую функцию, которая проверяет равенство многочленов»

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

  1. Создается структура TNode, которая будет представлять узлы списка.
  2. В функции Push создается новый узел, заполняется его поля и он добавляется в начало списка.
  3. В функции Print происходит обход списка и выводится значение коэффициента каждого узла и его порядковый номер.
  4. В функции IsEquals происходит сравнение значений коэффициентов двух списков до тех пор, пока не встретится пустой узел или не будет достигнуто условие равенства двух пустых списков. В основной функции main создаются два списка, заполняются несколькими узлами и выводится на экран. Затем происходит сравнение двух списков и выводится сообщение о том, равны ли они.

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы