首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

数据结构的一个cxx0030异常。求解

2013-08-29 
数据结构的一个cxx0030错误。求解编译通过了运行时出现错误求解#includestdio.h#includemalloc.h//****

数据结构的一个cxx0030错误。求解
编译通过了运行时出现错误求解

#include<stdio.h>
#include<malloc.h>


//**************创建结构体*************************
typedef struct Node
{
float a;         //系数
int b;           //指数
struct Node *next;//指针域
}*No,Node; // No为指针类型


//**************构造多项式*************************
void Insert(No p,No h)
{
No q1,q2;
if(p->a==0)
free(p);
else
{
q1=h;
q2=h->next;
while(q2&&p->b<q2->b)
{
q1=q2;
q2=q2->next;
}
if(q2&&p->b==q2->b)
{
q2->b=q2->b+p->b;
    free(p);
if(q2->a==0)
{
q1->next=q2->next;
    free(q2);
}
}
else
{
p->next=q2->next;
q1->next=p;
}
}
}//多项式构造函数
No ConstructNode(No head,int d)
{
int i;
No p;
p=(No)malloc(sizeof(struct Node));
p=head;
head->next=NULL;//显示在这出错
for(i=0;i<d;i++)
{
p=(No)malloc(sizeof(struct Node));
printf("请输入第%d项的系数和指数",i+1);
scanf("%f %d",&p->a,&p->b);//获得数据
Insert(p,head);//调用函数
}
return head;
}





//****************输出多项式***********************
void PrintfNode(No p)
{
No q;
q=p->next;
int flag=1;     //项数计数
if(!q)
{
putchar('0');
printf("\n");
}
while(q)
{
if(q->a>0&&flag!=1)putchar('+');

if(q->a==1)
{
if(q->b==0)putchar('1');
else if(q->b==1)putchar('X');
else printf("X^%d",q->b);
}
else
{
if(q->a==-1)
{
if(q->b==0)putchar('-1');
else if(q->b==1)putchar('-X');
else printf("-X^%d",q->b);
}
else
{
if(q->b==0)printf("%f",q->a);
else if(q->b==1)printf("%fX",q->a);
else printf("%fX^%d",q->a,q->b);
}
q=q->next;
flag++;
}
}
printf("\n");
}//输出




//******************情况分析**************************
int compare(No pa,No pb)
{
if(pa&&pb)
{
if(!pb||pa->b>pb->b)return 1;


else if(!pa||pa->b<pb->b)return -1;
else return 0;
}
else if (!pa&&pb)return -1;
else return 1;
}



//******************多项式加减法***********************
No AddNode(No x,No y)
{
No m=x->next;
No n=y->next;
No headc,hc,z;
hc=(No)malloc(sizeof(struct Node));
hc->next=NULL;//建立头结点
headc=hc;
while(m||n)
{
z=(No)malloc(sizeof(struct Node));
switch (compare(m,n))
{
case 1://x不等于0,y等于0
{
z->a=x->a;
        z->b=x->b;
x=x->next;
break;
}
case -1://x等于0;y不等于0
{
z->a=y->a;
z->b=y->b;
y=y->next;
break;
}
case 0://xy均不等于0
{
z->a=x->a+y->a;
z->b=x->b;
x=x->next;
y=y->next;
break;
}
}
if(z->a!=0)
{
z->next=hc->next;
hc->next=z;
hc=z;
}//相加系数为0
else free(z);
}
return headc;
}


No subNode(No x,No y)
{
No m=x->next;
No n=y->next;
No headc,hc,z;
hc=(No)malloc(sizeof(struct Node));
hc->next=NULL;//建立头结点
headc=hc;
while(m||n)
{
z=(No)malloc(sizeof(struct Node));
switch (compare(m,n))
{
case 1://x不等于0,y等于0
{
z->a=x->a;
        z->b=x->b;
x=x->next;
break;
}
case -1://x等于0;y不等于0
{
z->a=-y->a;
z->b=y->b;
y=y->next;
break;
}
case 0://xy均不等于0
{
z->a=x->a-y->a;
z->b=x->b;
x=x->next;
y=y->next;
break;
}
}
if(z->a!=0)
{
z->next=hc->next;
hc->next=z;
hc=z;
}//相减系数为0
else free(z);
}
return headc;
}
//***************删除多项式*************************

void Destroy(No p)
{
if (p->next==NULL)
free(p);
else
{
No q1,q2;
    q1=p->next;
    q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
}       //删除


//***************测试函数*****************************



void main()
{
int i,j,flag=0;
No na=0,nb=0,nc,nd;
printf("输入多项式a的项数:");
scanf("%d",&i);
na=ConstructNode(na,i);

printf("输入多项式b的项数:");
scanf("%d",&j);
na=ConstructNode(nb,j);


printf("多项式a为:");PrintfNode(na);
printf("多项式b为:");PrintfNode(nb);

nc=AddNode(na,nb);
printf("多项式a+b为:");PrintfNode(nc);
nd=subNode(na,nb);
printf("多项式a-b为:");PrintfNode(nc);

Destroy(na);
Destroy(nb);


}



[解决办法]


//改成这样吧!你之前的已经在栈上分配内存空间的!
No *p;
p=(No*)malloc(sizeof(struct Node));


[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

[解决办法]
na或者nb为空,传到你的ConstructNode后,head为空,结果导致空指针访问. 
具体看我的注释(//**后面的内容)

void main()
{
int i,j,flag=0;
No na=0,nb=0,nc,nd;   
printf("输入多项式a的项数:");
scanf("%d",&i);
na=ConstructNode(na,i);  //** na 为空

printf("输入多项式b的项数:");
scanf("%d",&j);
na=ConstructNode(nb,j);  //** nb 为空
...
}

No ConstructNode(No head,int d)
{
int i;
No p;
p=(No)malloc(sizeof(struct Node));
p=head;                     //** na传进来后,head为空,赋值后p为空.你的意思可能是head=p;
head->next=NULL;//显示在这出错
for(i=0;i<d;i++)
{
p=(No)malloc(sizeof(struct Node));
printf("请输入第%d项的系数和指数",i+1);
scanf("%f %d",&p->a,&p->b);//获得数据
Insert(p,head);//调用函数
}
return head;
}

热点排行