6-1 三元组顺序表表示的稀疏矩阵转置

本题要求实现一个函数,实现三元组顺序表表示的稀疏矩阵转置。

函数接口定义:

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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值