123 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| typedef struct Node {
 | |
|     int coefficient;
 | |
|     int exponent;
 | |
|     struct Node *next;
 | |
|     struct Node *prev;
 | |
| } Node;
 | |
| 
 | |
| Node *createNode(int coefficient, int exponent) {
 | |
|     Node *newNode = (Node *)malloc(sizeof(Node));
 | |
|     if (newNode == NULL) {
 | |
|         printf("Memory allocation failed.\n");
 | |
|         exit(1);
 | |
|     }
 | |
|     newNode->coefficient =coefficient;
 | |
|     newNode->exponent = exponent;
 | |
|     newNode->next = NULL;
 | |
|     newNode->prev = NULL;
 | |
|     return newNode;
 | |
| }
 | |
| 
 | |
| void insertEnd(Node **head, int coefficient, int exponent) {
 | |
|     Node *newNode = createNode(coefficient, exponent);
 | |
|     if (*head == NULL) {
 | |
|         *head = newNode;
 | |
|         (*head)->next = *head;
 | |
|         (*head)->prev = *head;
 | |
|     } else {
 | |
|         Node *last = (*head)->prev;
 | |
|         newNode->next = *head;
 | |
|         newNode->prev = last;
 | |
|         last->next = newNode;
 | |
|         (*head)->prev = newNode;
 | |
|     }
 | |
| }
 | |
| 
 | |
| Node *addPolynomials(Node *poly1, Node *poly2) {
 | |
|     if (poly1 == NULL) return poly2;
 | |
|     if (poly2 == NULL) return poly1;
 | |
| 
 | |
|     Node *result = NULL;
 | |
|     Node *temp1 = poly1, *temp2 = poly2;
 | |
| 
 | |
|     do {
 | |
|         if (temp1->exponent > temp2->exponent) {
 | |
|             insertEnd(&result, temp1->coefficient, temp1->exponent);
 | |
|             temp1 = temp1->next;
 | |
|         } else if (temp1->exponent < temp2->exponent) {
 | |
|             insertEnd(&result, temp2->coefficient, temp2->exponent);
 | |
|             temp2 = temp2->next;
 | |
|         } else {
 | |
|             int sum = temp1->coefficient + temp2->coefficient;
 | |
|             if (sum != 0) {
 | |
|                 insertEnd(&result, sum, temp1->exponent);
 | |
|             }
 | |
|             temp1 = temp1->next;
 | |
|             temp2 = temp2->next;
 | |
|         }
 | |
|     } while (temp1 != poly1 || temp2 != poly2);
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| void displayPolynomial(Node *head) {
 | |
|     if (head == NULL) {
 | |
|         printf("Empty polynomial.\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     Node *temp = head;
 | |
|     do {
 | |
|         printf("(%dx^%d) ", temp->coefficient, temp->exponent);
 | |
|         temp = temp->next;
 | |
|         if (temp != head) {
 | |
|             printf("+ ");
 | |
|         }
 | |
|     } while (temp != head);
 | |
|     printf("\n");
 | |
| }
 | |
| 
 | |
| void insert(Node** poly, int coef, int exp) {
 | |
|  Node* temp = (Node*) malloc(sizeof(Node));
 | |
|  temp->coefficient = coef;
 | |
|  temp->exponent = exp;
 | |
|  temp->next = NULL;
 | |
| 
 | |
|  if (*poly == NULL) { *poly = temp; return; }
 | |
| 
 | |
|  Node* current = *poly;
 | |
| 
 | |
|  while (current->next != NULL) current = current->next;
 | |
| 
 | |
|  current->next = temp;
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     Node *poly1 = NULL, *poly2 = NULL;
 | |
| 
 | |
|     insertEnd(&poly1, 5, 3);  // 5x^3
 | |
|     insertEnd(&poly1, 4, 1);  // 4x^1
 | |
|     insertEnd(&poly1, 3, 0);  // 3x^0
 | |
| 
 | |
|     insertEnd(&poly2, 3, 2);  // 3x^2
 | |
|     insertEnd(&poly2, 2, 1);  // 2x^1
 | |
|     insertEnd(&poly2, 1, 0);  // 1x^0
 | |
| 
 | |
|     printf("First polynomial: ");
 | |
|     displayPolynomial(poly1);
 | |
| 
 | |
|     printf("Second polynomial: ");
 | |
|     displayPolynomial(poly2);
 | |
| 
 | |
|     Node *sum = addPolynomials(poly1, poly2);
 | |
| 
 | |
|     printf("Sum of the polynomials: ");
 | |
|     displayPolynomial(sum);
 | |
| 
 | |
| 
 | |
| 
 | |
|     return 0;
 | |
| }
 | 
