多项式基本操作的实现
2018-11-10-15:03:10
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 ****************************************/
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!