稀疏矩阵三元组表示以及转置

2024-11-02 02:18:34
推荐回答(3个)
回答(1):

visual studio下编译通过,测试结果正确,万一VC6编译不过请用TC2.0
//稀疏矩阵就是只记录非零元的位置和值,适合处理0比较多的矩阵
#include
#include

#define MAXSIZE 10

typedef struct node
{
int i,j,value; //i为行下标,j为列下标,value为该处的值
}NODE;
typedef struct mat
{
int mv,mc,mt; //mv为行数,mc为列数,mt为非零元个数
NODE v[MAXSIZE];
}MAT;
//view为输出稀疏矩阵
void view(MAT *a)
{
printf("矩阵的三元组表示:\n");
printf("i j v\n");
for(int k=0;kmt;k++)
printf("%-6d%-6d%-6d\n",a->v[k].i,a->v[k].j,a->v[k].value);

}
//init为输入一个矩阵并存为稀疏矩阵
void init(MAT *a)
{
int k=0; //非零元的序号
//for(k=0;k // a->v[k].value=0; //先都初始化为零
a->mt=0;
printf("请输入行数和列数:\n");
scanf("%d%d",&a->mv,&a->mc);
printf("\n请依次输入矩阵的各个元素的值:\n");
for(int m=1;m<=a->mv;m++)
for(int n=1;n<=a->mc;n++)
{
int t;
scanf("%d",&t);
//如果t为非零元,存入v[k]中
if(t!=0)
{
a->v[k].i=m;
a->v[k].j=n;
a->v[k].value=t;
a->mt++;
k++;
}
}
}
//矩阵a转置后存入矩阵b
void change(MAT *a,MAT *b)
{
b->mv=a->mc;
b->mc=a->mv;
b->mt=a->mt;
if(a->mt)
{
int p=0,q=0;
for(int n=1;n<=a->mc;n++)
for(int p=0;p<=a->mc;p++)
{
if(a->v[p].j==n) //v[p]是第n列的非零元
{
b->v[q].i=a->v[p].j;
b->v[q].j=a->v[p].i;
b->v[q].value=a->v[p].value;
q++;
}
}
}
}
void main()
{
MAT *a,*b;
b=(MAT *)malloc(sizeof(MAT));
a=(MAT *)malloc(sizeof(MAT));
init(a);
view(a);
change(a,b);
view(b);
}

回答(2):

#include
#define MAXSIZE 20 /*矩阵中最大非零元的个数*/
#define M 5
#define N 5
typedef struct triple
{
int r; /*行标,本程序中从1开始的*/
int c; /*列标,本程序中从1开始的*/
int d; /*非零元*/
}Triple; /*三元组定义*/
typedef struct
{
int rows; /*矩阵的行数*/
int cols; /*列数*/
int nums; /*非零元个数*/
Triple data[MAXSIZE+1]; /*非零元的三元组表,*/
}TSMatrix; /*三元组线性表*/

int TransposeSMatrix(TSMatrix *a,TSMatrix *b)
{
int p,q,col;
b->rows = a->cols; /*原矩阵的行数为新矩阵的列数,愿列数为新行数,非零元个数不变*/
b->cols = a->rows;
b->nums = a->nums;
if(b->nums) /*若a不为零矩阵*/
{ q = 0; /*b->data下标*/
for(col = 1; col < a->cols; col++)
for(p = 0;p < a->nums;p++) /*p为a->data的下标*/
if(col == a->data[p].c) /*按b->data[q]中的列标对a->data[p]进行扫描*/
{
b->data[q].r = a->data[p].c;
b->data[q].c = a->data[p].r;
b->data[q].d = a->data[p].d;
q++;
}
return 1;
}
else /*a为零矩阵*/
return 0;
}

void FastTransposeSMatrix(TSMatrix t,TSMatrix &tb)
{ int p,q=0,v; /*q为tb.data的下标*/
tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;
if (t.nums!=0)
{ for (v=0;v for (p=0;p if (t.data[p].c==v)
{ tb.data[q].r=t.data[p].c;
tb.data[q].c=t.data[p].r;
tb.data[q].d=t.data[p].d;
q++;
}
}
}

void DispMat(TSMatrix t)
{ int i;
if (t.nums<=0) return;
printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);
printf(" -------------------------------\n");
for (i=0;i printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,
t.data[i].d);
}

void display_matrix(TSMatrix *a) /* 打印矩阵*/
{ int r,c,d = 0;
for(r = 1 ;r <= a->rows; r++)
{
for(c = 1; c<= a->cols; c++)
{ /*判断是否为非零元*/
if((a->data[d].r == r)&&(a->data[d].c == c))
{ printf("%4d",a->data[d].d); d++; }
else
printf("%4d",0);
}
printf("\n");
}
}

int main()
{/*源矩阵a*/
TSMatrix a= {6,7,8,{ {1,2,12},{1,3,9},{3,1,-3},{3,6,14},{4,3,24},{5,2,18},{6,1,15},{6,4,-7} }};
TSMatrix b; /*声明矩阵b*/
printf("The source Matrix:\n");
DispMat(a);
printf(" ============矩阵原型============\n");display_matrix(&a);
FastTransposeSMatrix(a,b);
printf("After FastTransposeSMatrix(快速转换): \n");
DispMat(b);
printf(" ============矩阵原型============\n");display_matrix(&b);
TransposeSMatrix(&b,&a);
printf("After TransposeSMatrix(普通转换): \n");
DispMat(a);
printf(" ============矩阵原型============\n");display_matrix(&a);
}

回答(3):

你自己不是写好了吗?

这个基本上很难!