戳这里还有其他数据结构的题目噢
稀疏矩阵A、B均采用三元组顺序表表示,验证实现矩阵A快速转置算法,并设计、验证矩阵A、B相加得到矩阵c的算法。
(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
(2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表形式存储。
(3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。
(4)输出随机生成的稀疏矩阵A、B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。
直接上代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 500
typedef int arr_type;
//储存行 列 值
typedef struct {
int row;
int col;
arr_type value;
}array;
//储存三元组顺序表+总行数,总列数,总非零元素个数
typedef struct {
array arr[MAX];
int rownum,colnum,all;
}sparse_matrix;
//生成随机稀疏矩阵三元组
arr_type rand_array(sparse_matrix *s1,sparse_matrix *s2){
srand(time(NULL));
int r1,r2;
r1 = s1->rownum * s1->colnum;
r2 = s2->rownum * s2->colnum;
int k;
s1->all = 0,s2->all = 0;
//矩阵A随机生成
for(int i = 0;i < s1->rownum;i++)
for(int j = 0;j < s1->colnum;j++)
{
k = rand()%r1;
if(k < (r1/20))
{
s1->arr[s1->all].value = (rand()%9)+1;
s1->arr[s1->all].row = i;
s1->arr[s1->all].col = j;
s1->all++;
}
}
if(r1/s1->all > 20)
return 1;
//矩阵B随机生成
for(int i = 0;i < s2->rownum;i++)
for(int j = 0;j < s2->colnum;j++)
{
k = rand()%r2;
if(k < (r2/20))
{
s2->arr[s2->all].value = (rand()%9)+1;
s2->arr[s2->all].row = i;
s2->arr[s2->all].col = j;
s2->all++;
}
}
if(r2/s2->all > 20)
return 1;
return 0;
}
//转置稀疏矩阵
sparse_matrix transposition(sparse_matrix *s){
sparse_matrix T;
int p, q, col;
int num[s->colnum + 1];//列数变为行数,记录行数即记录原来列数
int cpot[s->colnum + 1];
T.rownum = s->colnum; T.colnum = s->rownum; T.all = s->all;
if (s->all != 0)
{
for (col = 0; col < s->colnum; col++)
num[col] = 0;//一共有几行,全部赋值为0
for (int t = 0; t < s->all; t++)
{
num[s->arr[t].col]++;//记录转置后每行的元素个数
}
cpot[0] = 0;//转置在新的三元组中的位置(三元组的行)
for (col = 1; col < s->colnum; col++)
cpot[col] = cpot[col-1] + num[col-1];
for (p = 0; p < s->all; p++)
{
col = s->arr[p].col; //储存在三元组的数据的列(即行)
q = cpot[col]; // p 是代表 矩阵a的位置,q代表在b中要插入的位置。
T.arr[q].col = s->arr[p].row;
T.arr[q].row = s->arr[p].col;
T.arr[q].value = s->arr[p].value;
cpot[col]++; //位置发生变化让他自动加一
}
}
return T;
}
sparse_matrix add_matrix(sparse_matrix *p,sparse_matrix *q){
sparse_matrix r;
r.all = 0;
int pp = 0,qq = 0;
while(1)
{
if(p->arr[pp].row > q->arr[qq].row)
{
r.arr[r.all].col = q->arr[qq].col;
r.arr[r.all].row = q->arr[qq].row;
r.arr[r.all].value = q->arr[qq].value;
r.all++,qq++;
}
else if(p->arr[pp].row < q->arr[qq].row)
{
r.arr[r.all].col = p->arr[pp].col;
r.arr[r.all].row = p->arr[pp].row;
r.arr[r.all].value = p->arr[pp].value;
r.all++,pp++;
}
else if(p->arr[pp].row == q->arr[qq].row)
{
if(p->arr[pp].col == q->arr[qq].col)
{
r.arr[r.all].value = p->arr[pp].value + q->arr[qq].value;
r.arr[r.all].col = p->arr[pp].col;
r.arr[r.all].row = p->arr[pp].row;
r.all++;
pp++,qq++;
}
else if(p->arr[pp].col > q->arr[qq].col)
{
r.arr[r.all].col = q->arr[qq].col;
r.arr[r.all].row = q->arr[qq].row;
r.arr[r.all].value = q->arr[qq].value;
r.all++,qq++;
}
else if(p->arr[pp].col < q->arr[qq].col)
{
r.arr[r.all].col = p->arr[pp].col;
r.arr[r.all].row = p->arr[pp].row;
r.arr[r.all].value = p->arr[pp].value;
r.all++,pp++;
}
}
if(pp == p->all)
{
while(1){
if(q->all == qq)
break;
r.arr[r.all].col = q->arr[qq].col;
r.arr[r.all].row = q->arr[qq].row;
r.arr[r.all].value = q->arr[qq].value;
r.all++,qq++;
}
break;
}
if(qq == q->all)
{
while(1){
if(p->all == pp)
break;
r.arr[r.all].col = p->arr[pp].col;
r.arr[r.all].row = p->arr[pp].row;
r.arr[r.all].value = p->arr[pp].value;
r.all++,pp++;
}
break;
}
}
return r;
}
void print_matrix(sparse_matrix a){
int ord=0,zero = 0;
for(int i = 0;i < a.rownum;i++)
{
for(int j = 0;j < a.colnum;j++)
{
if((i == a.arr[ord].row)&&
(j == a.arr[ord].col))
{
printf("% 3d",a.arr[ord].value);
ord++;
}
else
printf("% 3d",zero);
}
printf("\n");
}
printf("\n");
}
int main()
{
sparse_matrix a,b,a1,c;
printf("请输入矩阵行和列数:\n");
scanf("%d %d",&a.rownum,&a.colnum);
b.rownum = a.rownum,b.colnum = a.colnum;
if(rand_array(&a,&b)){
printf("随机生成矩阵失败!\n");
return 0;
}
print_matrix(a);
print_matrix(b);
a1 = transposition(&a);
print_matrix(a1);
c = add_matrix(&a1,&b);
print_matrix(c);
return 0;
}
(请不要直接复制使用。代码仅供参考,希望读者借此代码自身可以理解学习)
如果代码对您有帮助,不要忘记评论收藏噢~