-
Notifications
You must be signed in to change notification settings - Fork 0
/
multi.c
110 lines (110 loc) · 2.17 KB
/
multi.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int coe;
int exp;
struct node* link;
}poly;
poly *ha,*hb,*hc;
void eslinklist(poly** h)
{
int n;
poly *p,*q;
p=(poly*)malloc(sizeof(poly));
q=(poly*)malloc(sizeof(poly));
*h=p;
char temp[30],c;
scanf("%s",temp);
n=atoi(temp);
q->coe=n;
scanf("%s",temp);
n=atoi(temp);
q->exp=n;
q->link=NULL;
p->link=q;
p=q;
*h=q;
while((c=getchar())!='\n')
{
q=(poly*)malloc(sizeof(poly));
q->link=NULL;
scanf("%s",temp);
n=atoi(temp);
q->coe=n;
scanf("%s",temp);
n=atoi(temp);
q->exp=n;
p->link=q;
p=p->link;
}
}
poly* multi(poly* ha,poly* hb)
{
poly *p,*q,*l,*hc,*t;
p=ha;
q=hb;
hc=(poly*)malloc(sizeof(poly));
hc->link=NULL;
hc->exp=0;
t=hc;
l=(poly*)malloc(sizeof(poly));
l->link=NULL;
while(p!=NULL)
{
while(q!=NULL)
{
l->coe=(p->coe)*(q->coe);
l->exp=p->exp+q->exp;
if(hc->link==NULL&&hc->exp==0)
{
hc=l;
hc->link=NULL;
}
else
{
while(t->link!=NULL&&l->exp<t->link->exp)
t=t->link;
if(t->link==NULL)
{
t->link=l;
t=t->link;
t->link=NULL;
}
else if(l->exp>t->link->exp)
{
l->link=t->link;
t->link=l;
}
else if(l->exp==t->link->exp)
{
t->link->coe+=l->coe;
}
}
q=q->link;
t=hc;
l=(poly*)malloc(sizeof(poly));
l->link=NULL;
}
p=p->link;
t=hc;
q=hb;
}
return hc;
}
int main()
{
eslinklist(&ha);
eslinklist(&hb);
hc=multi(ha,hb);
poly* p;
p=hc;
while(p->link!=NULL)
{
printf("%d %d ",p->coe,p->exp);
p=p->link;
}
printf("%d %d\n",p->coe,p->exp);
return 0;
}