在稀疏矩阵的乘法运算过程中运行出现“0xC0000005: 读取位置 0x9A696484 时发生访问冲突。”情况,找了很久都没发现问题,编程小白寻求各位大神帮忙。
稀疏矩阵的乘法那块我是根据严蔚敏的数据结构改写的,出现了错误不知道如何修改。
以下为代码:
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#define MAXSIZE 100
typedef int DataType;
typedef struct
{
int row, col;
DataType value;
}Triple;
typedef struct
{
Triple data[MAXSIZE + 1];
int SqPos[10];
int mu, nu, tu;
}SMaxtrix;
SMaxtrix CreateSMaxtrix() //创建矩阵
{
SMaxtrix M;
int i;
printf("请输入行数");
scanf_s("%d", &M.mu); //输入行数
printf("请输入列数");
scanf_s("%d", &M.nu); //输入列数
printf("请输入非0的个数");
scanf_s("%d", &M.tu);
while (M.tu > M.mu*M.nu)
{
printf("输入错误,请重新输入\n");
scanf_s("%d", &M.tu);
}
for (i = 0; i < M.tu; i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(0~%d),""列(0~%d),元素值:(逗号分隔)\n", i, M.mu-1, M.nu-1);
scanf_s("%d,%d,%d", &M.data[i].row, &M.data[i].col, &M.data[i].value);
}
return M;
}
void PrintM(SMaxtrix M)
{
int i;
printf("\n %d行%d列%d个非零元素。\n", M.mu, M.nu, M.tu);
printf("%4s %4s %8s\n", "row", "col", "value");
for (i = 0; i < M.tu; i++)
{
printf("%4d %4d %8d\n", M.data[i].row, M.data[i].col, M.data[i].value);
}
}
SMaxtrix TransMatrix(SMaxtrix M) //矩阵转置
{
SMaxtrix T;
int rowsize[MAXSIZE];
int rowstart[MAXSIZE];
int i, j, k;
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
if (T.tu > 0)
{
for (j = 0; j < M.nu; j++)
rowsize[j] = 0;
for (i = 0; i < M.tu; i++)
{
j = M.data[i].col;
rowsize[j] = rowsize[j] + 1;
}
printf("\n rowsize[]:");
for (i = 0; i < M.nu; i++)
printf(" %d ", rowsize[i]);
printf("\n");
rowstart[0] = 0;
for (j = 1; j < M.nu; j++)
rowstart[j] = rowstart[j - 1] + rowsize[j - 1];
printf("\n rowstart[]:");
for (i = 0; i < M.nu; i++)
printf("%d ", rowstart[i]);
printf("\n");
for (i = 0; i < M.tu; i++)
{
j = M.data[i].col;
k = rowstart[j];
T.data[k].row = M.data[i].col;
T.data[k].col = M.data[i].row;
T.data[k].value = M.data[i].value;
rowstart[j] = rowstart[j] + 1;
}
}
return T;
}
void MultSMaxtrix(SMaxtrix M, SMaxtrix Q)//稀疏矩阵乘法
{
SMaxtrix N;
int ctemp[MAXSIZE + 1];
int tp,p,brow=0,t,q,ccol;
if (M.nu != Q.mu)
printf("error");
N.mu = M.mu;
N.nu = Q.nu;
N.tu = 0;//矩阵N初始化
if (M.tu*Q.tu != 0)//N是非零矩阵
{
for (int i = 1; i <= M.mu; i++)//处理M的每一行
{
ctemp[0] = 0;//当前行个元素累加器清零
N.SqPos[i] = N.tu + 1;
if (i < M.mu)
tp = M.SqPos[i + 1];
else
{
tp = M.tu + 1;
}
for (p = M.SqPos[i]; p < tp; p++)//对当前行中每一个非零元
{
brow = M.data[p].col;//找到对应元在N中的行号(编译后这里出现问题!!)
if (brow < M.mu)
t = Q.SqPos[brow + 1];
else
{
t = Q.tu + 1;
}
for (q = Q.SqPos[brow]; q < t; ++q)
{
ccol = Q.data[q].col;//乘积元素在N中列号
ctemp[ccol] += M.data[p].value * Q.data[p].value;
}//for q
}
for(ccol =1;ccol<=N.nu;ccol++)//压缩存储该行非零元
if (ctemp[ccol])
{
if (++N.tu > MAXSIZE)
printf("error");
N.data[N.tu].row = i;
N.data[N.tu].col = ccol;
N.data[N.tu].value = ctemp[ccol];
}
}
}
PrintM(N);
}
main()
{
SMaxtrix M;
M = CreateSMaxtrix();
PrintM(M);
printf("\n");
SMaxtrix T;
T = TransMatrix(M);
PrintM(T);
SMaxtrix Q;
Q = CreateSMaxtrix();
PrintM(Q);
printf("\n");
MultSMaxtrix(M, Q);
}