三元组顺序表表示的稀疏矩阵转置(10分)
本题要求实现一个函数,实现三元组顺序表表示的稀疏矩阵转置。
函数接口定义:
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
代码:
在这里展现的是包括主函数的程序,自己理解一下转化成为一个函数
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 225
typedef struct
{
int r,c;//行号,列号
int d;//元素值
}TupNode;//三元组类型
typedef struct
{
int m,n;//行数,列数
int t;//非零元素的个数
TupNode data[Maxsize]; //非零元三元组表
}TSMatrix;//三元组顺序表
int main()
{
TSMatrix T;
TSMatrix Tb;
int i,j,x,l,q;
int M,N,S;//输入的行数、列数、非零的个数
scanf("%d %d %d",&M,&N,&S);
int k,kl=0,v;//kl记录Tb中元素的个数
T.m=M;//行数赋值
T.n=N;//列数赋值
T.t=S;//非零元素个数
//输入数据
for(k=0;k<S;k++)
{
scanf("%d %d %d",&T.data[k].r,&T.data[k].c,&T.data[k].d);
}
Tb.m=T.n;//转置矩阵的行数
Tb.n=T.m;//转置矩阵的列数
Tb.t=T.t;//转置矩阵非零元素的个数
//转置//
for(v=0;v<T.n;v++)
{
for(k=0;k<T.t;k++)
{
if(T.data[k].c==v)//找到另一个列号为v的元素
{
Tb.data[kl].r=T.data[k].c;
Tb.data[kl].c=T.data[k].r;
Tb.data[kl].d=T.data[k].d;
kl++;
}
}
}
for(i=0;i<S;i++)
{
printf("%d %d %d\n",Tb.data[i].r,Tb.data[i].c,Tb.data[i].d);
}
}