C++一元多项式相加

实验名称:一元多项式相加
  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的返回值,不过一直出错,直到我把返回值去掉的时候,才不会出错,具体什么原因,我现在还不清楚。

posted on 2013-12-14 22:16  zhuxuekui3  阅读(4052)  评论(0编辑  收藏  举报