这是一个矩阵朴素转置的代码,但是最后一个元素老是显示为0,求指示,谢谢了
```c++
#include <stdio.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define ELEMTYPE int
typedef struct {
int i; //行
int j; //列
ELEMTYPE e; //元素
}Triple;
typedef struct {
Triple data[MAXSIZE+1];
int mu, nu, tu;
}TSmatrix;
void display(TSmatrix *s);
void trans(TSmatrix *s,TSmatrix *x);
int main(void)
{
TSmatrix s,x;
s.mu = 3;
s.nu = 3;
s.tu = 3;
s.data[0].i = 3;
s.data[0].j = 3;
s.data[0].e = 6;
s.data[1].i = 2;
s.data[1].j = 3;
s.data[1].e = 8;
s.data[2].i = 2;
s.data[2].j = 1;
s.data[2].e = 4;
display(&s);
trans(&s,&x);
display(&x);
return 0;
}
void display(TSmatrix *s)
{
for (int i = 1; i <= s->mu; i++)
{
for (int j = 1; j <= s->nu; j++)
{
int value = 0; //用来判断是否到了指定的(i,j)位置
for (int k = 0; k < s->tu; k++)//遍历数组中的三元表值
{
if (s->data[k].i == i && s->data[k].j == j) //若遍历至指定(i,j)就打印元素值
{
value = 1;
printf("%d ", s->data[k].e);
break;
}
}
if(value==0) //若不为三元表中存储的值就打印0
printf("%d ", 0);
}
printf("\n");
}
}
void trans(TSmatrix *s,TSmatrix *x)
{
int p, q, col;
x->mu=s->nu;
x->nu=s->mu;
x->tu=s->tu;
if (x->tu)
{
q = 1;
for (col = 1; col <= s->nu; ++col)
for (p = 1; p <= s->tu; ++p)
if (s->data[p].j == col)
{
x->data[q].i = s->data[p].j;
x->data[q].j = s->data[p].i;
x->data[q].e = s->data[p].e;
++q;
}
}
return;
}
```
这个问题是你的代码逻辑有问题,
for (col = 1; col <= s->nu; ++col)
for (p = 1; p <= s->tu; ++p)
if (s->data[p].j == col)
{
x->data[q].i = s->data[p].j;
x->data[q].j = s->data[p].i;
x->data[q].e = s->data[p].e;
++q;
}
你这个代码在转换的时候,你看前两个for是为了遍历你的矩阵,矩阵遍历完了之后,你写了个if (s->data[p].j == col) 这个,这个的意思是当你第p个数据的列等于你遍历的行数时,你就把他们转换
你看你第一个数据是4,他是data[1],那就是说你遍历矩阵的时候遍历到(2,2)这个位置的时候才能发现这个数据等于你遍历的行数,这个时候你把他们一转,没问题,然后再看你第二个数据8,这个所处的位置是data[2],也就是说你遍历到(3,3)他才能换
知道为啥你的 6 没了吗,因为他是data[0],而你的p值只能从1到3,所以只有这两个数据换了,data[0]、data[4]以及后面的数据都是遍历不到的,
所以改进方法就是你要像你构建矩阵的时候那样,写三个循环,两个用来遍历矩阵,一个用来遍历数据域
for (col = 1; col <= s->nu; ++col)
for (p = 1; p <= s->tu; ++p)
for (int k = 0; k < s->tu; k++)
if (s->data[k].i == col && s->data[k].j == p)
{
x->data[k].i = s->data[k].j;
x->data[k].j = s->data[k].i;
x->data[k].e = s->data[k].e;
++q;
}
当然我这里给你提个小建议,就是你的数据在输入矩阵的时候,你就应该把他们按位放好,意思就是你的data[0],一定要是遍历数组的第一个数据,data[1],是第二个以此类推,这样你就不用每次遍历到一个位置的时候就再判断一次他是不是数据域里面的内容了,直接定义一个变量k = 0;然后每次遍历的时候判断一下data[k]的行列是不是当前行列,如果是就k++,这样不就少一个循环了吗,你想,你现在输入的这个矩阵还小,你只用遍历九遍,然后判断数据三遍,一共27遍,那今天在是一个100×100的矩阵呢,本身10000遍,然后每一遍再循环三遍,一共就是三万遍,这样这个方法不就为你节省了不少时间吗?
以上就是我个人的观点,如果你还有什么不了解的可以继续私信我