Skip to content

Instantly share code, notes, and snippets.

@in1yan
Last active April 4, 2025 15:36
Show Gist options
  • Save in1yan/16bca8a89ef4571dbfb90f0322bbd0af to your computer and use it in GitHub Desktop.
Save in1yan/16bca8a89ef4571dbfb90f0322bbd0af to your computer and use it in GitHub Desktop.
polyomial multiplication
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int coeff;
int exp;
struct Node *next;
} node;
void append(node **head, int coeff, int exp) {
if (coeff == 0) return;
node *new_node = (node *)malloc(sizeof(node));
new_node->coeff = coeff;
new_node->exp = exp;
new_node->next = NULL;
if (*head == NULL || (*head)->exp < exp) {
new_node->next = *head;
*head = new_node;
} else {
node *temp = *head;
while (temp->next != NULL && temp->next->exp > exp)
temp = temp->next;
if (temp->next != NULL && temp->next->exp == exp) {
temp->next->coeff += coeff;
free(new_node);
} else {
new_node->next = temp->next;
temp->next = new_node;
}
}
}
void print_poly(node *head) {
if (head == NULL) {
printf("0\n");
return;
}
int first = 1;
while (head != NULL) {
if (!first) {
printf(" %c ", (head->coeff > 0) ? '+' : '-');
} else {
if (head->coeff < 0) printf("-");
first = 0;
}
int abs_coeff = (head->coeff < 0) ? -head->coeff : head->coeff;
if (head->exp == 0)
printf("%d", abs_coeff);
else if (head->exp == 1)
printf("%dx", abs_coeff);
else
printf("%dx^%d", abs_coeff, head->exp);
head = head->next;
}
printf("\n");
}
node *multiply(node *p1, node *p2) {
node *res = NULL;
for (node *i = p1; i != NULL; i = i->next) {
for (node *j = p2; j != NULL; j = j->next) {
append(&res, i->coeff * j->coeff, i->exp + j->exp);
}
}
return res;
}
void combine_like_terms(node **head) {
node *ptr = *head, *prev = NULL;
while (ptr != NULL) {
if (ptr->coeff == 0) {
if (prev == NULL) {
*head = ptr->next;
free(ptr);
ptr = *head;
} else {
prev->next = ptr->next;
free(ptr);
ptr = prev->next;
}
} else {
prev = ptr;
ptr = ptr->next;
}
}
}
void free_poly(node *head) {
node *temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
int main() {
node *p1 = NULL, *p2 = NULL;
int n, coeff, exp;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &coeff, &exp);
append(&p1, coeff, exp);
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &coeff, &exp);
append(&p2, coeff, exp);
}
print_poly(p1);
print_poly(p2);
node *res = multiply(p1, p2);
combine_like_terms(&res);
print_poly(res);
free_poly(p1);
free_poly(p2);
free_poly(res);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment