标题:[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!
取消只看楼主
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
结帖率:79.31%
已结贴  问题点数:20 回复次数:6 
[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!


大家好,下面代码是我用来实现两个稀疏矩阵的相加运算,
我先input()读入两个矩阵,然后再把这两个矩阵显示出来!
其中Status AddTSM是实现两个矩阵相加的,
但是调用不成功!!
还有怎么把相加后的矩阵c输出来呢!
还有我想把输出这个功能也单独提取出来,就是可以在输出举证a,b,c时分别调用,而不是每次都写一次!
我弄了很久也没有结果,
基础太差了!
希望大家帮帮!谢谢!

//#include "stdafx.h"
#include<stdio.h>
#define MAXSIZE 100

typedef int Status ;
typedef int ElemType;

typedef struct {
    int    i,j; // 行下标,列下标
    ElemType e; // 非零元素值
}Triple;

typedef struct  {
    Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
    int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
///三元组表示的稀疏矩阵加法: C=A+B
{
    int n=1,m=1,k=1;
    ElemType  temp;
    if(A.mu==B.mu&&A.nu==B.nu)
    {
        while(m<=A.tu&&n<=B.tu)
        {
            //若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
            //存入C中,如果列号也相等,则将对应的元素值相加后存入C中
            if(A.data[m].i==B.data[n].i)
            {
                if(A.data[m].j<B.data[n].j)
                {
                    C.data[k].i=A.data[m].i;
                    C.data[k].j=A.data[m].j;
                    C.data[k].e=A.data[m].e;
                    k++;
                    m++;               
                }
                else if(A.data[m].j>B.data[n].j)
                {
                    C.data[k].i=B.data[n].i;
                    C.data[k].j=B.data[n].j;
                    C.data[k].e=B.data[n].e;
                    k++;
                    n++;
                }
                else
                {
                    temp=A.data[m].e+B.data[n].e;
                    if(temp!=0)//不为0才添加到C中
                    {
                        C.data[k].i=A.data[m].i;
                        C.data[k].j=A.data[m].j;
                        C.data[k].e=temp;
                        k++;      
                    }
                    m++;
                    n++;
                }
            }
            //若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中
            else if(A.data[m].i<B.data[n].i)
            {
                C.data[k].i=A.data[m].i;
                C.data[k].j=A.data[m].j;
                C.data[k].e=A.data[m].e;
                k++;
                m++;
            }
            //若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中
            else
            {
                C.data[k].i=B.data[n].i;
                C.data[k].j=B.data[n].j;
                C.data[k].e=B.data[n].e;
                k++;
                n++;
            }
        }
        //把剩余部分元素存入C中
        if(m>A.tu&&n<=B.tu)
            for( ;n<=B.tu;n++)
            {
                C.data[k].i=B.data[n].i;
                C.data[k].j=B.data[n].j;
                C.data[k].e=B.data[n].e;
                k++;
            }
            if(n>B.tu&&m<=A.tu)
                for( ;m<=A.tu;m++)
                {
                    C.data[k].i=A.data[m].i;
                    C.data[k].j=A.data[m].j;
                    C.data[k].e=A.data[m].e;
                    k++;
                }      
                C.mu=A.mu;
                C.nu=A.nu;
                C.tu=k-1;
                return true;
    }
    else
        return false;
}


input()
{
    int k;
    TSMatrix A,B;
    int a[100][100]={0};
    int b[100][100]={0};
    printf("输入稀疏矩阵A的行数,列数和非零元个数:");
    scanf("%d %d %d",&A.mu,&A.nu,&A.tu);
    for(k=1;k<=A.tu;k++)
    {
        printf("输入第%d个非0元素的行数,列数和值:",k);
        scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].e);
    }
    printf("输入稀疏矩阵B的行数,列数和非零元个数:");
    scanf("%d %d %d",&B.mu,&B.nu,&B.tu);
    for(k=1;k<=B.tu;k++)
    {
        printf("输入第%d个非0元素的行数,列数和值:",k);
        scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].e);
    }
    /*
    if(A.mu!=B.mu||A.nu!=B.nu)
    {
        printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
        return;
    }*/
   
   
    for(k=1;k<=A.tu;k++)
    {
        a[A.data[k].i][A.data[k].j]=A.data[k].e;
    }
   
    printf("A输入为:\n");
    for(k=1;k<=A.mu;k++)
    {
        for(int l=1;l<=A.nu;l++)
            printf("%d ",a[k][l]);
        printf("\n");
    }
   
   
    for(k=1;k<=B.tu;k++)
    {
        b[B.data[k].i][B.data[k].j]=B.data[k].e;
    }
   
    printf("B输入为:\n");
    for(k=1;k<=B.mu;k++)
    {
        for(int l=1;l<=B.nu;l++)
            printf("%d ",b[k][l]);
        printf("\n");
    }
}



int main(int argc, char* argv[])
{
    input();
    Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C);



    return 0;
}



搜索更多相关主题的帖子: 优化 成功 include input 
2011-04-22 21:26
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
谢谢,大哥我测试不成功,
你还能帮我测试一下吗
谢谢
2011-04-22 23:18
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
以下是引用voidx在2011-4-22 22:10:30的发言:

#include
#define MAXSIZE 100
 
typedef int Status ;
typedef int ElemType;
 
typedef struct {
    int    i,j; // 行下标,列下标
    ElemType e; // 非零元素值
}Triple;
 
typedef struct  {
    Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
    int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
 
 
int AddTSM(TSMatrix A,TSMatrix B,TSMatrix * C)
///三元组表示的稀疏矩阵加法: C=A+B  
{  
    int n=1,m=1,k=1;
    ElemType  temp;
    if(A.mu==B.mu&&A.nu==B.nu)
    {
        while(m<=A.tu&&n<=B.tu)
        {
            //若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
            //存入C中,如果列号也相等,则将对应的元素值相加后存入C中
            if(A.data[m].i==B.data[n].i)
            {  
                if(A.data[m].j
非常谢谢,我去试一试
2011-04-23 08:45
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
还是不行呀!!

输出数组只有非零元素
我想其他的元素也输出呀!
是输出一个完整的数组!
而不是这样的:
输入稀疏矩阵的行数,列数和非零元个数:2
2
2
输入第1个非0元素的行数,列数和值:1
1
1
输入第2个非0元素的行数,列数和值:1
2
2
       1       2
输入稀疏矩阵的行数,列数和非零元个数:2
2
1
输入第1个非0元素的行数,列数和值:1
1
2
       2       0
Their sum is:
       3       2
Press any key to continue

谢谢
2011-04-23 08:49
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
还有一个问题,

如果两个稀疏矩阵不相等的话,就是不是行数和列数不一样,就不能进行相加!
但是运行的时候没有提示哦
2011-04-23 17:48
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
以下是引用voidx在2011-4-23 18:59:28的发言:

。。。那你自己加上不就好了。
难道你没发现实现加法的那个函数跟以前一模一样?
这个知道了
我忘记我原来的函数就有的了
2011-04-23 19:06
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
得分:0 
现在还有一个问题

!!!!!!!!!
我想在输入矩阵的时候:
是这样输入的:
0  0  3
2  3  0
0  0  3
~~~~~~~
然后再由系统去判断哪些是不为0的行和列,然后再把这些列号和行号还有非零元素存起来

怎么改写代码呢

谢谢
2011-04-23 19:08



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




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

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