📄 稀疏矩阵 .txt
字号:
/*将稀疏矩阵表示为三元组,求出转置矩阵并输出结果。010650-20030000008000*/
#include<stdio.h>
#define Max 1000;
typedef int datatype;
typedef struct node{
int i; /*行*/
int j; /*列*/
datatype k; /*元素*/
}TripleNode; /*三元组结点定义*/
typedef struct tn{
TripleNode data[100];
int m,n,t;
}TripleTable;/*三元组表及非零元素个数t;m,n是表示稀疏矩阵的行列数 */
void TransMatrix(TripleTable *b,TripleTable *a) /*将a转置为b*/
{
int p,q,col;
b->m=a->n; /*传递行列及个数信息。转置了?*/
b->n=a->m;
b->t=a->t;
if(b->t==0)printf("Error!");
q=0;
/*这一段复杂!!!*/
/*基本思想是将a->data表中以列为序扫描,将行列互换后依次放入b->data中,即可得到b的行优先排列*/
/*why?三元组表能不能直接把行列互换?不行,因为直接互换后不能保证行优先顺序!还可以用带行表的*/
/*三元组表快速置换,算法见<数据结构-powerpoint>课件中的*/
for(col=0;col<a->n;col++)
for(p=0;p<a->t;p++)
if(a->data[p].j==col)
{
b->data[q].i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].k=a->data[p].k;
q++;
}
}
TripleTable *CreateTranTri(int a[4][5]) /*将普通数组转为三元表组*/
{ TripleTable *x;
int y=0;
int i,j;
x=(TripleTable *)malloc(sizeof(TripleTable));
/*按行优先扫描数组,如果不为0,则进入三元组表*/
for(i=0;i<4;i++)
for(j=0;j<5;j++)
if(a[i][j]!=0)
{
x->data[y].i=i;
x->data[y].j=j;
x->data[y].k=a[i][j];
y++;
}
x->m=i; /*相关信息也要过去,不然如何运算?*/
x->n=j;
x->t=y;
return x;
}
void DTT(TripleTable *q) /*将三元组表写入数组*/
{
int y,l;
int m,n;
int a[5][4];
/*初始*/for(m=0;m<5;m++)
for(n=0;n<4;n++)
a[m][n]=0;
/*注意理解!*/
for(l=0;l<q->t;l++)
for(y=0;y<q->t;y++)
a[q->data[y].i][q->data[y].j]=q->data[y].k;
/*输出*/
for(m=0;m<5;m++)
for(n=0;n<4;n++)
{
printf("%d ",a[m][n]);
if(n==3)printf("\n");
}
}
void main()
{
int A[4][5]={0,5,0,0,8,1,0,3,0,0,0,-2,0,0,0,6,0,0,0,0};
TripleTable *o,*p;
p=(TripleTable *)malloc(sizeof(TripleTable));
o=CreateTranTri(A);
TransMatrix(p,o);
DTT(p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -