1 /*********************************************
2 完成多项式的输入输出,基本加减乘除法操作的实现。
3 main函数操作:
4 1.输入第一个多项式的项数。
5 2.依次输入m项多项式的系数和指数。
6 3.输出第一个多项式和它所包含的项数
7 4.输入第二个多项式的项数。
8 5.依次输入m项多项式的系数和指数。
9 6.输出第二个多项式和他所包含的项数
10 7.依次输出前两个多项式的和差积
11 8.注意个多项式都是被先按照指数递增排序并化简再输出的
12 **********************************************/
13 #include <cstdio>
14 #include <cstdlib>
15 #include <iostream>
16 using namespace std;
17 typedef int Elemtype;
18
19 typedef struct node{
20 Elemtype coefficient;//系数
21 Elemtype index;//指数
22 struct node*Next;
23 }Node,*LinkList;
24 LinkList InitPolynomial();
25 LinkList InsertElem(LinkList Head,Elemtype coefficient,Elemtype index);
26 void DeleteElem(LinkList Head,LinkList End);
27 int LengthofPolynomial(LinkList Head);
28 LinkList AddPolynomial(LinkList Head1,LinkList Head2);
29 LinkList SubtractionPolynomial(LinkList Head1,LinkList Head2);//Head1-Head2
30 LinkList MultiplicationPolynomial(LinkList Head1,LinkList Head2);
31 void SortPolynomial(LinkList&Head);//将多项式按照指数递增的形式排序,并且合并指数相同的项
32 void PrintPolynomial(LinkList Head);
33 void ChangeElem(Elemtype&elem1,Elemtype&elem2);
34 //main函数内所有数据均为测试数据,读者可根据自己测试方式自行调换
35
36 int main()
37 {
38 LinkList Head1=NULL,Head2=NULL,Add=NULL,Subtraction=NULL,Multiplication=NULL;
39 Head1=InitPolynomial();
40 cout<<"Head1:"<<endl;
41 int m1,m2;
42 Elemtype coefficient,index;
43 cin>>m1;
44 for(int i=0;i<m1;i++){
45 cin>>coefficient>>index;
46 InsertElem(Head1,coefficient,index);
47 }
48 SortPolynomial(Head1);
49 PrintPolynomial(Head1);
50 cout<<LengthofPolynomial(Head1)<<endl;
51 Head2=InitPolynomial();
52 cout<<"Head2:"<<endl;
53 cin>>m2;
54 for(int i=0;i<m2;i++){
55 cin>>coefficient>>index;
56 InsertElem(Head2,coefficient,index);
57 }
58 SortPolynomial(Head2);
59 PrintPolynomial(Head2);
60 cout<<LengthofPolynomial(Head2)<<endl;
61 Add=AddPolynomial(Head1,Head2);
62 SortPolynomial(Add);
63 PrintPolynomial(Add);
64 Subtraction=SubtractionPolynomial(Head1,Head2);
65 SortPolynomial(Subtraction);
66 PrintPolynomial(Subtraction);
67 Multiplication=MultiplicationPolynomial(Head1,Head2);
68 PrintPolynomial(Multiplication);//由于乘法后项数过多,所以先输出没有排序的结果。
69 SortPolynomial(Multiplication);
70 PrintPolynomial(Multiplication);
71 return 0;
72 }
73
74 LinkList InitPolynomial(){
75 LinkList Head;
76 Head=(LinkList)malloc(sizeof(Node));
77 Head->Next=NULL;
78 Head->coefficient=0;
79 Head->index=0;
80 return Head;
81 }
82
83 LinkList InsertElem(LinkList Head,Elemtype coefficient,Elemtype index){
84 if(Head->Next==NULL){
85 LinkList q=(LinkList)malloc(sizeof(Node));
86 Head->Next=q;
87 q->coefficient=coefficient;
88 q->index=index;
89 q->Next=NULL;
90 }
91 else{
92 LinkList p=NULL,q=NULL;
93 for(q=Head->Next;q->Next;q=q->Next);
94 p=(LinkList)malloc(sizeof(Node));
95 q->Next=p;
96 p->coefficient=coefficient;
97 p->index=index;
98 p->Next=NULL;
99 }
100 return Head;
101 }
102
103 void DeleteElem(LinkList Head,LinkList End){
104 if(Head->Next==End){
105 Head->Next=End->Next;
106 free(End);
107 }
108 else if(End->Next!=NULL){
109 LinkList q=NULL;
110 for(q=Head->Next;q->Next!=End;q=q->Next);
111 q->Next=q->Next->Next;
112 free(End);
113 }else{
114 LinkList q=NULL;
115 for(q=Head->Next;q->Next!=End;q=q->Next);
116 q->Next=NULL;
117 free(End);
118 }
119 }
120 int LengthofPolynomial(LinkList Head){
121 int length=0;
122 LinkList q=NULL;
123 for(q=Head->Next;q;q=q->Next)
124 length++;
125 return length;
126 }
127
128 void SortPolynomial(LinkList&Head){
129 LinkList pir=NULL,end=NULL;
130 for(pir=Head->Next;pir;pir=pir->Next)
131 for(end=pir->Next;end;end=end->Next){
132 if(pir->index>end->index){
133 ChangeElem(pir->index,end->index);
134 ChangeElem(pir->coefficient,end->coefficient);
135 }
136 if(pir->index==end->index){
137 pir->coefficient+=end->coefficient;
138 DeleteElem(Head,end);
139 }
140 }
141 }
142
143 LinkList AddPolynomial(LinkList Head1,LinkList Head2){
144 LinkList pa=NULL,pb=NULL,Add=NULL;
145 pa=Head1->Next;
146 pb=Head2->Next;
147 Add=InitPolynomial();
148 while(pa&&pb){
149 if(pa->index<pb->index){
150 InsertElem(Add,pa->coefficient,pa->index);
151 pa=pa->Next;
152 }
153 else if(pa->index>pb->index){
154 InsertElem(Add,pb->coefficient,pb->index);
155 pb=pb->Next;
156 }
157 else{
158 InsertElem(Add,pa->coefficient+pb->coefficient,pa->index);
159 pa=pa->Next;
160 pb=pb->Next;
161 }
162 }
163 if(pa)
164 while(pa){
165 InsertElem(Add,pa->coefficient,pa->index);
166 pa=pa->Next;
167 }
168 if(pb)
169 while(pb){
170 InsertElem(Add,pb->coefficient,pb->index);
171 pb=pb->Next;
172 }
173 return Add;
174 }
175
176 LinkList SubtractionPolynomial(LinkList Head1,LinkList Head2){
177 LinkList pa=NULL,pb=NULL,Subtraction=NULL;
178 pa=Head1->Next;
179 pb=Head2->Next;
180 Subtraction=InitPolynomial();
181 while(pa&&pb){
182 if(pa->index<pb->index){
183 InsertElem(Subtraction,pa->coefficient,pa->index);
184 pa=pa->Next;
185 }
186 else if(pa->index>pb->index){
187 InsertElem(Subtraction,-pb->coefficient,pb->index);
188 pb=pb->Next;
189 }
190 else{
191 InsertElem(Subtraction,pa->coefficient-pb->coefficient,pa->index);
192 pa=pa->Next;
193 pb=pb->Next;
194 }
195 }
196 if(pa)
197 while(pa){
198 InsertElem(Subtraction,pa->coefficient,pa->index);
199 pa=pa->Next;
200 }
201 if(pb)
202 while(pb){
203 InsertElem(Subtraction,-pb->coefficient,pb->index);
204 pb=pb->Next;
205 }
206 return Subtraction;
207 }
208
209 LinkList MultiplicationPolynomial(LinkList Head1,LinkList Head2){
210 LinkList pa=NULL,pb=NULL,Multiplication=NULL;
211 Multiplication=InitPolynomial();
212 for(pa=Head1->Next;pa;pa=pa->Next)
213 for(pb=Head2->Next;pb;pb=pb->Next)
214 InsertElem(Multiplication,pa->coefficient*pb->coefficient,pa->index+pb->index);
215 return Multiplication;
216 }
217
218 void ChangeElem(Elemtype&elem1,Elemtype&elem2){
219 Elemtype medium=elem1;
220 elem1=elem2;
221 elem2=medium;
222 }
223
224 void PrintPolynomial(LinkList Head){
225 int flag=0;
226 LinkList p=NULL;
227 cout<<"Y=";
228 for(p=Head->Next;p;p=p->Next){
229 if(p->coefficient>0){
230 if(flag) cout<<'+';
231 if(p->coefficient==1){
232 flag=1;
233 cout<<'X'<<p->index;
234 }
235 else{
236 flag=1;
237 cout<<p->coefficient<<'X'<<p->index;
238 }
239 }
240 else if(p->coefficient<0){
241 if(p->coefficient==-1){
242 cout<<'-';
243 flag=1;
244 cout<<'X'<<p->index;
245 }
246 else{
247 flag=1;
248 cout<<p->coefficient<<'X'<<p->index;
249 }
250 }
251 else
252 continue;
253 }
254 if(!flag)
255 cout<<'0';
256 cout<<endl;
257 }
258
259 /****************************************
260 Author:CRUEL_KING
261 Time:2018/11/9
262 Program name:多项式基本操作的实现.cpp
263 ****************************************/