| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2264 人关注过本帖
标题:请教一个多项式求和的问题
只看楼主 加入收藏
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
结帖率:41.18%
收藏
已结贴  问题点数:20 回复次数:5 
请教一个多项式求和的问题
程序代码:
#include <iostream>

using namespace std;

typedef struct PNode {
  float coef;
  int   expn;
  struct PNode *next;
} PNode,*Polynomial;

void Read(Polynomial &P,int n);
void Print(const Polynomial &P);
void Init(Polynomial &P);
Polynomial Add(const Polynomial &Pa, const Polynomial &Pb);

int main()
{
  Polynomial Pa,Pb;
  Polynomial AddP;
  int PaLen,PbLen;

  Init(Pa);   
  Init(Pb);
  Init(AddP);


  cin>>PaLen;
  Read(Pa,PaLen);
  cin>>PbLen;
  Read(Pb,PbLen);

  AddP = Add(Pa,Pb);

  Print(AddP);

  return 0;
}

void Init(Polynomial &P)
{
  P = new PNode;
  P->next = NULL;
}

void Read(Polynomial &P, int n)
{
  PNode *Ptr = P;
  for(int i = 0; i < n; i++) {
    PNode *Pn = new PNode;
    cin>>Pn->coef>>Pn->expn;
    Pn->next = NULL;
    Ptr->next = Pn;
    Ptr = Ptr->next;
  }
}

void Print(const Polynomial &P)
{
  PNode *Ptr = P->next;

  while(Ptr) {
    cout<<Ptr->coef<<" "<<Ptr->expn;
    if(Ptr->next != NULL) cout<<" ";
    Ptr = Ptr->next;
  }
}

Polynomial Add(const Polynomial &Pa, const Polynomial &Pb)
{
  Polynomial Pc;
  Init(Pc);
  PNode *Ptra = Pa->next,*Ptrb = Pb->next, *Ptrc = Pc;

  while(Ptra && Ptrb) {
    if(Ptra->expn > Ptrb->expn) {
      Ptrc->next = Ptra;
      Ptra = Ptra->next;
    }
    else if(Ptra->expn < Ptrb->expn) {
      Ptrc->next = Ptrb;
      Ptrb = Ptrb->next;
    }
    else {
      PNode *temp = new PNode;
      temp->coef = Ptra->coef + Ptrb->coef;
      temp->expn = Ptra->expn;
      Ptrc->next = temp;
      Ptra = Ptra->next;   Ptrb = Ptrb->next;
    }
    Ptrc = Ptrc->next;
  }

  if(Ptra) Ptrc->next = Ptra;
  else if(Ptrb) Ptrc->next = Ptrb;

  return Pc;
}


问题出在Polynomial Add(const Polynomial &Pa, const Polynomial &Pb);这个函数的else语句中的Ptrc->next = temp;。
当执行完Ptrc->next = temp;这个语句以后,Pb链表的值被篡改了。
我始终想不明白为什么执行这个语句以后Pb的链表值被篡改了。
求大家的帮助。

原问题在这里:https://pta. 


补充:
我将:
PNode *Ptra = Pa->next,*Ptrb = Pb->next, *Ptrc = Pc;
更改为
const PNode *Ptra = Pa->next,*Ptrb = Pb->next, *Ptrc = Pc;
以后出现如下报错(gcc version 6.3.1):
02.cpp: In function ‘PNode* Add(PNode* const&, PNode* const&)’:
02.cpp:79:20: error: assignment of member ‘PNode::next’ in read-only object
       Ptrc->next = Ptra;
                    ^~~~
02.cpp:79:20: error: invalid conversion from ‘const PNode*’ to ‘PNode*’ [-fpermissive]
02.cpp:83:20: error: assignment of member ‘PNode::next’ in read-only object
       Ptrc->next = Ptrb;
                    ^~~~
02.cpp:83:20: error: invalid conversion from ‘const PNode*’ to ‘PNode*’ [-fpermissive]
02.cpp:90:20: error: assignment of member ‘PNode::next’ in read-only object
       Ptrc->next = temp;
                    ^~~~
02.cpp:96:25: error: assignment of member ‘PNode::next’ in read-only object
   if(Ptra) Ptrc->next = Ptra;
                         ^~~~
02.cpp:96:25: error: invalid conversion from ‘const PNode*’ to ‘PNode*’ [-fpermissive]
02.cpp:97:30: error: assignment of member ‘PNode::next’ in read-only object
   else if(Ptrb) Ptrc->next = Ptrb;
                              ^~~~
02.cpp:97:30: error: invalid conversion from ‘const PNode*’ to ‘PNode*’ [-fpermissive]

为什么看似赋值的语句会出现如上的报错。




[此贴子已经被作者于2017-4-1 22:56编辑过]

搜索更多相关主题的帖子: 多项式 
2017-04-01 22:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:10 
为什么不用C++的vector
2017-04-01 23:26
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
收藏
得分:0 
回复 2楼 rjsp
确实是可以的。
但是这个问题的原因是什么啊?
2017-04-01 23:54
无名可用
Rank: 4
等 级:业余侠客
帖 子:79
专家分:259
注 册:2010-7-27
收藏
得分:10 
能供应提供一组你的输入吗?
2017-04-03 11:02
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
收藏
得分:0 
回复 4楼 无名可用
input:
4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1
output:
5 20 -4 4 -5 2 9 1 -2 0

虽然结果是正确的,但是执行的时候链表值发生了更改.
导致我做链表的乘法时候出现了问题.
2017-04-03 15:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:0 
程序代码:
#include <iostream>
#include <map>

class poly : public std::map<int,int>
{
private:
    poly& erase_zero()
    {
        for( std::map<int,int>::iterator itor=begin(); itor!=end(); )
        {
            if( itor->second == 0 )
                itor = erase( itor );
            else
                ++itor;
        }
        return *this;
    }

    friend poly operator*( const poly& a, const poly& b )
    {
        poly c;
        for( auto& ia : a )
            for( auto& ib : b )
                c[ia.first+ib.first] += ia.second*ib.second;
        return c.erase_zero();
    }

    friend poly operator+( const poly& a, const poly& b )
    {
        poly c = a;
        for( auto& ib : b )
            c[ib.first] += ib.second;
        return c.erase_zero();
    }

    friend std::istream& operator>>( std::istream& is, poly& p )
    {
        size_t len;
        if( is>>len )
        {
            while( len-- )
            {
                int coe, exp;
                if( !(is>>coe>>exp) )
                    break;
                p.emplace(exp,coe);
            }
        }
        return is;
    }

    friend std::ostream& operator<<( std::ostream& os, const poly& p )
    {
        map<int,int>::const_reverse_iterator itor = p.rbegin();
        if( itor == p.rend() )
            os << "0 0";
        else
            for( os<<itor->second<<' '<<itor->first, ++itor; itor!=p.rend(); ++itor )
                os << ' ' << itor->second << ' ' << itor->first;
        return os;
    }
};

using namespace std;

int main( void )
{
    poly a, b;
    cin >> a >> b;

    cout << (a*b) << '\n'
         << (a+b) << endl;
}
2017-04-05 10:32
快速回复:请教一个多项式求和的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033357 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved