链表实现多项式相乘-数据结构学习
链表实现多项式相乘<线性表>
初学数据结构,我这个菜鸟 没看教程完全自己想. 这个题做好了好久. 不过还好总于做出来了.
先上代码,代码里有注释. 可以把注释变为cout<<注释 看一下向乘的过程.
后面再做详细的补充说明
问题描述 :
输入两个多项式,多项式的第一个数是项数.后续是两两一对,一个系数,一个指数. 多项式有序,按照系数的降序. 通过单链表实现两个多项式相乘. 输出结果多项式.同样第一项为项的个数, 后续安装指数降序排列.
要通过链表实现.
解决思路:
初始时把两个多项式的第一项存下来,这就是结果多项式的第一项.因为有序的原因,后面的都没有这一项的指数大,因此不用考虑这一项的本位相加和向前插入.之后遍历链表每一项,三个基本过程,本位相加,向前插入,向后插入.就实现了,两个多项式相乘,这个新构建的链表就是结果多项式.
上代码:
1 #include<iostream>
2 #define ends " "; //linux ends不输出
3 using namespace std;
4
5 typedef struct polynomial
6 {
7 int coef; //项的系数
8 int index; //指数
9 polynomial * next;
10 }term,*pTerm;
11
12 pTerm creatterm();
13 void showterm(pTerm);
14 pTerm mult(pTerm,pTerm);
15
16 int main(){
17 pTerm term1,term2,termAns;
18 term1=creatterm();
19 term2=creatterm();
20 cout<<"输入的两个多项式分别是:"<<endl;
21 showterm(term1);
22 showterm(term2);
23 cout<<"结果是:"<<endl;
24 termAns=mult(term1,term2);
25 showterm(termAns);
26 return 0;
27 }
28 //建立多项式
29 pTerm creatterm(){
30 int val,m,c,f;
31 pTerm phead, ptail;
32 phead = (pTerm)malloc(sizeof(term));
33 ptail=phead;
34 ptail->next=NULL;
35 cout<<"输入多项式的项数:";
36 cin>>m;
37 for(int i=0;i<m;i++){
38 cin>>c>>f;
39 pTerm pnew=(pTerm)malloc(sizeof(term));
40 pnew->coef=c;
41 pnew->index=f;
42 ptail->next=pnew;
43 pnew->next=NULL;
44 ptail=pnew;
45 }
46 phead->coef=m;
47 return phead;
48 }
49 //显示多项式的值
50 void showterm(pTerm phead){
51 pTerm p;
52 p=phead->next;
53 while(p!=NULL){
54 cout<<p->coef <<" "<< p->index<<" ";
55 p=p->next;
56 }
57 cout<<endl;
58 }
59 //多项式相乘
60 pTerm mult(pTerm t1,pTerm t2){
61 pTerm p1,p2,p,pre,phead;//第一个多项式 第二个多项式 工作节点指向当前的比较项 p的前一项 头节点
62 int n=1; //项数
63 //分配空间
64 p=(pTerm)malloc(sizeof(term));
65 pre=(pTerm)malloc(sizeof(term));
66 phead=(pTerm)malloc(sizeof(term));
67 p1=t1->next; //第一个多项式的第一项
68 p2=t2->next; //第二个多项式的第一项
69 //p初始化为第一项
70 p->coef=p1->coef*p2->coef;
71 p->index=p1->index+p2->index;
72 p->next=NULL;
73 pre->next=p;
74 phead->next=p;
75 //循环遍历处理每一项
76 while(p1!=NULL){
77 p2=t2->next;
78 while(p2!=NULL){
79 p=phead->next;
80 pTerm pnew=(pTerm)malloc(sizeof(term));
81 pnew->coef=p1->coef*p2->coef;
82 pnew->index=p1->index+p2->index;
83 pnew->next=NULL;
84 for(int i=0;i<t1->coef*t2->coef;i++)
85 {
86 if(p->index==pnew->index){ //本位相加
87 if(n==1) break; //第一项已有直接退出循环
88 else{p->coef+=pnew->coef;
89 n++;
90 break;}
91 }else if(p->index>pnew->index){
92 pre=p;
93 if(p->next==NULL) { //向后插入
94 p->next=pnew;
95 n++;
96 break;
97 }
98 else p=p->next;
99 }else if(p->index<pnew->index) { //向前插入
100 pre->next=pnew;
101 pnew->next=p;
102 pre=pnew;
103 n++;
104 break;
105 }
106 }
107 p2=p2->next; //p2移动
108 }
109 p1=p1->next; //p1移动
110 }
111 cout<<n<<" "; //输出项数
112 return phead;
113 }