【线性表】一元多项式相乘
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