用链表实现多项式的加法和乘法
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 }
明楼

浙公网安备 33010602011771号