|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//各位大佬们,最近有个很大的问题在困扰着我,问题在下面的代码中有描述,代码中的算法是正确的。问题在main函数中
#include <stdio.h>
#include <stdlib.h>
#define max_size 100
typedef struct
{
int i;
int j;
int elem;
}Triple;
typedef struct
{
Triple a[max_size+1];
int rpos[max_size+1];
int hang;
int lie;
int tu;
}wang,*WANG;
void initwang(WANG L)
{
int i;
printf("请输入稀疏矩阵的行数:");
scanf("%d",&L->hang);
printf("请输入稀疏矩阵的列数:");
scanf("%d",&L->lie);
printf("请输入稀疏矩阵的总非零元素个数:");
scanf("%d",&L->tu);
for(i=1;i<=L->tu;i++)
{
printf("请输入该非零元素的行号:");
scanf("%d",&L->a[i].i);
printf("请输入该非零元素的列号:");
scanf("%d",&L->a[i].j);
printf("请输入该非零元素的元素值:");
scanf("%d",&L->a[i].elem);
}
}
void get_info(WANG L,int num[])
{
int i;
L->rpos[1]=1;
for(i=1;i<=L->tu;i++)
{
num[L->a[i].i]++;
}
for(i=2;i<=L->hang;i++)
L->rpos[i]=L->rpos[i-1]+num[i-1];
}
void chengfa(WANG M,WANG N,WANG Q)
{
//WANG Q;
int ctemp[5];
int arow,i,tp,brow,p,t,q,ccol;
//Q=(WANG)malloc(sizeof(wang));
if(M->lie!=N->hang) //如果矩阵的规格不同就无法相乘
{
printf("目标两个矩阵的规格不同,无法相乘.\n");
exit(-1);
}
/*Q->hang=M->hang; //新的矩阵的行是第一个M矩阵的行数,新的矩阵的列数是第二个N矩阵的列数,新的矩阵中元素的数目为0
Q->lie=N->lie;
Q->tu=0;*/
for(arow=1;arow<=M->hang;arow++) //从M矩阵的第一行开始循环,判断条件为行数小于M的最大行数
{
for(i=1;i<=5;i++) //初始化保存累加数据的数组,累加数组的大小其实和N矩阵的列数相等
ctemp[i]=0;
Q->rpos[arow]=Q->tu+1; //初始化Q矩阵的rpos数组,把Q矩阵中第一行的第一个非零元素所存储在三元组顺序表中的位置为第一个位置
if(arow<M->hang) //如果行数小于M的总行数,那么就让tp(判断条件,tp指的是M当前行的下一行第一个元素在M三元组中的位置)
tp=M->rpos[arow+1];
else //否则的话tp的值为M的非零元素数加一
tp=M->tu+1;
for(p=M->rpos[arow];p<tp;p++) //进行循环,应该循环扫描当前行的每一个元素,这里的p是指当前行第一个元素在三元组中的位置
{
brow=M->a[p].j; //根据矩阵相乘的性质,M中第一列的元素应该和N中第一行的元素相乘,这里是取得N中要进行乘积的行号
if(brow<N->hang) //如果brow的小于N的行数就让t的值为下一行的第一个元素,用来当约束条件
t=N->rpos[brow+1];
else //如果不是的话t的值为N的非零元素数目加一
t=N->tu+1;
for(q=N->rpos[brow];q<t;q++) //从当前行的第一个元素开始循环,直到当前行最后一个非零元素(注意这里q指的位置是三元组中的非零元素位置上面的p循环同理)
{
ccol=N->a[q].j; //找到Q矩阵的对应求得的非零元素的列值
ctemp[ccol]=M->a[p].elem*N->a[q].elem; //在累乘数组中进行两个矩阵对应非零元素的相乘,将结果存入数组中
}
}
for(ccol=1;ccol<=Q->lie;ccol++) //循环的将结果数组的值赋给Q,CCOL的值和N的列数相等
{
if(ctemp[ccol]!=0) //如果数组中的值为0就不放入
{
Q->tu++; //Q的总元素值加一
Q->a[Q->tu].elem=ctemp[ccol]; //进行赋值-
Q->a[Q->tu].i=arow;
Q->a[Q->tu].j=ccol;
//ctemp[ccol]=0;
}
}
}
}
int main()
{
int i;
int num1[20],num2[20]; //这里num数组的大小和稀疏矩阵的行数有关
WANG M,N,Q;
M=(WANG)malloc(sizeof(wang));
N=(WANG)malloc(sizeof(wang));
Q=(WANG)malloc(sizeof(wang));
initwang(M);
initwang(N);
Q->hang=M->hang; //新的矩阵的行是第一个M矩阵的行数,新的矩阵的列数是第二个N矩阵的列数,新的矩阵中元素的数目为0
Q->lie=N->lie;
Q->tu=0;
for(i=1;i<=M->hang;i++)
num1[i]=0;
for(i=1;i<=N->hang;i++)
num2[i]=0;
get_info(M,num1);
get_info(N,num2);
chengfa(M,N,Q);
for(i=1;i<=Q->tu;i++) //问题在这里,单步调试后编译器在这里报错(我是VC++编译器),显示的意思是Q的指针无法找到,意思就是Q中的值没有被修改,三元组中的值都是随机的乱码,但是我在上一行的函数中已经将Q的指针传进去了,在函数中进行单步调试发现
函数中的Q中的值已经被正确修改了,也就是说函数中的修改没有被传到主函数中。这个问题我之前也遇到过,不论是网友还是老师都让我用C++中的引用。但是我学业比较忙没有办法系统的学习C++,老师上学期只系统的讲过C语言,所以我
恳请大佬们能够给我个用C语言就可以将代码修改正确的方法。(ps:这个代码讲的是将两个稀疏矩阵相乘,Q是乘了之后的结果矩阵,而且我也试过将输出语句放到乘法函数的最后去输出,但是编译器报错debug error。。而且就是因为这个引用
的问题我二叉树也创建不出来。。。如果我直接在C语言中使用引用编译器会报错)
{
printf("%d ",Q->a[i].i);
printf("%d ",Q->a[i].j);
printf("%d ",Q->a[i].elem);
printf("\n");
}
}
下面这个程序正确吗?为什么?
- #include <stdio.h>
- int main(void)
- {
- int data[5];
- for(int i = 1; i <= 5; ++i)
- data[i] = 0;
- return 0;
- }
复制代码
|
|