用链表实现多项式的加法和乘法

  1 #include<iostream>
  2 #include<fstream>
  3 #include<algorithm>
  4 #include<string>
  5 #include<sstream>
  6 using namespace std;
  7 
  8 
  9 struct Polynomial{
 10     int Coef;
 11     int Exponent;
 12     Polynomial* Next;
 13 };
 14 
 15 Polynomial* ReadDataFromFile(Polynomial* Poly, string s);        //Read polynomial data from a file
 16 void PrintPolynomial(Polynomial* Poly);                //Output polynomial to the screen
 17 void WriteToFile(Polynomial* Poly, string s);  //Write polynomial data to a file
 18 int research(Polynomial* Poly, int Ept);
 19 Polynomial* MultPolynomial(Polynomial* Poly1, Polynomial* Poly2, Polynomial* PolyMult);    //Multiply two polynomials
 20 Polynomial* AddPolynomial( Polynomial* Poly1,Polynomial* Poly2);      //Adding two polynomials
 21 
 22 
 23 
 24 Polynomial* Poly1;
 25 Polynomial* Poly2;
 26 Polynomial* PolySum;                                            //The result of adding two polynomials
 27 Polynomial* PolyMult;                                        //The result of multiplying two polynomials
 28 
 29 int main() {
 30     string s1 = "data1.txt";
 31     string s2 = "data2.txt";
 32     Poly1 = ReadDataFromFile(Poly1, s1);
 33     Poly2 = ReadDataFromFile(Poly2, s2);
 34     cout << "P1(X)=";
 35     PrintPolynomial(Poly1);    
 36     cout << "P2(X)=";
 37     PrintPolynomial(Poly2);
 38 
 39     s1 = "dataSum.txt";
 40     s2 = "dataMult.txt";
 41     PolyMult = MultPolynomial(Poly1, Poly2, PolyMult);
 42     cout << "P2(X)=P1(X)*P2(X)=";
 43     PrintPolynomial(PolyMult);
 44 
 45     PolySum = AddPolynomial(Poly1, Poly2);
 46     cout << "F1(X)=P1(X)+P2(X)=";
 47     PrintPolynomial(PolySum);
 48 
 49     WriteToFile(PolySum, s1);
 50     WriteToFile(PolyMult, s2);
 51 
 52     system("pause");
 53 }
 54 
 55 Polynomial* ReadDataFromFile(Polynomial* Poly, string s) {
 56     Poly = new Polynomial;
 57     Poly->Coef = 0;
 58     Poly->Exponent = 0;
 59     Poly->Next = NULL;
 60 
 61     ifstream infile(s.c_str());
 62     int Coef, Ept;
 63 
 64     if (infile.fail()) {
 65         cerr << "error" << endl;
 66     }
 67     Polynomial *q, *p;
 68     p = Poly;
 69     while (!infile.eof()) {
 70         infile >> Coef >> Ept;
 71         q = new Polynomial;
 72         q->Coef = Coef;
 73         q->Exponent = Ept;
 74         q->Next = NULL;
 75 
 76         p->Next = q;
 77         p = q;
 78     }
 79     infile.close();
 80     return Poly;
 81 }
 82 void PrintPolynomial(Polynomial* Poly) {
 83     if (Poly->Next == NULL) {
 84         cerr << "List is empty";
 85         abort();
 86     }
 87     Polynomial *p;
 88     p = Poly->Next;
 89     int Coef, Ept;
 90     string s = "";
 91     string tmp;
 92     while (p) {
 93         Coef = p->Coef;
 94         Ept = p->Exponent;
 95 
 96         if (Coef > 0) {
 97             if (Ept == 0) {
 98                 stringstream ss;
 99                 ss << Coef<<'+';
100                 ss >> tmp;
101                 s += tmp;
102             }
103             else {
104                 stringstream ss;
105                 ss << Coef << "X^" << Ept << '+';
106                 ss >> tmp;
107                 s += tmp;
108             }
109         }
110         else if (Coef < 0) {
111             if (Ept == 0) {
112                 stringstream ss;
113                 ss << Coef<<'+';
114                 ss >> tmp;
115                 int len = s.length();
116                 s = s.substr(0, len - 1);
117                 s += tmp;
118             }
119             else {
120                 stringstream ss;
121                 ss << Coef << "X^" << Ept << '+';
122                 ss >> tmp;
123                 int len = s.length();
124                 s = s.substr(0, len - 1);
125                 s += tmp;
126             }
127         }
128         
129         p = p->Next;
130     }
131     int len = s.length();
132     if (s[len - 1] == '+') {
133         cout << s.substr(0, len - 1) << endl;
134     }
135     else cout << s << endl;
136 }
137 
138 void WriteToFile(Polynomial* Poly, string s) {
139     Polynomial* p;
140     ofstream outfile(s.c_str());
141     if (outfile.fail()) {
142         abort();
143     }
144     p = Poly->Next;
145     int Coef, Ept;
146     while (p) {
147         Coef = p->Coef;
148         Ept = p->Exponent;
149         outfile << Coef << " " << Ept << " ";
150         p = p->Next;
151     }
152     outfile.close();
153 }
154 
155 Polynomial* MultPolynomial(Polynomial* Poly1, Polynomial* Poly2, Polynomial* PolyMult) {
156     Polynomial *p1, *p2, *front;
157 
158     p1 = Poly1->Next;
159     p2 = Poly2->Next;
160     PolyMult = new Polynomial;
161 
162     PolyMult->Next = NULL;
163     int Coef1, Ept1;
164     int Coef2, Ept2;
165     while (p1) {
166         Coef1 = p1->Coef;
167         Ept1 = p1->Exponent;
168 
169         p2 = Poly2->Next;
170         while (p2) {
171             Coef2 = p2->Coef;
172             Ept2 = p2->Exponent;
173 
174             int Coef, Ept;
175 
176             Coef = Coef1*Coef2;
177             Ept = Ept1 + Ept2;
178 
179             Polynomial* rsh=PolyMult;
180             front = PolyMult->Next;
181             if (rsh&&rsh->Exponent != Ept) {
182                 while (rsh->Next&&rsh->Next->Exponent != Ept) {
183                     rsh = rsh->Next;
184                 }
185             }
186 
187             if (rsh->Next) {
188                 //cout << "rsh->Coef  " << rsh->Coef << "rsh->Exponent  " << rsh->Exponent << endl;
189                 //cout << "Coef    " << Coef << endl; 
190                 //cout << rsh->Next->Coef << "  " << Coef << endl;
191                 //cout << Coef1 << " " << Coef2 << endl;
192                 rsh->Next->Coef += Coef;
193                 //cout << "rsh->Coef  " << rsh->Next->Coef << "rsh->Exponent  " << rsh->Next->Exponent << endl;
194             }
195             else {
196                 Polynomial *q = new Polynomial;
197                 q->Coef = Coef;
198                 q->Exponent = Ept;
199                 q->Next = NULL;
200                 rsh->Next = q;    
201 
202                 //cout << "q->Coef  " << q->Coef << "q->Exponent  " << q->Exponent << endl;
203 
204             }
205 
206             p2 = p2->Next;
207         }
208         
209         p1 = p1->Next;
210     }
211     //system("pause");
212     return PolyMult;
213 }
214 
215 
216 Polynomial* AddPolynomial(Polynomial* Poly1, Polynomial* Poly2) {
217     Polynomial *PolySum = new Polynomial;
218     PolySum->Next = NULL;
219 
220     Polynomial *p1, *p2,*q, *front;
221 
222     p1 = Poly1->Next;
223     Polynomial* p=PolySum;
224     while (p1) {
225         q = new Polynomial;
226         q->Coef = p1->Coef;
227         q->Exponent = p1->Exponent;
228         q->Next = NULL;
229 
230         p->Next = q;
231         p = q;
232         p1 = p1->Next;
233     }
234 
235 
236     int Coef2, Ept2;
237 
238     p2 = Poly2->Next;
239     while (p2) {
240         Coef2 = p2->Coef;
241         Ept2 = p2->Exponent;
242 
243         p1 = PolySum->Next;
244         front = PolySum->Next;
245         while (p1&&p1->Exponent!=Ept2) {
246             front = p1;
247             p1 = p1->Next;
248         }
249         if (p1) {
250             p1->Coef += Coef2;
251         }
252         else {
253             q = new Polynomial;
254             q->Coef = Coef2;
255             q->Exponent = Ept2;
256             q->Next = NULL;
257 
258             front->Next = q;
259             //cout << "Coef2  " << Coef2 << " " << "Ept2  " << Ept2 << endl;
260         }    
261         p2 = p2->Next;
262     }
263     
264     return PolySum;
265 }
View Code

 

posted @ 2018-10-29 14:23  明楼  阅读(269)  评论(0)    收藏  举报