Addition and subtraction of two polynomials using linked list in c

The linked list completes the addition and subtraction of two polynomials

Keywords: Algorithm data structure linked list

Content: complete the addition operation of two polynomials. It is known that there are two polynomials PM [x] and QM [x]. Design an algorithm to realize the operation of Pm[x]+Qm[x] and Pm[x]-Qm[x]. Moreover, the wig operation does not reopen the storage space, and it is required to be realized by chain storage structure.

Steps:

  1. algorithm analysis

The implementation of the addition algorithm of two polynomials is to store the two polynomials in a linked list. Set two pointers LAI and LBI to move the first node of equations Pm[x] and Qm[x] respectively, and compare the exponential direction of the node referred to by LAI and LBI, which can be divided into the following three cases:

  1. If LAI - > exp < LBI - > exp, the node referred to by LAI is one of the polynomials, and the LAI pointer moves back one position on the original basis.
  2. If LAI - > exp = LBI - > exp, add the coefficients of the corresponding terms, and then deal with them in two cases: if the sum of the coefficient terms is zero, release the node pointed to by LAI and LBI; if the sum of the coefficient terms is not zero, modify the coefficient field of the node pointed to by LAI and release the LBI node.
  3. If Lai - > exp > LBI - > exp, the node referred to by LBI is one of the polynomials, and the LBI pointer moves back one position on the original basis.

Two polynomial subtraction algorithm, the first is to store the two polynomials in a linked list. Set two pointers LAI and LBI to move the first node of equations Pm[x] and Qm[x] respectively, and compare the exponential direction of the node referred to by LAI and LBI, which can be divided into the following three cases:

  1. If LAI - > exp < LBI - > exp, the node referred to by LAI is one of the polynomials, and the LAI pointer moves back one position on the original basis.
  2. If LAI - > exp = LBI - > exp, subtract the coefficients of the corresponding term, and then deal with it in two cases: if the sum of the coefficient terms is zero, release the node pointed to by LAI and LBI; if the sum of the coefficient terms is not zero, modify the coefficient field of the node pointed to by LAI and release the LBI node.
  3. If Lai - > exp > LBI - > exp, the node referred to by LBI is one of the polynomials, and the LBI pointer moves back one position on the original basis.
  1. Algorithm design

Five functions are designed in the program:

  1. Init[] is used to initialize the linked list;
  2. CreatFromTail[] creates a linked list by tail interpolation;
  3. Polyadd[] is used to realize the addition algorithm of two polynomials;
  4. Polysub[] is used to realize the subtraction of two polynomials;
  5. Print[] is used to output polynomials.
    #include #include #include typedef struct poly { int exp; //index int coef; //coefficient struct poly *next; }PNode,*PLinklist; /*Linked list initialization*/ int Init[PLinklist *head] { *head=[PLinklist]malloc[sizeof[PNode]]; if[*head] { [*head]->next=NULL; return 1; } else return 0; } /*Creating linked list by tail interpolation*/ int CreateFromTail[PLinklist*head] { PNode *pTemp,*pHead; int c; //Storage factor int exp; //Storage index int i=1 ; //Counter pHead=*head; scanf["%d,%d",&c,&exp]; while[c!=0]//When the coefficient is zero, end the input { pTemp=[PLinklist]malloc[sizeof[PNode]]; if[pTemp] { pTemp->exp=exp; //Acceptance index pTemp->coef=c; //Acceptance coefficient pTemp->next=NULL; pHead->next=pTemp; pHead=pTemp; scanf["%d,%d",&c,&exp]; } else return 0; } return 1; } /*Add two polynomials*/ void Polyadd[PLinklist LA,PLinklist LB] { PNode*LAI=LA->next; //Pointer LAI moves in polynomial A PNode*LBI=LB->next; PNode*temp; //Pointer temp saves the node to be deleted int sum=0; //Sum of preservation factors /*Compare the exponential terms of the nodes referred to by LAI and LBI*/ while[LAI&&LBI] { if[LAI->expexp]{ LA->next=LAI; LA=LA->next; LAI=LAI->next; } else if[LAI->exp==LBI->exp] { sum=LAI->coef+LBI->coef; if[sum] { LAI->coef=sum; LA->next=LAI; LA=LA->next; LAI=LAI->next; temp=LBI; LBI=LBI->next; free[temp]; } else { temp=LAI; LAI=LAI->next; free[temp]; temp=LBI; LBI=LBI->next; free[temp]; } } else { LA->next=LBI; LA=LA->next; LBI=LBI->next; } } if[LAI] LA->next=LAI; else LA->next=LBI; } /*Subtraction of two polynomials*/ void Polysub[PLinklist LA,PLinklist LB] { PNode*LAI=LA->next; //Pointer LAI moves in polynomial A PNode*LBI=LB->next; PNode*temp; //Pointer temp saves the node to be deleted int difference=0; //Preservation factor /*Compare the exponential terms of the nodes referred to by LAI and LBI*/ while[LAI&&LBI] { if[LAI->expexp]{ LA->next=LAI; LA=LA->next; LAI=LAI->next; } else if[LAI->exp==LBI->exp] { difference=LAI->coef-LBI->coef; if[difference] { LAI->coef=difference; LA->next=LAI; LA=LA->next; LAI=LAI->next; temp=LBI; LBI=LBI->next; free[temp]; } else { temp=LAI; LAI=LAI->next; free[temp]; temp=LBI; LBI=LBI->next; free[temp]; } } else { LA->next=LBI; LA=LA->next; LBI=LBI->next; } } if[LAI] LA->next=LAI; else LA->next=LBI; } void Print[PLinklist head] { head=head->next; while[head] { if[head->exp] printf["[%dx^%d]",head->coef,head->exp]; else printf["%d",head->coef]; if[head->next] printf["+"]; else break; head=head->next; } } int main[void] { PLinklist LA; PLinklist LB; Init[&LA]; Init[&LB]; printf["Please enter the coefficient of the first polynomial,index,Enter 0,0 End input\n"]; CreateFromTail[&LA]; printf["Please enter the coefficient of the second polynomial,index,Enter 0,0 End input\n"]; CreateFromTail[&LB]; Print[LA]; printf["\n"]; Print[LB]; printf["\n"]; int i; printf["[Please enter 1 for addition polynomial and 0 for subtraction polynomial]\n"]; scanf["%d",&i]; if[1==i]{ Polyadd[LA,LB]; printf["The result of adding two polynomials:\n"]; Print[LA]; printf["\n"]; } else if[0==i]{ Polysub[LA,LB]; printf["The result of subtracting two polynomials:\n"]; Print[LA]; printf["\n"]; } else printf["Please enter the correct characters"]; return 0; }

Posted by blckspder on Wed, 06 Oct 2021 12:20:44 -0700

Hot Keywords

  • Java - 6961
  • Database - 2683
  • Python - 2616
  • Programming - 2419
  • Attribute - 2418
  • Javascript - 2383
  • Spring - 2111
  • Android - 2077
  • xml - 1972
  • Linux - 1818
  • JSON - 1764
  • network - 1748
  • github - 1720
  • less - 1676
  • MySQL - 1538
  • SQL - 1332
  • PHP - 1318
  • encoding - 1179
  • Mobile - 1029
  • Apache - 925

Adding two polynomials using Linked List

Given two polynomial numbers represented by a linked list. Write a function that add these lists means add the coefficients who have same variable powers.
Example:

Input: 1st number = 5x2 + 4x1 + 2x0 2nd number = -5x1 - 5x0 Output: 5x2-1x1-3x0 Input: 1st number = 5x3 + 4x2 + 2x0 2nd number = 5x^1 - 5x^0 Output: 5x3 + 4x2 + 5x1 - 3x0

C program to store a polynomial using linked list. Also perform addition and subtraction on two polynomials

data structure / December 14, 2021 / yashpalsinghdeveloper / 0

Complete C program to store a polynomial using linked list. Also, perform addition and subtraction on two polynomials

#include #include #include struct node { int num; int coeff; struct node *next; }; struct node *start1 = NULL; struct node *start2 = NULL; struct node *start3 = NULL; struct node *start4 = NULL; struct node *last3 = NULL; struct node *create_poly[struct node *]; struct node *display_poly[struct node *]; struct node *add_poly[struct node *, struct node *, struct node *]; struct node *sub_poly[struct node *, struct node *, struct node *]; struct node *add_node[struct node *, int, int]; int main[] { int option; clrscr[]; do { printf["\n******* MAIN MENU *******"]; printf["\n 1. Enter the first polynomial"]; printf["\n 2. Display the first polynomial"]; printf["\n 3. Enter the second polynomial"]; printf["\n 4. Display the second polynomial"]; printf["\n 5. Add the polynomials"]; printf["\n 6. Display the result"]; printf["\n 7. Subtract the polynomials"]; printf["\n 8. Display the result"]; printf["\n 9. EXIT"]; printf["\n\n Enter your option : "]; scanf["%d", &option]; switch[option] { case 1: start1 = create_poly[start1]; break; case 2: start1 = display_poly[start1]; break; case 3: start2 = create_poly[start2]; break; case 4: start2 = display_poly[start2]; break; case 5: start3 = add_poly[start1, start2, start3]; break; case 6: start3 = display_poly[start3]; break; case 7: start4 = sub_poly[start1, start2, start4]; break; case 8: start4 = display_poly[start4]; break; } }while[option!=9]; getch[]; return 0; } struct node *create_poly[struct node *start] { struct node *new_node, *ptr; int n, c; printf["\n Enter the number : "]; scanf["%d", &n]; printf["\t Enter its coefficient : "]; scanf["%d", &c]; while[n != –1] { if[start==NULL] { new_node = [struct node *]malloc[sizeof[struct node]]; new_node -> num = n; new_node -> coeff = c; new_node -> next = NULL; start = new_node; } else { ptr = start; while[ptr -> next != NULL] ptr = ptr -> next; new_node = [struct node *]malloc[sizeof[struct node]]; new_node -> num = n; new_node -> coeff = c; new_node -> next = NULL; ptr -> next = new_node; } printf["\n Enter the number : "]; scanf["%d", &n]; if[n == –1] break; printf["\t Enter its coefficient : "]; scanf["%d", &c]; } return start; } struct node *display_poly[struct node *start] { struct node *ptr; ptr = start; while[ptr != NULL] { printf["\n%d x %d\t", ptr -> num, ptr -> coeff]; ptr = ptr -> next; } return start; } struct node *add_poly[struct node *start1, struct node *start2, struct node *start3] { struct node *ptr1, *ptr2; int sum_num, c; ptr1 = start1, ptr2 = start2; while[ptr1 != NULL && ptr2 != NULL] { if[ptr1 -> coeff == ptr2 -> coeff] { sum_num = ptr1 -> num + ptr2 -> num; start3 = add_node[start3, sum_num, ptr1 -> coeff]; ptr1 = ptr1 -> next; ptr2 = ptr2 -> next; } else if[ptr1 -> coeff > ptr2 -> coeff] { start3 = add_node[start3, ptr1 -> num, ptr1 -> coeff]; ptr1 = ptr1 -> next; } else if[ptr1 -> coeff < ptr2 -> coeff] { start3 = add_node[start3, ptr2 -> num, ptr2 -> coeff]; ptr2 = ptr2 -> next; } } if[ptr1 == NULL] { while[ptr2 != NULL] { start3 = add_node[start3, ptr2 -> num, ptr2 -> coeff]; ptr2 = ptr2 -> next; } } if[ptr2 == NULL] { while[ptr1 != NULL] { start3 = add_node[start3, ptr1 -> num, ptr1 -> coeff]; ptr1 = ptr1 -> next; } } return start3; } struct node *sub_poly[struct node *start1, struct node *start2, struct node *start4] { struct node *ptr1, *ptr2; int sub_num, c; ptr1 = start1, ptr2 = start2; do { if[ptr1 -> coeff == ptr2 -> coeff] { sub_num = ptr1 -> num – ptr2 -> num; start4 = add_node[start4, sub_num, ptr1 -> coeff]; ptr1 = ptr1 -> next; ptr2 = ptr2 -> next; } else if[ptr1 -> coeff > ptr2 -> coeff] { start4 = add_node[start4, ptr1 -> num, ptr1 -> coeff]; ptr1 = ptr1 -> next; } else if[ptr1 -> coeff < ptr2 -> coeff { start4 = add_node[start4, ptr2 -> num, ptr2 -> coeff]; ptr2 = ptr2 -> next; } }while[ptr1 != NULL || ptr2 != NULL]; if[ptr1 == NULL] { while[ptr2 != NULL] { start4 = add_node[start4, ptr2 -> num, ptr2 -> coeff]; ptr2 = ptr2 -> next; } } if[ptr2 == NULL] { while[ptr1 != NULL] { start4 = add_node[start4, ptr1 -> num, ptr1 -> coeff]; ptr1 = ptr1 -> next; } } return start4; } struct node *add_node[struct node *start, int n, int c] { struct node *ptr, *new_node; if[start == NULL] { new_node = [struct node *]malloc[sizeof[struct node]]; new_node -> num = n; new_node -> coeff = c; new_node -> next = NULL; start = new_node; } else { ptr = start; while[ptr -> next != NULL] ptr = ptr -> next; new_node = [struct node *]malloc[sizeof[struct node]]; new_node -> num = n; new_node -> coeff = c; new_node -> next = NULL; ptr -> next = new_node; } return start; }

Output

  1. Enter the first polynomial
  2. Display the first polynomial
    –––––––––––––––––––––––––––––––
  3. EXIT
    Enter your option : 1
    Enter the number : 6 Enter its coefficient : 2
    Enter the number : 5 Enter its coefficient : 1
    Enter the number : –1
    Enter your option : 2
    6 x 2 5 x 1
    Enter your option : 9

Add two polynomials using linked list in c

C program for Add two polynomials using linked list. Here more information.

// Include header file #include #include /* C program for Add two polynomials using linked list */ typedef struct Node { // Define useful field of Node int data; int power; struct Node * next; }Node; Node * getNode[int data, int power] { // Create dynamic memory of Node Node * ref = [Node * ] malloc[sizeof[Node]]; if [ref == NULL] { // Failed to create memory return NULL; } ref->data = data; ref->power = power; ref->next = NULL; return ref; } // Update node value void updateRecord[Node * ref, int data, int power] { ref->data = data; ref->power = power; } typedef struct AddPolynomial { // Define useful field of AddPolynomial struct Node * head; }AddPolynomial; AddPolynomial * getAddPolynomial[] { // Create dynamic memory of AddPolynomial AddPolynomial * ref = [AddPolynomial * ] malloc[sizeof[AddPolynomial]]; if [ref == NULL] { // Failed to create memory return NULL; } ref->head = NULL; return ref; } // Display given polynomial nodes void display[AddPolynomial * ref] { if [ref->head == NULL] { printf["Empty Polynomial "]; } printf[" "]; Node * temp = ref->head; while [temp != NULL] { if [temp != ref->head] { printf[" + %d", temp->data]; } else { printf["%d",temp->data]; } if [temp->power != 0] { printf["x^%d", temp->power]; } // Visit to next node temp = temp->next; } printf["\n"]; } // Add node with given data and power void addNode[AddPolynomial * ref, int data, int power] { if [ref->head == NULL] { // Add first node ref->head = getNode[data, power]; } else { Node * node = NULL; Node * temp = ref->head; Node * location = NULL; // Find the valid new node location while [temp != NULL && temp->power >= power] { location = temp; temp = temp->next; } if [location != NULL && location->power == power] { // When polynomial power already exists // Then add current add to previous data location->data = location->data + data; } else { node = getNode[data, power]; if [location == NULL] { // When add node in begining node->next = ref->head; ref->head = node; } else { // When adding node in intermediate // location or end location node->next = location->next; location->next = node; } } } } // Add two polynomial Node * addTwoPolynomials[AddPolynomial * ref, AddPolynomial * other] { // Define some useful variable Node * result = NULL; Node * tail = NULL; Node * node = NULL; // Get first node of polynomial Node * first = ref->head; Node * second = other->head; // Execute loop until when polynomial are exist // And add two polynomial. // Process takes O[n] time. while [first != NULL || second != NULL] { // Create node with default value node = getNode[0, 0]; if [result == NULL] { // When first resultant node result = node; } if [first != NULL && second != NULL] { if [first->power == second->power] { // When the polynomial node power are same updateRecord[node, first->data + second->data, first->power]; first = first->next; second = second->next; } else if [first->power > second->power] { // When first polynomial power are larger updateRecord[node, first->data, first->power]; first = first->next; } else { // When second polynomial power are larger updateRecord[node, second->data, second->power]; second = second->next; } } else if [first != NULL] { // When first polynomial are not empty // Update the current node information updateRecord[node, first->data, first->power]; first = first->next; } else { // When second polynomial are not empty updateRecord[node, second->data, second->power]; second = second->next; } if [tail == NULL] { tail = node; } else { // Add new node at end of resultant polynomial tail->next = node; tail = node; } } // return first node return result; } int main[] { AddPolynomial * poly1 = getAddPolynomial[]; AddPolynomial * poly2 = getAddPolynomial[]; AddPolynomial * result = getAddPolynomial[]; // Add node in polynomial poly1 addNode[poly1, 9, 3]; addNode[poly1, 4, 2]; addNode[poly1, 3, 0]; addNode[poly1, 7, 1]; addNode[poly1, 3, 4]; // Add node in polynomial poly2 addNode[poly2, 7, 3]; addNode[poly2, 4, 0]; addNode[poly2, 6, 1]; addNode[poly2, 1, 2]; // Display Polynomial nodes printf["\n Polynomial A\n"]; display[poly1]; printf[" Polynomial B\n"]; display[poly2]; result->head = addTwoPolynomials[poly1, poly2]; // Display calculated result printf[" Result\n"]; display[result]; }

Output

Polynomial A 3x^4 + 9x^3 + 4x^2 + 7x^1 + 3 Polynomial B 7x^3 + 1x^2 + 6x^1 + 4 Result 3x^4 + 16x^3 + 5x^2 + 13x^1 + 7

Video liên quan

Bài mới nhất

Chủ Đề