关于多项式加减的问题

shuikexiaoqiao 2008-04-05 12:37:00
main.exe - 应用程序错误
"0x0040176e"指令引用的“0x00000000”内存。该内存不能为“read”。
next CXX0030: Error: expression cannot be evaluated
等等错误。
...全文
291 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yejuanjuan 2008-04-07
  • 打赏
  • 举报
回复
怎么都是一元多项式,有没有人会多元多项式。急用
jieao111 2008-04-06
  • 打赏
  • 举报
回复
少了new...前几天我也老出这个问题
jixingzhong 2008-04-06
  • 打赏
  • 举报
回复
调试一下吧,各个函数入口断点,看看执行到哪个函数后出错,检查这个函数就可以了

这种错误类型,
最大的可能就是 野指针
Treazy 2008-04-05
  • 打赏
  • 举报
回复
哎,能不能把格式好好弄下,我看这个就是很晕
shuikexiaoqiao 2008-04-05
  • 打赏
  • 举报
回复
[b]这是源程序 程序包裹四部分 main.cpp ds.h LinkList.h polynomail.h [/b]
shuikexiaoqiao 2008-04-05
  • 打赏
  • 举报
回复
#include<stdio.h>
#include"polynomail.h"


LinkList La;
LinkList Lb;

void main()
{
int n,m;
printf("请第一个输入一元多项式的项数");
scanf("%d",&n);
CreatPolyn(La,n);//输入多项式
printf("第一个多项式如下:");
PrintPolyn(La,n);//打印多项式
printf("请第二个输入一元多项式的项数");
scanf("%d",&m);
CreatPolyn(Lb,m);//输入多项式
printf("第二个多项式如下:");
PrintPolyn(Lb,m);//打印多项式
printf("两多项相加的结果如下:");
AddPolyn(La,Lb);//相加
PrintPolyn(La,La.len);//打印多项式
printf("两多项式相减的结果如下:");
SubtractPolyn(La,Lb);//相减
PrintPolyn(La,La.len);//打印多项式
}



#include<stdio.h>



// 函数结果状态代码
const int TRUE = 1;
const int FALSE = 0;
const int OK = 1;
const int ERROR = 0;
const int INFEASIBLE = -1;
const int OVERFLOW = -2;

// Status 是函数的类型,其值是函数结果状态代码
typedef int Status;



#include <stdlib.h>
#include<stdio.h>


#include "ds.h" //for Status,OK ...

typedef struct {//项的表示,多项式的项作为LinkList的数据元素
float coef;//系数
int expn;//指数
}term,ElemType;
/**********************************************************
* 单链表的存储结构定义
***********************************************************/
typedef struct LNode {//结点类型
ElemType data;
struct LNode *next;
} *Link,*Position,Lin;
typedef struct{//链表类型
Link head,tail;//分别指向线性链表中的头结点和最后一个结点
int len;//指向线性链表中数据元数的个数
}LinkList;

int cmp(term a,term b)
{//比较a,b的数值,分别返回-1,0,1
if(a.expn<b.expn)
return -1;
if(a.expn==b.expn)
return 0;
if(a.expn>b.expn)
return 1;
}
/**********************************************************
* 单链表的基本操作声明
***********************************************************/

Status MakeNode(Link &p,ElemType e);
//分配由p指向的值为e的结点,并返回OK,若分配失败,则返回ERROR
void FreeNode(Link &p);
//释放p所指空间
Status InitList(LinkList &L);
//构建一个空的线性链表L
Status InsFirst(LinkList &L,Link h,Link s);
//将s所指结点插入在h结点之后
Status DelFirst(LinkList &L,Link h,Link q);
// 删除链表中的h结点之后的结点q
Status Append(LinkList &L,Link s);
//将指针s所指(彼此以指针相连)的结点链接在线性链表L的最后一个结点
//之后,并改变链表L的尾指针指向新的尾结点
Status SetCurElem(Link &p,ElemType e);
//已知p指向线性链表中的一个结点,用e更新p所指结点中的数据元素的值
ElemType GetCurElem(Link p);
//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
Status ListEmpty(LinkList L);
//若线性链表L为空表,则返回TRUE,否则返回FALSE
Position GetHead(LinkList L);
//f返回线性链表L中头结点的位置
Position NextPos(LinkList L,Link p);
//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置,
//若没后继,则返回NULL
Status LocateElem(LinkList L,ElemType e,Position &q);
// 若有序链表L中纯在与e满足判定函数compare()取值为0的元素,则q指示L中第一个
//值为e的结点的位置,并返回TRUE,否则返回q指示与e满足版定函数compare()取值大于0的
//元素的前驱的位置,并返回FALSE
/**********************************************************
* 单链表的基本操作的实现
***********************************************************/

//给节点变量分配空间
Status MakeNode(Link &p,ElemType e)
{
p=(Link)malloc(sizeof(LNode));
if(!p) return ERROR;
else
return OK;
}
//释放p所指的结点
void FreeNode(Link &p)
{
free(&p);
p=NULL;
}
//构造一个空的线性链表L
Status InitList(LinkList &L)
{

L.head=L.tail=(Link)malloc(sizeof(LNode));
L.len=0;
return OK;
}
//在h结点之后插入一个结点
Status InsFirst(LinkList &L,Link h,Link s)
{

s->next=h->next;
h->next=s;
L.len++;
if(!s->next)
L.tail=s;
return OK;
}
//删除链表中的h结点之后的结点q
Status DelFirst(LinkList &L,Link h,Link q)
{
if(h->next==NULL)
return ERROR;

q=h->next;
h->next=q->next;
L.len--;
if(!q->next)
L.tail=h;

return OK;


}
//将s所指的结点接在线性表L之后
Status Append(LinkList &L,Link s)
{
int i=0;
Link q=s;
Link p;
while(s)
{
p=s;
s=s->next;
i++;
}
L.tail->next=q;
L.tail=p;
L.len+=i;
return OK;
}
//用元数e更新p所指结点中元数的值
Status SetCurElem(Link &p,ElemType e)
{
p->data=e;
return OK;
}
//返回p所指结点中数据元数的值
ElemType GetCurElem(Link p)
{
return p->data;
}
//判断线性链表是否是空
Status ListEmpty(LinkList L)
{
if(L.head==L.tail==NULL)
return TRUE;
else
return FALSE;
}
//返回线性链表头结点的位置
Position GetHead(LinkList L)
{
return L.head;
}
//返回p结点直接后继的位置
Position NextPos(LinkList L,Link p)
{
if(p->next==NULL)
return NULL;
else
return p->next;
}
//返回第一个与e相等的节点的位置
Status LocateElem(LinkList L,ElemType e,Position &q)
{
Position s,p=L.head;
ElemType m;
while(p->next)
{
s=p;
p=p->next;
m=p->data;
if(cmp(e,m )==0)
{

q=p;
return TRUE;
}
if(cmp(e,m)>0 )
{
q=s;
return FALSE;

}


}

}


#include"Linklist.h"

typedef LinkList polynomail;

//----一些函数的声明-----------
void CreatPolyn(polynomail &p,int m);
//输入m项的系数和指数,建立表示一元多项式的有序链表p
void DestroyPolyn(polynomail &p);
//销毁一元多项式p
void Printpolyn(polynomail p,int m);
//打印输出一元多项式p
void AddPolyn(polynomail &pa,polynomail &pb);
//完成多项式的相加运算,即Pa=Pa+Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomail &Pa,polynomail &Pb);
// 完成多项式的相减运算,即Pa=Pa-Pb,并销毁一元多项式Pb

//----------基本操作的实现---------------------

void CreatPolyn(polynomail &P,int m)
{//输入m项的系数和指数,建立表示一元多项式的有序链表P
InitList(P); Link h=GetHead(P);
term e;
Position q,s;
e.coef=0.0; e.expn=-1;
SetCurElem(h,e);//设置头节点的数据元素
for(int i=1;i<=m;i++)
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateElem(P,e,q))//当前链表中不存在该指数项
if(MakeNode(s,e)) InsFirst(P,q,s);//生成节点并插入链表
}
void Destroypolyn(polynomail &p)
{//销毁一元多项式
Link k;
while(p.head ->next!=NULL)
{
k=p.head ;
p.head =p.head ->next ;
free(k);
}
free(&p);
}
void PrintPolyn(polynomail p,int m)
{//打印输出一元多项式p
Link ha=GetHead(p);
Link qa;
term e;
for(int i=1;i<=m;i++)
{

qa=NextPos(p,ha);
e=GetCurElem(qa);
printf("%f,%d",e.coef,e.expn);
printf(";");
ha=qa;
}
}

void AddPolyn(polynomail &Pa,polynomail &Pb)
{
//多项式加法;pa=pa+pb,利用两个多项式的节点构成“和多项式”
Link ha=GetHead(Pa);
Link hb=GetHead(Pb);//ha和hb分别指向pa和pb的头节点
Link qa=NextPos(Pa,ha);
Link qb=NextPos(Pb,hb);
while(qa&&qb)
{//qa,qb均非空
term a=GetCurElem(qa);
term b=GetCurElem(qb);
switch(cmp(a,b))//a和b为两表比较元数
{
case -1:
ha=qa;
qa=NextPos(Pa,qa);
break;
case 0:
a.coef =a.coef+b.coef;

if(a.coef !=0.0)
{ //修改多项式Pa中当前结点的系数
SetCurElem(qa,a);
ha=qa;
}
else
{ //删除多项式Pa中当前结点
DelFirst(Pa,ha,qa);
FreeNode(qa);
}
DelFirst(Pb,hb,qb);
FreeNode(qb);
qb=NextPos(Pb,hb);
qb=NextPos(Pa,ha);
break;
case 1: //多项式Pb中当前结点的指数最小
InsFirst(Pa,ha,qb);
DelFirst(Pb,hb,qb);

qb=NextPos(Pb,hb);
ha=NextPos(Pa,hb);
break;
}
}
if(!ListEmpty(Pb))
Append(Pa,qb);//链接Pb中剩余结点
FreeNode(hb);//释放Pb的结点
}

void SubtractPolyn(polynomail &Pa,polynomail &Pb)
{//多项式减法;pa=pa-pb,利用两个多项式的节点构成“减多项式”
Link ha=GetHead(Pa);
Link hb=GetHead(Pb);//ha和hb分别指向pa和pb的头节点
Link qa=NextPos(Pa,ha);
Link qb=NextPos(Pb,hb);
term b;
while(qa&&qb)
{//qa,qb均非空
term a=GetCurElem(qa);
b=GetCurElem(qb);
switch(cmp(a,b))//a和b为两表比较元数
{
case -1:
ha=qa;
qa=NextPos(Pa,qa);
break;
case 0:
a.coef=a.coef-b.coef;
if(a.coef!=0.0)
{ //修改多项式Pa中当前结点的系数
SetCurElem(qa,a);
ha=qa;
}
else
{ //删除多项式Pa中当前结点
DelFirst(Pa,ha,qa);
FreeNode(qa);
}
DelFirst(Pb,hb,qb);
FreeNode(qb);
qb=NextPos(Pb,hb);
qb=NextPos(Pa,ha);
break;
case 1: //多项式Pb中当前结点的指数最小

b.coef=-b.coef;
SetCurElem(qb,b);

InsFirst(Pa,ha,qb);
DelFirst(Pb,hb,qb);
qb=NextPos(Pb,hb);
ha=NextPos(Pa,hb);
break;
}
}
while(!ListEmpty(Pb))
{
b.coef=-b.coef;
SetCurElem(qb,b);
InsFirst(Pa,ha,qb);
DelFirst(Pb,hb,qb);
qb=NextPos(Pb,hb);
b=GetCurElem(qb);
}

FreeNode(hb);//释放Pb的结点
}



shuikexiaoqiao 2008-04-05
  • 打赏
  • 举报
回复
你们看看程序在说啊
HelloDan 2008-04-05
  • 打赏
  • 举报
回复
这不是玩我吗?根本下载不了。
Treazy 2008-04-05
  • 打赏
  • 举报
回复
没猜错 的话是指针的问题

指针指向了0但是还是调用了方法
lw1a2 2008-04-05
  • 打赏
  • 举报
回复
估计是没申请就用
delge 2008-04-05
  • 打赏
  • 举报
回复
问题应该定位在LocateElem函数。
星羽 2008-04-05
  • 打赏
  • 举报
回复

void CreatPolyn(polynomail &P,int m)
{//输入m项的系数和指数,建立表示一元多项式的有序链表P
InitList(P); Link h=GetHead(P);
term e;
Position q,s; // 这里的q,s都没分配空间
e.coef=0.0; e.expn=-1;
SetCurElem(h,e);//设置头节点的数据元素
for(int i=1;i <=m;i++)
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateElem(P,e,q))//当前链表中不存在该指数项
if(MakeNode(s,e)) InsFirst(P,q,s);//生成节点并插入链表
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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