| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2266 人关注过本帖
标题:请教一个多项式求和的问题
取消只看楼主 加入收藏
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
结帖率:41.18%
收藏
已结贴  问题点数:20 回复次数:2 
请教一个多项式求和的问题
程序代码:
#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
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
收藏
得分:0 
回复 2楼 rjsp
确实是可以的。
但是这个问题的原因是什么啊?
2017-04-01 23:54
家力掠
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
快速回复:请教一个多项式求和的问题
数据加载中...
 
   



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

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