标题:稀疏矩阵三元组存储,转置矩阵输出的最后一组原生不对,求各位帮帮忙。
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:17 
稀疏矩阵三元组存储,转置矩阵输出的最后一组原生不对,求各位帮帮忙。
#include <stdio.h>
#define max 3

typedef struct Triple
{
    int row, col, e;
}Triple;

typedef struct TSMarix
{
    Triple data[max + 1];
    int m, n, len;
}TSMarix;

void CreateTSMarix(TSMarix *T)
{
    int i;
    printf("请输入行数列数,非零元素个数:\n");
    scanf_s("%d%d%d", T->m, T->n, T->len);
    printf("请输入非零元素的行下标,列下标,值(空格分开输入):\n");
    for (i = 1; i< T->len; i++)
    {
        scanf_s("%d%d%d", T->data[i].row, T->data[i].col, T->data[i].e);
    }
}

void Print(TSMarix T)
{
    int i;
    printf("元素的行下标,列下标,值为:\n");
    for (i = 1; i<max + 1; i++)
    {
        printf("\t%d\t%d\t%d", T.data[i].row, T.data[i].col, T.data[i].e);
    }
}
int main()
{
    TSMarix T;
    printf("创建三元组表:\n");
    CreateTSMarix(&T);
    printf("输出三元组表:\n");
    Print(T);
    return 0;
}

[此贴子已经被作者于2017-11-2 22:33编辑过]

搜索更多相关主题的帖子: 矩阵 三元 int data printf 
2017-11-02 20:52
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:7 
取地址&啊忘加上了, 还有 我猜应该是这样 i<T->len+1
程序代码:
void CreateTSMarix(TSMarix *T)
{
    int i;
    printf("请输入行数列数,非零元素个数:\n");
    scanf_s("%d%d%d", &T->m, &T->n, &T->len);
    printf("请输入非零元素的行下标,列下标,值(空格分开输入):\n");
    for (i = 1; i< T->len+1; i++)
    {
        scanf_s("%d%d%d", &T->data[i].row, &T->data[i].col, &T->data[i].e);
    }
}

早知做人那么辛苦!  当初不应该下凡
2017-11-02 21:23
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 2楼 炎天
我调试半天也没调出来,这样可以不?for(i=0;i<T->len;i++)
2017-11-02 21:26
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:0 
以下是引用花脸在2017-11-2 21:26:01的发言:

我调试半天也没调出来,这样可以不?for(i=0;i<T->len;i++)

不可以,稀疏矩阵的三元组data[0]不可用(ps可能讲得不对,就刚刚百度学习了下)


[此贴子已经被作者于2017-11-2 21:38编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-11-02 21:35
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 4楼 炎天
好的谢谢你。
2017-11-02 21:54
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 4楼 炎天
#include <stdio.h>
#include <stdlib.h>
#define max 3

typedef struct Triple
{
    int row,col,e;
}Triple;

typedef struct TSMarix
{
    Triple data[max+1];
    int m,n,len;
}TSMarix;

void CreateTSMarix(TSMarix *T)
{
    int i;
    printf("请输入行数列数,非零元素个数:\n") ;
    scanf("%d%d%d",&T->m,&T->n,&T->len);
    if(T->m<1||T->n<1||T->len<1||T->len>max+1)
    {
        printf("输入的数据有误!\n");
        exit(0);
    }
    printf("请输入非零元素的行下标,列下标,值(空格分开输入):\n");
    for(i=1;i<T->len+1;i++)
        scanf("%d%d%d",&T->data[i].row,&T->data[i].col,&T->data[i].e);
}

void TransposeTSMarix(TSMarix T,TSMarix *B)
{
    B->n=T.m;
    B->m=T.n;
    B->len=T.len;
    int i,j,k;
    if(B->len>0)
    {
        j=1;
        for(k=1;k<=T.n;k++)
        {
            for(i=1;i<=T.len+1;i++)
            {
                if(T.data[i].col==k)
                {
                    
                    B->data[j].row=T.data[i].col;
                    B->data[j].col=T.data[i].row;
                    B->data[j].e=T.data[i].e;
                    j++;
                }
            }
        }
    }
}

void Print(TSMarix T)
{
    int i;
    printf("元素的行下标,列下标,值为:\n");
    for(i=1;i<T.len+1;i++)
    {
        printf("\t%d\t%d\t%d\n",T.data[i].row,T.data[i].col,T.data[i].e);
    }
}
int main()
{
    TSMarix T,B;
    printf("创建三元组表:\n");
    CreateTSMarix(&T);
    printf("输出三元组表:\n");
    Print(T);
    TransposeTSMarix(T,&B);
    printf("转置后的矩阵B为:\n");
    Print(B);
    return 0;
}


输出转转置厚点矩阵最后一个元素怎么不对?哪里出错了。。

[此贴子已经被作者于2017-11-2 22:21编辑过]

2017-11-02 22:19
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:620
专家分:3020
注 册:2011-4-22
得分:7 
乱了,程序的逻辑是什么啊?
你输入的是3行,3列,非零元素有3个。然后你输入的数据,第一行第二列为3,第三行第二列为1,第6行第5列为4.
怎么来的第6行第5列?
题意没搞懂还是逻辑错了?
你高的输入是象形输入还是文字表征输入?
2017-11-02 23:15
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 7楼 zbjzbj
我理解的三行三列指的非零元素总共有三行三列,然后非零元素所在的行列的下标值可以超过三,
什么是形象输入,文字表征输入?
2017-11-02 23:24
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:620
专家分:3020
注 册:2011-4-22
得分:0 
那可能是我理解错了
如是这样,转置过程不需要搞那么复杂,直接把Triple对象的m,n互换一下,然后再将所有元素按新的m,n排一下序,就可以输出了。

[此贴子已经被作者于2017-11-2 23:59编辑过]

2017-11-02 23:46
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:0 
以下是引用花脸在2017-11-2 23:24:39的发言:

我理解的三行三列指的非零元素总共有三行三列,然后非零元素所在的行列的下标值可以超过三,


非零元素共三行三列, 那么这九个数都是要输入的了, 可是按你写的-----你自己再重新规定需要输入的个数。

早知做人那么辛苦!  当初不应该下凡
2017-11-03 10:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-482067-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.199786 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved