一元稀疏多项式的问题

tomotayuki 2009-03-08 10:53:11
那个这是一道用单链表实现一元稀疏多项式的代码,在执行(x^1+x^2+x^3)+0时总是出现Access Violation,不知为什么?
特此求教,不甚感激
#include<iostream>
using namespace std;

typedef struct DXS{ //定义一个多项式的结构体
double c,e; //c,e分别为系数和指数
int flag; //标记
struct DXS *next;
}DXS;

void out(DXS *l,DXS *head,int a) //输出函数,参数为结点、头指针、多项式项数
{
if(a==0) //如果项数为0,则多项式为0
cout<<0;
for(int m=1;m<=a;m++)
{
if(l->e==1)
{
if(l==head) //分析第一个结点
{
if( l->flag==-1) //输出几个特殊的系数
{l=l->next;}
else if(l->c==0)
{cout<<l->c;l=l->next;}
else if(l->e==0)
{cout<<l->c;l=l->next;}
else if(l->c==1)
{cout<<"x";l=l->next;}
else if(l->c==-1)
{cout<<"-x";l=l->next;}
else {cout<<l->c<<"x";l=l->next;}
}
else //分析第一个之后的结点
{
if( l->flag==-1) //输出几个特殊结点
{l=l->next;}
else if(l->c==0)
{l=l->next;}
else if(l->e==0)
{
if(l->c>0){cout<<"+"<<l->c;l=l->next;}
else {cout<<l->c;l=l->next;}
}
else if(l->c==1)
{cout<<"+x^";l=l->next;}
else if(l->c==-1)
{cout<<"-x";l=l->next;}
else if(l->c>0)
{cout<<"+"<<l->c<<"x";l=l->next;}
else if(l->c<0)
{cout<<l->c<<"x";l=l->next;}
}
}
else
{
if(l==head) //分析第一个结点
{
if( l->flag==-1) //输出几个特殊的系数
{l=l->next;}
else if(l->c==0)
{cout<<l->c;l=l->next;}
else if(l->e==0)
{cout<<l->c;l=l->next;}
else if(l->c==1)
{cout<<"x^"<<l->e;l=l->next;}
else if(l->c==-1)
{cout<<"-x^"<<l->e;l=l->next;}
else {cout<<l->c<<"x^"<<l->e;l=l->next;}
}
else //分析第一个之后的结点
{
if( l->flag==-1) //输出几个特殊结点
{l=l->next;}
else if(l->c==0)
{l=l->next;}
else if(l->e==0)
{
if(l->c>0){cout<<"+"<<l->c;l=l->next;}
else {cout<<l->c;l=l->next;}
}
else if(l->c==1)
{cout<<"+x^"<<l->e;l=l->next;}
else if(l->c==-1)
{cout<<"-x^"<<l->e;l=l->next;}
else if(l->c>0)
{cout<<"+"<<l->c<<"x^"<<l->e;l=l->next;}
else if(l->c<0)
{cout<<l->c<<"x^"<<l->e;l=l->next;}
}
}
}
}

void down(DXS *l1,DXS *l2,int b) //多项式指数降序排列函数
{
double f,g;
for(int c=b;c>1;c--)
{ for(int d=1;d<c;d++)
{
if(l1->e<l1->next->e)
{
f=l1->e;l1->e=l1->next->e;l1->next->e=f;
g=l1->c;l1->c=l1->next->c;l1->next->c=g;
}
l1=l1->next;
}
l1=l2;
}
}

void up(DXS *l1,DXS *l2,int b) //多项式指数升序排列函数
{
double f,g;
for(int c=b;c>1;c--)
{ for(int d=1;d<c;d++)
{
if(l1->e>l1->next->e)
{
f=l1->e;l1->e=l1->next->e;l1->next->e=f;
g=l1->c;l1->c=l1->next->c;l1->next->c=g;
}
l1=l1->next;
}
l1=l2;
}
}


int arrange(DXS *s,DXS *head,int &b) //检测多项式中有没有相同项,若有,则合并为一项
{
for(int c=b;c>1;c--)
{
if(s->e==s->next->e)
{
s->next->c = s->c + s->next->c;
s->flag=-1;
if(s->next->c==0)
b--;
b--;
}
s=s->next;
}
return b;
}

int main()
{
DXS *pa,*pb,*pc; //定义三个多项式的结点
DXS *la,*lb,*lc; //定义三个多项式的头指针
DXS *p,*q,*s;
int n1,n2,n3,na,nb,nc; //多项式项数
int i,j=0;
char Q,Y;
while(1){
la=pa=new DXS; //为多项式A,B结点分配空间,并指向头指针
lb=pb=new DXS;

cout<<"请输入多项式A的项数(多项式为0,则算一项):";
cin>>n1;
na=n1; //保存第一条多项式的项数
cout<<"请输入A的数据(按升序输入:第一项系数,第一项指数,第二项系数,第二项指数.....若为0,则输入0 0):"<<endl;
for(i=1;i<=n1;i++) //输入第一条多项式的数据
{
cin>>pa->c>>pa->e;
p=pa;
pa=new DXS;
p->next=pa;
}

cout<<endl<<endl;

cout<<"请输入多项式B的项数(多项式为0,则算一项):";
cin>>n2;
nb=n2; //保存第二条多项式的项数
cout<<"请输入B的数据(按升序输入:第一项系数,第一项指数,第二项系数,第二项指数.....若为0,则输入0 0):"<<endl;
for(i=1;i<=n2;i++) //输入第一条多项式的数据
{
cin>>pb->c>>pb->e;
q=pb;
pb=new DXS;
q->next=pb;
}

pa=la; //重新指向头指针
pb=lb;

cout<<endl<<endl;

cout<<"你希望做+/-:"; //选择多项式相加还是相减
cin>>Q;
cout<<"希望降序还是升序排列(S:升序/J:降序):";
cin>>Y;

cout<<endl<<endl<<endl<<endl;

cout<<"(";
out(pa,la,na); //输出多项式A并指回头指针
cout<<")";
pa=la;

if(Q=='+')
cout<<endl<<endl<<" +"<<endl<<endl;
else
cout<<endl<<endl<<" -"<<endl<<endl;

cout<<"(";
out(pb,lb,nb); //输出多项式B并指回头指针
pb=lb;
cout<<")";

if(Q=='-') //若相减,则多项式B各系数相反
{
for(i=1;i<=n2;i++)
{
pb->c=(-1)*pb->c;
pb=pb->next;
}
pb=lb;
}
else ;

lc=pc=new DXS; //为多项式C结点分配空间,并指向头指针

if(n1==1&&la->c==0) //关于有多项式为0的处理
n1--;
else if(n2==1&&lb->c==0)
n2--;

while(n1>0&&n2>0) //两个不为0的多项式的运算,结果放到C中
{
if(pa->e>pb->e)
{
pc->c=pb->c;
pc->e=pb->e;
pb=pb->next;
pc->flag=0;
s=pc;
pc=new DXS; //重新分配结点空间
s->next=pc;
j++;
n2--;
}
else if(pa->e<pb->e)
{
pc->c=pa->c;
pc->e=pa->e;
pa=pa->next;
pc->flag=0;
s=pc;
pc=new DXS;
s->next=pc;
j++;
n1--;
}
else if(pa->e==pb->e)
{
if(pa->c+pb->c!=0)
{
pc->c=pa->c+pb->c;
pc->e=pa->e;
pa=pa->next;
pb=pb->next;
pc->flag=0;
s=pc;
pc=new DXS;
s->next=pc;
j++;
n1--;
n2--;
}
if(pa->c+pb->c==0)
{
pa=pa->next;
pb=pb->next;
n1--;
n2--;
}
}
}
while(n1>0) //把较长的多项式的其余部分放到C中
{
pc->c=pa->c;
pc->e=pa->e;
pa=pa->next;
pc->flag=0;
s=pc;
pc=new DXS;
s->next=pc;
j++;
n1--;
}
while(n2>0)
{
pc->c=pb->c;
pc->e=pb->e;
pb=pb->next;
pc->flag=0;
s=pc;
pc=new DXS;
s->next=pc;
j++;
n2--;
}
nc=n3=j; //结果多项式的项数

cout<<endl<<endl<<" ="<<endl<<endl;

if(Y=='J')
{
pc=lc;
down(pc,lc,nc); //把多项式C降序排列
}
else if(Y=='S')
{
pc=lc;
up(pc,lc,nc);
}

pc=lc;
arrange(pc,lc,n3);

cout<<"(";
pc=lc;
out(pc,lc,nc); //输出多项式C
cout<<")";

if(n3==0)
cout<<" "<<"(多项式共有"<<" "<<1<<" "<<"项)";
else
cout<<" "<<"(多项式共有"<<" "<<n3<<" "<<"项)";

cout<<endl<<endl<<endl;

}
return 0;
}
...全文
146 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangd_123 2009-03-26
  • 打赏
  • 举报
回复
太多了,实在不想看,但是问题很明显,是指针指空了或是数据越界

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧