本题要求实现一个函数,实现三元组顺序表表示的稀疏矩阵转置。
函数接口定义:
struct tripletable * trans(struct tripletable *t1);
其中 t1
是用户传入的参数。 函数须返回转置后的三元组顺序表指针。
裁判测试程序样例:
#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;
}
/* 请在这里填写答案 */
输入样例:
输入第1行为矩阵行数m、列数n及非零元素个数t。
按行优先顺序依次输入t行,每行3个数,分别表示非零元素的行标、列标和值。
3 4 3
0 1 -5
1 0 1
2 2 2
输出样例:
输出转置后的三元组顺序表结果,每行输出非零元素的行标、列标和值,行标、列标和值之间用空格分隔,共t行。
0 1 1
1 0 -5
2 2 2
代码:
struct tripletable *trans(struct tripletable *t1)
{
struct tripletable *t2=(struct tripletable *)malloc(sizeof(struct tripletable));
int col,loc;
t2->m=t1->n;
t2->n=t1->m;
t2->t=t1->t;
if(t1->t)
{
loc=0;
for(int i=0;i<t1->n;i++)//外层循环为原矩阵的列数
{
//遍历t1的所有列数就是从t2的第一行到最后一行
for(int k=0;k<t1->t;k++)//内层为所有元素数
{
//对于t1的每一列,在t1所有元素中找,一列一列地找
//只要一个元素列数和外层循环一样
//就让列和行交换
//插入到t2;
//最后数组中就是一行一行来的。
if(t1->S[k].j==i)
{
t2->S[loc].v=t1->S[loc].v;
t2->S[loc].i=t1->S[loc].j;
t2->S[loc].j=t1->S[loc].i;
loc++;
}
}
}
}
return t2;
}