我的这个链表为什么会有 Access Violation? 这个是做三元二次多项式相乘的。
#include <iostream.h>
#include <string.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct DXS)
struct DXS
{
int data;
char X;
int Xexop;
char Y;
int Yexop;
struct DXS *next;
};
int main()
{
int SZ[5][5][5];
//char DF[35][10];
// char N[10];
char x= '1 ',y= '2 ',z= '3 '; //当DXS节点的 X 或者Y 的值 是1,2,3 时分别表示 是 x , y ,z.
for(int r=0; r < 5;r++ )
for(int w =0 ;w <5; w++)
for(int O = 0; O < 5; O++)
SZ[r][w][O]=0;
/* 定义几个结点 */
struct DXS a,b,c,d,e,f,g,*p1,*head1;
struct DXS A,B,C,D,E,F,G,*p2,*head2;
/* 初始化 每个结点*/
a.X = '0 '; a.Xexop =0; a.Y= '0 '; a.Yexop =0;
b.X =x; b.Xexop =1; b.Y= '0 '; b.Yexop =0;
c.X =x; c.Xexop =2; c.Y= '0 '; c.Yexop =0;
d.X =y; d.Xexop =1; d.Y= '0 '; d.Yexop =0;
e.X =y; e.Xexop =2; e.Y= '0 '; e.Yexop =0;
f.X =z; f.Xexop =1; f.Y= '0 '; f.Yexop =0;
g.X =z; g.Xexop =2; g.Y= '0 '; g.Yexop =0;
A.X = '0 '; A.Xexop =0; A.Y= '0 '; A.Yexop =0;
B.X =x; B.Xexop =1; B.Y= '0 '; B.Yexop =0;
C.X =x; C.Xexop =2; C.Y= '0 '; C.Yexop =0;
D.X =y; D.Xexop =1; D.Y= '0 '; D.Yexop =0;
E.X =y; E.Xexop =2; E.Y= '0 '; E.Yexop =0;
F.X =z; F.Xexop =1; F.Y= '0 '; F.Yexop =0;
G.X =z; G.Xexop =2; G.Y= '0 '; G.Yexop =0;
/* 把控件里的数赋给结点的data 域 */
A.data =1; //常数项 第一个多项式
B.data =0; //X的系数
C.data =0; //X平方的系数
D.data =0; //Y的系数
E.data =0; //Y平方的系数
F.data =1; //Z的系数
G.data =1; //Z平方的系数
a.data =1; //常数项 第二个多项式
b.data =0; //X的系数
c.data =0; //X平方的系数
d.data =0; //Y的系数
e.data =0; //Y平方的系数
f.data =1; //Z的系数
g.data =1; //Z平方的系数*/
/* 把结点连接成一个链表*/
head1 =&a; a.next= &b; b.next =&c; c.next =&d; d.next=&e; e.next =&f; f.next =&g;g .next =NULL;
head2 =&A; A.next= &B; B.next =&C; C.next =&D; D.next=&E; E.next =&F; F.next =&G;G .next =NULL;
// 上面已经把两个多项是初始化为两个链表,下面要这两个表相乘
struct DXS *p, *v, *q, *head;
int n=0;
p= v = (struct DXS *) malloc (LEN);
// p.data = A.data * a.data;
head =NULL;
for(p1 =head1; p1!=NULL;p1= p1-> next)
for(p2 =head2; p2!= NULL; p2 =p2-> next)
{
n= n+1;
if (n==1) head =p;
else v-> next = p;
v=p;
p =(struct DXS *) malloc (LEN);
if(p1-> X==p2-> X)
{
p-> data =p1-> data*p2-> data;
p-> X= p1-> X;
p-> Xexop=p1-> Xexop+p2-> Xexop;
p-> Y= '0 ';
p-> Yexop= '0 ';
}
else
{
p-> data = p1-> data*p2-> data;
p-> X = p1-> X;
p-> Xexop = p1-> Xexop;
p-> Y = p2-> X;
p-> Yexop = p2-> Xexop;
}
cout < < p-> data;
}
p-> next= NULL; //链表的尾部 赋为空
// 上面是49个节点
// 把 同 类 项 的 系 数 加 起 来
for(q=head; q !=NULL;q=q-> next)//就是这个语句中说有 内存 访问错误
{
n--;
if(q-> X== '0 '&&q-> Y== '0 ') //把常数 计算出来
SZ[0][0][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==x&&q-> Yexop==1)||(q-> X==x&&q-> Y== '0 '&&q-> Xexop==1)) // 计算出 x的系数 下面以此类推
SZ[1][0][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==x&&q-> Yexop==2)||(q-> X==x&&q-> Y== '0 '&&q-> Xexop==2)) //x2
SZ[2][0][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==x&&q-> Yexop==3)||(q-> X==x && q-> Y== '0 ' && q-> Xexop==3)) //x3
SZ[3][0][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==x&&q-> Yexop==4)||(q-> X==x&&q-> Y== '0 '&&q-> Xexop==4)) //x4
SZ[4][0][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==y&&q-> Yexop==1)||(q-> X==y&&q-> Y== '0 '&&q-> Xexop==1)) //y
SZ[0][1][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==y&&q-> Yexop==2)||(q-> X==y&&q-> Y== '0 '&&q-> Xexop==2)) //y2
SZ[0][2][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==y&&q-> Yexop==3)||(q-> X==y&&q-> Y== '0 '&&q-> Xexop==3)) //y3
SZ[0][3][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==y&&q-> Yexop==4)||(q-> X==y&&q-> Y== '0 '&&q-> Xexop==4)) //y4
SZ[0][4][0] +=q-> data;
if((q-> X== '0 '&&q-> Y==z&&q-> Yexop==1)||(q-> X==z&&q-> Y== '0 '&&q-> Xexop==1)) //z
SZ[0][0][1] +=q-> data;
if((q-> X== '0 '&&q-> Y==z&&q-> Yexop==2)||(q-> X==z&&q-> Y== '0 '&&q-> Xexop==2)) //z2
SZ[0][0][2] +=q-> data;
if((q-> X== '0 '&&q-> Y==z&&q-> Yexop==3)||(q-> X==z&&q-> Y== '0 '&&q-> Xexop==3)) //z3
SZ[0][0][3] +=q-> data;
if((q-> X== '0 '&&q-> Y==z&&q-> Yexop==4)||(q-> X==z&&q-> Y== '0 '&&q-> Xexop==4)) //z4
SZ[0][0][4] +=q-> data;
if((q-> X=y&&q-> Y==x&&q-> Yexop==1&&q-> Xexop==2)||(q-> X==x&&q-> Y==y&&q-> Xexop==2&&q-> Yexop==1)) //x2y
SZ[2][1][0] +=q-> data;
if((q-> X=y&&q-> Y==x&&q-> Yexop==2&&q-> Xexop==2)||(q-> X==x&&q-> Y==y&&q-> Xexop==2&&q-> Yexop==2)) //x2y2
SZ[2][2][0] +=q-> data;
if((q-> X==z&&q-> Y==x&&q-> Yexop==1&&q-> Xexop==2)||(q-> X==x&&q-> Y==z&&q-> Xexop==2&&q-> Yexop==1)) //x2z
SZ[2][0][1] +=q-> data;
if((q-> X==z&&q-> Y==x&&q-> Yexop==2&&q-> Xexop==2)||(q-> X==x&&q-> Y==z&&q-> Xexop==2&&q-> Yexop==2)) //x2z2
SZ[2][0][2] +=q-> data;
if((q-> X==x && q-> Y==y && q-> Yexop==1 && q-> Xexop==1 ) || (q-> Y==y && q-> Y==x && q-> Yexop==1 && q-> Xexop==1)) //xy
SZ[1][1][0] +=q-> data;
if((q-> X==x&&q-> Y==y&&q-> Yexop==1&&q-> Xexop==2)||(q-> Y==y&&q-> Y==x&&q-> Yexop==2&&q-> Xexop==1)) //xy2
SZ[1][2][0] +=q-> data;
if((q-> X==z && q-> Y==x && q-> Yexop==1 && q-> Xexop==1) || (q-> X==x && q-> Y==z && q-> Xexop==1 && q-> Yexop==1)) //xz
SZ[0][1][2] +=q-> data;
if((q-> X==x&&q-> Y==z&&q-> Yexop==1&&q-> Xexop==2)||(q-> X==z&&q-> Y==x&&q-> Xexop==2&&q-> Yexop==1)) //xz2
SZ[1][0][2] +=q-> data;
if((q-> X==y&&q-> Y==z&&q-> Yexop==2&&q-> Xexop==1)||(q-> X==z&&q-> Y==y&&q-> Xexop==1&&q-> Yexop==2)) //zy2
SZ[0][2][1] +=q-> data;
if((q-> X==z&&q-> Y==y&&q-> Yexop==2&&q-> Xexop==2)||(q-> X==y&&q-> Y==z&&q-> Xexop==2&&q-> Yexop==2)) //y2z2
SZ[0][2][2] +=q-> data;
if((q-> X==z&&q-> Y==y&&q-> Yexop==2&&q-> Xexop==1)||(q-> X==y&&q-> Y==z&&q-> Xexop==1&&q-> Yexop==2)) //yz2
SZ[0][1][2] +=q-> data;
if((q-> X==z&&q-> Y==y&&q-> Yexop==1&&q-> Xexop==1)||(q-> Y==y&&q-> Y==z&&q-> Yexop==1&&q-> Xexop==1)) //zy
SZ[0][1][1] +=q-> data;
}
return 0;
}
------解决方案--------------------
将原来的这句
for(q=head; q !=NULL;q=q-> next)//就是这个语句中说有 内存 访问错误
换成下面试试,看看行不行
for(q=head; q !=NULL,n> 0;q=q-> next)//就是这个语句中说有 内存 访问错误