小白白白白白白白白呀 2021-04-27 22:21 采纳率: 0%
浏览 18

C语言关于稀疏矩阵压缩后输出,输出不知道为什么会这样子,如何改进。

问题:输出A这个结构体数组的第一行为啥是一串奇怪的数据,还有为啥子少了一个非零的元素?

编译软件是Code::Blocks 20.03的版本,VC++6.0我也试了_(:з」∠)_也不行,所以就是某个地方不对劲,但是我找不出来。

代码如下。

#include<stdio.h>
#define M 4
typedef struct
{
	int i;
	int j;
	int k;
}DataType;

typedef struct
{
	int md;
	int nd;
	int td;
}TriType;

// 压缩矩阵
void Cut_Maxtri(DataType A[], TriType *T , int a[M][M])
{
	int i, j , temp=0;

	for(i=0 ; i<M ; i++)
		for(j=0 ; j<M ; j++)
		{
			if(a[i][j] == 0) continue;
			else
			{
				temp ++;
				A[temp].i = i;
				A[temp].j = j;
				A[temp].k= a[i][j];
			}
		}
	T->td = temp;
}

//输出矩阵
void Show_Matri(int a[M][M])
{
	int i, j;

	for(i=0 ; i<M ; i++)
	{
		for(j=0 ; j<M ; j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}

}
//输出线性表
void Show_List(DataType A[], TriType T)
{
	int i;

	for(i=0 ; i<T.td ; i++)
	{
		printf("%d",A[i].i+1);
		printf("\t%d",A[i].j+1);
		printf("\t%d\n",A[i].k);
	}
	printf("\n");
}

int main()
{
	int a[M][M]={0,1,0,5,4,0,0,0,0,0,7,0,8,0,9,0};
	int b[M][M]={2,0,0,7,0,0,6,0,9,0,1,0,0,0,0,0};
	DataType A[M*M], B[M*M], C[M*M], D[M*M];
	TriType T1, T2 , S;

	printf("矩阵a:\n");
	Show_Matri(a);
	printf("矩阵b:\n");
	Show_Matri(b);
	//压缩
	Cut_Maxtri(A, &T1, a);
	Cut_Maxtri(B, &T2, b);
	printf("矩阵a压缩后的线性表:\n");
	printf("i\tj\tk\n");
	Show_List(A, T1);
	printf("\n");
	printf("矩阵b压缩后的线性表:\n");
	printf("i\tj\tk\n");
	Show_List(B, T2);

	return 0;
}

运行结果如下。

  • 写回答

1条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-11 14:14
    关注

    你的问题在于数组A[]的索引应该从0开始,而不是从1。所以,你应该将Cut_Maxtri()函数中的temp初始化为-1而不是0。

    以下是修改后的Cut_Maxtri()函数:

    void Cut_Maxtri(DataType A[], TriType *T , int a[M][M])
    {
        int i, j , temp=-1; // temp应该初始化为-1,而不是0
     
        for(i=0 ; i<M ; i++)
            for(j=0 ; j<M ; j++)
            {
                if(a[i][j] == 0) continue;
                else
                {
                    temp ++;
                    A[temp].i = i;
                    A[temp].j = j;
                    A[temp].k= a[i][j];
                }
            }
        T->td = temp + 1; // 这里需要加1,因为数组的长度应该是索引值+1
    }
    

    这样,A[]的第一行就会是正确的数据,且非零元素的数量也不会少一个。另外,我注意到你定义了结构体数组C[]D[],但是并没有在代码中使用,可能是你尚未完成的代码部分。

    评论

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集