实验名称:一元多项式相加
1 // multiply.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include "stdio.h" 7 using namespace std; 8 9 10 /***********************定义多形式的数据结构*************************/ 11 typedef struct Node 12 { 13 int coef; //多项式系数 14 int exp; //多项式指数 15 struct Node *next;//指向下一项的指针 16 } Node,*LinkList; //定义了一个Node型指针的别名LinkList; 17 18 /***********************多项式初始化*************************/ 19 void initpoly (LinkList &px) 20 { 21 px = new Node; 22 px ->next = NULL; 23 } 24 25 /***********************多项式创建*************************/ 26 void creatpoly (LinkList &px,int n ) 27 { 28 LinkList p=NULL,q=NULL; //q是用来开辟空间的。 29 p = px; //p是用来存储整个链表的。 这里px相当于一个全局的指针变量一样。 30 for(int i = 0; i < n; i++) 31 { 32 q = new Node; 33 cout << "请输入第" << i << "项的系数:"<< endl; 34 cin >> q ->coef; 35 cout << "请输入第" << i << "项的指数:"<< endl; 36 cin >> q ->exp; 37 q ->next = NULL; 38 p ->next = q;//链表向前一直在扩大。 39 p = q; 40 } 41 } 42 43 44 int lengthpoly(LinkList &px) //计算多项式的项数。 45 { 46 LinkList p = NULL; 47 int count = 0; 48 p = px ->next; 49 while(p != NULL) 50 { 51 p = p ->next; 52 count++; 53 } 54 return count; 55 } 56 /***********************多项式输出*************************/ 57 void outputpoly(LinkList &px) 58 { 59 LinkList p = NULL; 60 p = px ->next; 61 for(int i = 0;i < lengthpoly(px);i++) 62 { 63 cout << p ->coef << "*X^" << p->exp << "+"; 64 p = p ->next; 65 } 66 cout << "0" << endl; 67 } 68 /***********************多项式相加*************************/ 69 //void addpoly(LinkList &pa,LinkList &pb,LinkList &pc) 70 //{ 71 // LinkList la=NULL,lb=NULL,lc=NULL,r=NULL; 72 // la = pa ->next; 73 // lb = pb ->next; 74 // lc = pc; //prep是用来存储整个a+b的链表的。 75 // while(la&&lb)//a与b其中一个不为0 76 // { 77 // if(la ->exp < lb ->exp) //a的指数小 78 // { 79 // r = new Node; 80 // r ->coef = la ->coef; 81 // r ->exp = la ->exp; 82 // lc ->next = r; 83 // lc = r; 84 // r ->next = NULL; 85 // la = la ->next; 86 // } 87 // else if(la ->exp > lb ->exp) 88 // { 89 // r = new Node; 90 // r ->coef = lb ->coef; 91 // r ->exp = lb ->exp; 92 // lc ->next = r; 93 // r ->next = NULL; 94 // lc = r; 95 // lb = lb ->next; 96 // } 97 // else 98 // { 99 // int sum = la ->coef + lb ->coef; 100 // if(sum != 0) 101 // { 102 // r = new Node; 103 // r ->coef = sum; 104 // r ->exp = la ->exp; 105 // lc ->next = r; 106 // r ->next = NULL; 107 // lc = r; 108 // la = la ->next; 109 // lb = lb ->next; 110 // } 111 // else 112 // { 113 // la = la ->next; 114 // lb = lb ->next; 115 // } 116 // } 117 // 118 // } 119 // while(la != NULL) 120 // { 121 // r = new Node; 122 // r ->coef = la ->coef; 123 // r ->exp = la ->exp; 124 // lc ->next = r; 125 // lc = r; 126 // r ->next = NULL; 127 // la = la ->next; 128 // } 129 // while(lb != NULL) 130 // { 131 // r = new Node; 132 // r ->coef = lb ->coef; 133 // r ->exp = lb ->exp; 134 // lc ->next = r; 135 // lc = r; 136 // r ->next = NULL; 137 // lb = lb ->next; 138 // } 139 //} 140 141 Node * addDuoX(LinkList &Pa,LinkList &Pb)//关键部分,A与B相加 142 { 143 Node *p,*q; 144 Node *prep; 145 Node *u; 146 147 p = Pa->next; 148 q = Pb->next; 149 150 prep=Pa; 151 152 while (p&&q)//A与B都不等于0 153 { 154 if(p->exp<q->exp)//A的指数小于B的指数 155 { 156 prep=p; 157 p=p->next; 158 } 159 else if(p->exp > q->exp)//A的指数大的话 160 { 161 u=q->next; 162 163 q->next=p; 164 prep->next=q; 165 166 prep=q; 167 q=u; 168 } 169 else//A与B的指数相等的话 170 { 171 p->coef=p->coef+q->coef; 172 if(p->coef==0)//A与B的指数相等的话,且其中A的系数为0 173 { 174 Node *temp1; 175 Node *temp2; 176 temp1=p; 177 temp2=q; 178 prep->next=p->next;//删除该项数 179 p=p->next; 180 q=q->next; 181 182 delete temp1; 183 delete temp2; 184 } 185 else//A与B的指数相等的话,且其中A的系数为0,B的系数为0 186 { 187 Node *temp2; 188 temp2=q; 189 190 prep=p; 191 p=p->next; 192 q=q->next; 193 delete temp2; 194 } 195 } 196 } 197 if(q) 198 prep->next=q; 199 200 delete Pb; 201 return Pa; 202 } 203 204 205 //再做一个小的处理,先合并同类型。对指数相同的进行相加,并删去其中一个,合并同类项 206 void hebing(Node *px) 207 { 208 Node *p = NULL,*q = NULL; 209 p = px ->next; 210 q = new Node; 211 while(p->next!=NULL) 212 { 213 q = p ->next; 214 if(p ->exp == q ->exp) 215 { 216 p ->coef = p->coef + q->coef; 217 p -> next = q -> next; 218 //p 不在受q约束,一直不受其约束。 219 delete(q); 220 } 221 p = p ->next; 222 } 223 } 224 /*** 程序中用了选择排序 ***/ 225 void paixu(Node *px) 226 { 227 //用选择排序怎么做 228 Node *p = NULL,*q = NULL; 229 p = px ->next; //此时开辟了内存空间。 230 q = px ->next; 231 int temp; //注:类初始化化时需要加上(),而结构体初始化不需要。 232 for(p ;p!= NULL;p = p ->next) //这玩意就相当于i++, 233 { 234 for(q = p ->next; q!= NULL; q = q ->next ) //为什么不用q -> next,因为q = p -> next 了。 235 { 236 if(p ->exp > q ->exp) //我真是弄错啦,我现在只需要把结点里面的值换掉就行了,何必换掉整个的结点,这样位置肯定出问题。 237 { 238 temp = p ->exp; 239 p ->exp = q ->exp; 240 q ->exp = temp; 241 242 temp = p ->coef; 243 p ->coef= q ->coef; 244 q ->coef = temp; 245 } 246 } 247 } 248 } 249 250 251 int main() 252 { 253 LinkList pa = NULL,pb = NULL,pc = NULL; 254 initpoly(pa); 255 initpoly(pb); 256 initpoly(pc); 257 int a,b; 258 259 cout << "输入第一个多项式的项数:"<<endl; 260 cin >> a; 261 cout << "输入第二个多项式的项数:"<<endl; 262 cin >> b; 263 cout << "请按升序输入:"<<endl; 264 cout << "请输入第一个多项式的系数与指数"<<endl; 265 creatpoly(pa,a); 266 hebing(pa); 267 paixu(pa); 268 outputpoly(pa); 269 cout << "请按升序输入:"<<endl; 270 cout << "请输入第二个多项式的系数与指数"<<endl; 271 creatpoly(pb,b); 272 paixu(pb); 273 outputpoly(pb); 274 //addpoly(pa,pb,pc); 275 pc = addDuoX(pa,pb); 276 outputpoly(pc); 277 cin >> b; 278 delete(pa); 279 delete(pb); 280 delete(pc); 281 return 0; 282 }
实验目的:练习并掌握如何使用C++语言实现链表的说明、创建等操作。
实验要求:能实现一元多项式的输入、输出,以及两个一元多项式相加及结果显示。(具体内容请参照数据结构实验内容)
实验步骤及内容:
1、首先建立一个定义多项式的结构体Node,及结构体指针LinkList,该结构体包含一个指数exp,一个系数coef,一个指向下一项的指针*next,代码如下:
typedef struct Node
{
int coef; //多项式系数
int exp; //多项式指数
struct Node *next;//指向下一项的指针
} Node,*LinkList; //定义了一个Node型指针的别名LinkList;
2、初始化多项式,代码如下:
void initpoly (LinkList &px)
{
px = new Node;
px ->next = NULL;
}
3、建立多项式,用来指导用户输入程序运行时所需要的必须得数据,两个一元多项式的项数、系数、指数。具体的代码如下:
void creatpoly (LinkList &px,int n )
{
LinkList p=NULL,q=NULL; //q是用来开辟空间的。
p = px; //p是用来存储整个链表的。
for(int i = 0; i < n; i++)
{
q = new Node;
cout << "请输入第" << i << "项的系数:"<< endl;
cin >> q ->coef;
cout << "请输入第" << i << "项的指数:"<< endl;
cin >> q ->exp;
q ->next = NULL;
p ->next = q;
p = q;
}
}
4、求一个多形式的长度,主要用来获取一个多形式的长度,便于输出。
int lengthpoly(LinkList &px) //计算多项式的项数
{
LinkList p = NULL;
int count = 0;
p = px ->next;
while(p != NULL)
{
p = p ->next;
count++;
}
return count;
}
5、输出多形式,此函数用来对多项式进行输出验证。
void outputpoly(LinkList &px)
{
LinkList p = NULL;
p = px ->next;
for(int i = 0;i < lengthpoly(px);i++)
{
cout << p ->coef << "^" << p->exp << "+";
p = p ->next;
}
cout << "0" << endl;
}
6、多项式相加,输出也是按序排列。当两个多项式都不为0时,进行相加,然后剩下的部分直接赋给相加后的多项式,前提是输入的多形式必须是按顺序排列的。代码如下:
void outputpoly(LinkList &px)
{
LinkList p = NULL;
p = px ->next;
for(int i = 0;i < lengthpoly(px);i++)
{
cout << p ->coef << "*X^" << p->exp << "+";
p = p ->next;
}
cout << "0" << endl;
}
void addpoly(LinkList &pa,LinkList &pb,LinkList &pc)
{
LinkList la=NULL,lb=NULL,lc=NULL,r=NULL;
la = pa ->next;
lb = pb ->next;
lc = pc; //prep是用来存储整个a+b的链表的。
while(la&&lb)//a与b其中一个不为
{
if(la ->exp < lb ->exp) //a的指数小
{
r = new Node;
r ->coef = la ->coef;
r ->exp = la ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
la = la ->next;
}
else if(la ->exp > lb ->exp)
{
r = new Node;
r ->coef = lb ->coef;
r ->exp = lb ->exp;
lc ->next = r;
r ->next = NULL;
lc = r;
lb = lb ->next;
}
else
{
int sum = la ->coef + lb ->coef;
if(sum != 0)
{
r = new Node;
r ->coef = sum;
r ->exp = la ->exp;
lc ->next = r;
r ->next = NULL;
lc = r;
la = la ->next;
lb = lb ->next;
}
else
{
la = la ->next;
lb = lb ->next;
}
}
}
while(la != NULL)
{
r = new Node;
r ->coef = la ->coef;
r ->exp = la ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
la = la ->next;
}
while(lb != NULL)
{
r = new Node;
r ->coef = lb ->coef;
r ->exp = lb ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
lb = lb ->next;
}
}
7、主函数代码如下,为了便于交互,所以增加了好些用户提示符:
int main()
{
LinkList pa = NULL,pb = NULL,pc = NULL;
initpoly(pa);
initpoly(pb);
initpoly(pc);
int a,b;
cout << "输入第一个多项式的项数:"<<endl;
cin >> a;
cout << "输入第二个多项式的项数:"<<endl;
cin >> b;
cout << "请输入第一个多项式的系数与指数"<<endl;
creatpoly(pa,a);
cout << "请输入第二个多项式的系数与指数"<<endl;
creatpoly(pb,b);
addpoly(pa,pb,pc);
outputpoly(pc);
cin >> b;
delete(pa);
delete(pb);
delete(pc);
return 0;
}
当然我们可以在人性化一点,加上while实现,连续操作。
实验总结:
1、刚开始编的时候,老是出现不能访问内存错,说是没有初始化,不能访问。通过查找资料发现,在开辟一个新节点时,必须给其开辟空间,在c++里面用new语句,在c中用malloc语句即可。在定义结构体指针的时候,最好给其赋值为空,谨防出现野指针的情况。
2、 多项式相加的函数中,定义了一个返回LinkList的返回值,不过一直出错,直到我把返回值去掉的时候,才不会出错,具体什么原因,我现在还不清楚。