#include <stdio.h> #include <stdlib.h> #define M 100 struct node{ int i,j,v; }; struct tripletable { struct node S[M]; int m,n,t; }; struct tripletable * create() { int i; struct tripletable *head=(struct tripletable *)malloc(sizeof(struct tripletable)); scanf("%d%d%d",&(head->m),&(head->n),&(head->t)); for(i=0;i<head->t;i++) scanf("%d%d%d",&(head->S[i].i),&(head->S[i].j),&(head->S[i].v)); return head; } void print(struct tripletable * head) { int i; for(i=0;i<head->t;i++) printf("%d %d %d\n",(head->S[i].i),(head->S[i].j),(head->S[i].v)); } struct tripletable * trans(struct tripletable *t1); int main() { struct tripletable * head,*t2; head=create(); t2=trans(head); print(t2); return 0; } //*********************begin************************* struct tripletable * trans(struct tripletable *t1){ } //**********************end**************************
时间: 2023-06-26 22:06:04 浏览: 109
这是一个稀疏矩阵的转置程序,其中结构体 node 存储了矩阵的 行、列、值 信息,结构体 tripletable 则存储了整个矩阵的信息。程序中的 create 函数用于创建一个 tripletable 结构体,trans 函数用于实现矩阵的转置操作,print 函数用于输出转置后的矩阵信息。
在 trans 函数中需要实现矩阵的转置,具体实现方式可以使用三元组存储矩阵的转置结果。可以根据原矩阵的列信息建立一个列数组,用于存储转置后每个元素所在的列。然后遍历原矩阵,将每个元素按照转置后的位置存储在转置矩阵中即可。
下面是 trans 函数的实现:
struct tripletable * trans(struct tripletable *t1){
struct tripletable *t2=(struct tripletable *)malloc(sizeof(struct tripletable));
t2->m=t1->n;
t2->n=t1->m;
t2->t=t1->t;
int col_num[t1->n+1]; //记录转置后每个元素所在的列
int i,j,k;
for(i=1;i<=t1->n;i++){
col_num[i]=0;
}
for(k=0;k<t1->t;k++){
j=t1->S[k].j;
col_num[j]++;
}
//计算每个元素在转置矩阵中的位置
int pos[t1->n+1];
pos[1]=0;
for(i=2;i<=t1->n;i++){
pos[i]=pos[i-1]+col_num[i-1];
}
//将每个元素按照转置后的位置存储在转置矩阵中
for(k=0;k<t1->t;k++){
i=t1->S[k].j; //原矩阵中元素的列
j=pos[i]; //转置矩阵中元素的行
t2->S[j].i=t1->S[k].j;
t2->S[j].j=t1->S[k].i;
t2->S[j].v=t1->S[k].v;
pos[i]++; //该列下一个元素的位置
}
return t2;
}
注意,在该函数中需要使用动态内存分配来创建转置矩阵,同时需要释放该内存。
完整代码如下:
阅读全文