两个多项式的相加&相乘

    科技2022-07-13  129

    两个多项式的相加&相乘

    #include <stdio.h> #include <stdlib.h> typedef struct polynomial //建立表示多项式的结构体 { int x[2]; struct polynomial *next; }POL; POL *creatlist (int n); POL *addition (POL*head1, POL*head2,int n); void output (POL *head); POL *multiplication (POL*head1, POL*head2, int n, int m); int main() { int n = 0, m = 0; //多项式的项数 POL *head1, *head2; printf ("请输入第1个多项式的项数!\n"); scanf ("%d", &n); head1 = creatlist (n); printf ("请输入第2个多项式的项数!\n"); scanf ("%d", &m); head2 = creatlist (m); printf ("相加结果为:\n"); output (addition (head1, head2, n)); printf ("相乘结果为:\n"); output (multiplication (head1, head2, n, m)); } POL *creatlist (int n) //建立链表函数 { int i = 0; POL *head, *pNew, *pMedian; head = pMedian =(POL *) malloc (sizeof (POL)); //产生头结点 for (i=0; i<n; i++) //循环产生n个结点 { pNew = (POL *) malloc (sizeof(POL)); //产生一个结点 printf ("请输入第%d项的系数!\n", i+1); //赋值 scanf ("%d", &pNew->x[0]); printf ("请输入第%d项的幂数!\n", i+1); scanf ("%d", &pNew->x[1]); pMedian -> next = pNew; //将产生的新结点连接到上一节点 pMedian = pNew; //将刚产生的结点赋值给pMedian,pN } pMedian -> next = NULL; return head; } POL *addition (POL*head1, POL*head2, int n) //多项式相加函数 { int i = 0, flag = 0; POL *phead1, *phead2, *pn; POL *nhead, *pNew, *pMedian; phead1 = head1->next; phead2 = head2->next; //定义指向首元2指针 nhead = pMedian =(POL *) malloc (sizeof (POL)); //产生头结点 for (i=0; i<n; i++) //将phead1复制给nhead { pNew = (POL *) malloc (sizeof(POL)); //产生一个结点 pNew -> x[0] = phead1->x[0]; pNew -> x[1] = phead1->x[1]; //将head1的数值域复制给nhead phead1 = phead1->next; pMedian -> next = pNew; //将产生的新结点连接到上一节点 pMedian = pNew; //将刚产生的结点赋值给pMedian,pNew产生新的节点 } pMedian -> next = NULL; while (phead2 != NULL) { phead1 = head1 -> next; pn = nhead -> next; while (phead1 -> next != NULL) //phead2的每项依次与phead1比较并相加 { if (phead2 -> x[1] == phead1 -> x[1]) { pn->x[0] = phead1->x[0] + phead2->x[0]; break; } phead1 = phead1 -> next; pn = pn -> next; } while (phead1 -> next == NULL) { if (phead2 -> x[1] == phead1 -> x[1]) { pn -> x[0] = phead1 -> x[0] + phead2 -> x[0]; break; } else { for (i=0; i<flag; i++) //flag表示pn要后移的结点数 { pn = pn -> next; } pNew = (POL *) malloc (sizeof(POL)); //产生一个结点 pn -> next = pNew; //将产生的新结点与nhead连接起来 pn = pNew; pn -> x[0] = phead2 -> x[0]; pn -> x[1] = phead2 -> x[1]; //将head2的数值域复制给nhead pn -> next = NULL; flag++; break; } } phead2 = phead2->next; //将phead2指针后移 } return nhead; } void output (POL *head) //输出链表函数 { POL* ph = head->next; while (ph->next != NULL) { printf ("%d*x^%d+", ph->x[0], ph->x[1]); ph = ph->next; } printf ("%d*x^%d\n", ph->x[0], ph->x[1]); //输出尾结点 } POL *multiplication (POL*head1, POL*head2, int n, int m) //多项式相乘函数 { int i = 0; POL *phead1, *phead2, *pn; POL *nhead, *pM, *pNew; phead1 = head1 -> next; phead2 = head2 -> next; //定义指向首元2指针v nhead = pM = (POL *) malloc (sizeof (POL)); //产生头结点 while (phead1 != NULL) { phead2 = head2 -> next; while (phead2 != NULL) { pNew = (POL *) malloc (sizeof(POL)); //产生一个结点 pM -> next = pNew; //将产生的新结点与nhead连接起来 pM = pNew; pM -> x[0] = phead1 -> x[0]*phead2 -> x[0]; pM -> x[1] = phead1 -> x[1]+phead2 -> x[1]; //将结果写入新结点 pM -> next = NULL; phead2 = phead2 -> next; } phead1 = phead1 -> next; } return nhead; }
    Processed: 0.015, SQL: 8