【线性表】一元多项式相乘

 

  1 /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 
  6 typedef struct node
  7 {   int    coef, exp;           //coef:系数     exp:指数
  8     struct node  *next;         //下一项
  9 } NODE;
 10 
 11 NODE* multiplication( NODE *, NODE * , NODE * );
 12 void input( NODE * );
 13 void output( NODE * );
 14 
 15 int main()
 16 {   NODE * head1, * head2, * head3;
 17 
 18     head1 = ( NODE * ) malloc( sizeof(NODE) );
 19     input( head1 );
 20 
 21     head2 = ( NODE * ) malloc( sizeof(NODE) );
 22     input( head2 );
 23 
 24     head3 = ( NODE * ) malloc( sizeof(NODE) );
 25     head3->next = NULL;
 26     head3 = multiplication( head1, head2, head3 );
 27     output( head3 );
 28 
 29     return 0;
 30 }
 31 /* PRESET CODE END - NEVER TOUCH CODE ABOVE */
 32 void input( NODE * head )      //输入顺序:<   -   0~9   ,    >
 33 {   int flag, sign, sum, x;    //sign:系数符号     sum:项系数,指数
 34     char c;
 35 
 36     NODE * p = head;
 37 
 38     while ( (c=getchar()) !='\n' )
 39     {
 40         if ( c == '<' )
 41         {    sum = 0;
 42              sign = 1;
 43              flag = 1;
 44         }
 45         else if ( c =='-' )
 46              sign = -1;
 47         else if( c >='0'&& c <='9' )
 48         {    sum = sum*10 + c - '0';
 49         }
 50         else if ( c == ',' )
 51         {    if ( flag == 1 )
 52              {    x = sign * sum;
 53                   sum = 0;
 54                   flag = 2;
 55                   sign = 1;
 56              }
 57         }
 58         else if ( c == '>' )
 59         {    p->next = ( NODE * ) malloc( sizeof(NODE) );
 60              p->next->coef = x;                            //项系数
 61              p->next->exp  = sign * sum;                //指数
 62              p = p->next;
 63              p->next = NULL;
 64              flag = 0;
 65         }
 66     }
 67 }
 68 void output( NODE * head )
 69 {
 70     while ( head->next != NULL )
 71     {   head = head->next;
 72         printf("<%d,%d>,", head->coef, head->exp );
 73     }
 74     printf("\n");
 75 }
 76 NODE* multiplication( NODE *h1, NODE *h2 , NODE *h3 )//不允许修改指针内容
 77 {
 78     NODE *head1, *head2, *head3,*head;//head临时头指针
 79     int max_exp = 0,count_exp = 0;
 80     head1 = h1;
 81     head2 = h2;
 82     head3 = h3;
 83     while(head1->next!=NULL){
 84         while(head2->next!=NULL){
 85             head3->next = (NODE *) malloc(sizeof(NODE));
 86             head3->next->coef = head1->next->coef*head2->next->coef;
 87             head3->next->exp = head1->next->exp+head2->next->exp;
 88             head2 = head2->next;
 89             head3 = head3->next;
 90             head3->next = NULL;
 91             if(head3->exp>max_exp)            //记录最大指数
 92                 max_exp = head3->exp;
 93         }
 94         head2 = h2;      //返回头指针
 95         head1 = head1->next;
 96     }
 97     //合并指数相同的多项式
 98     head = (NODE *)malloc(sizeof(NODE));
 99     head->next = (NODE*)malloc(sizeof(NODE));
100     head3 = h3;             //返回头指针
101     head1 = head;
102     for(count_exp = 0;count_exp<=max_exp;count_exp++){
103         head->next->coef = 0;
104         head->next->exp = count_exp;
105         while(head3->next!=NULL){
106             if(count_exp == head3->next->exp)
107                 head->next->coef += head3->next->coef;
108             head3 = head3->next;
109         }
110         //零多项式标志位
111         if(head->next->coef != 0){
112             head = head->next;
113             head->next = (NODE*)malloc(sizeof(NODE));
114         }
115         head3 = h3;             //返回头指针
116     }
117     head->next = NULL;
118     return head1;
119 }
120 
121 
122  

 

posted on 2014-05-01 11:06  Karma_wjc  阅读(187)  评论(0编辑  收藏  举报