02- linear structure 2 univariate polynomial multiplication and addition operation (20 minutes)

  1 #include <cstdio>
  2 #include <stdlib.h>
  3 typedef struct Node* Polynomial;
  4 struct Node {
  5     int coef;
  6     int expon;
  7     Polynomial next;
  8 };
  9 
 10 void attach(int c, int e, Polynomial *pRear) {
 11     Polynomial np = (Polynomial) malloc(sizeof(struct Node));
 12     np->coef = c;
 13     np->expon = e;
 14     (*pRear)->next = np;
 15     *pRear = (*pRear)->next;
 16 }
 17 int Compare(Polynomial a, Polynomial b) {
 18     if(a->expon > b->expon) {
 19         return 1;
 20     } 
 21     else if(a->expon < b->expon) {
 22         return -1;
 23     }
 24     else return 0;
 25 } 
 26 
 27 Polynomial readPoly() {
 28     Polynomial head, rear;
 29     head = (Polynomial) malloc(sizeof(struct Node));
 30     rear = head;
 31     head->next = NULL;
 32      
 33     int n;
 34     scanf("%d", &n);
 35     for(int i=0; i<n; i++) {
 36         int c, e;
 37         scanf("%d%d", &c, &e);
 38         attach(c, e, &rear);
 39     }
 40     rear->next = NULL;
 41     return head;
 42 }
 43 
 44 Polynomial add(Polynomial a, Polynomial b) {
 45     Polynomial head, rear;
 46     rear = (Polynomial ) malloc(sizeof(struct Node));
 47     head = rear;
 48     rear->next = NULL;
 49     a = a->next; b = b->next;
 50     while(a && b) {
 51         switch(Compare(a, b)) {
 52             case 1:
 53                 attach(a->coef, a->expon, &rear);
 54                 a = a->next;
 55                 break;
 56             case -1:
 57                 attach(b->coef, b->expon, &rear);
 58                 b = b->next;
 59                 break;
 60             case 0:
 61                 int c = a->coef + b->coef;
 62                 if(c) {
 63                     attach(c, a->expon, &rear);
 64                 }
 65                 a = a->next;
 66                 b = b->next;
 67                 break;
 68         }
 69     }
 70     if(a) {
 71         rear->next = a;
 72     }
 73     if(b) {
 74         rear->next = b;
 75     }
 76     
 77 /*    Polynomial temp;
 78     temp = head;
 79     head = head->next;
 80     free(temp);
 81 */
 82     return head;
 83     
 84     
 85     
 86 }
 87 Polynomial multi(Polynomial a, Polynomial b) {
 88     Polynomial head, rear, p2 = b->next;
 89     rear = (Polynomial ) malloc(sizeof(struct Node));
 90     head = rear;
 91     rear->next = NULL;
 92     
 93     a = a->next; b = b->next;
 94     while(a) {
 95         Polynomial bhead, brear;
 96         brear = (Polynomial ) malloc(sizeof(struct Node));
 97         bhead = brear;
 98         brear->next = NULL;
 99         b = p2;
100         while(b) {
101             attach(a->coef*b->coef, a->expon+b->expon, &brear);
102             b = b->next;
103         }
104         brear->next = NULL;
105         head = add(head, bhead);
106         a = a->next;
107         
108     }
109     
110     
111     return head;
112     
113 }
114 
115 
116 void printPoly(Polynomial a) {
117     int flag = 0;
118     a = a->next;
119     if(!a){
120         printf("0 0\n");
121         return;
122     }
123     while(a) {
124         if(!flag) flag = 1;
125         else printf(" ");
126         printf("%d %d", a->coef, a->expon);
127         a = a->next;
128     }
129     printf("\n");
130 }
131 
132 
133 
134 
135 int main (){
136     Polynomial p1, p2, pp, ps;
137     p1 = readPoly();
138     p2 = readPoly();
139 
140     ps = add(p1, p2);
141     pp = multi(p1, p2);
142     
143     printPoly(pp);
144     printPoly(ps);
145     return 0;
146 }
List implementation

 

Guess you like

Origin www.cnblogs.com/acoccus/p/10935548.html