回 帖 发 新 帖 刷新版面

主题:[讨论]稀疏矩阵的转置

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000

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

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

void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B);

void main()
{
    int i,j,k;
    TSMatrix A,B;
    
    A.m = 6;
    A.n = 7;
    A.len = 8;
        
    int a[6][7] = {
        {0,2,9,0,0,0,0},
        {0,0,0,0,0,0,0},
        {3,0,0,0,0,4,0},
        {0,0,5,0,0,0,0},
        {0,8,0,0,0,0,0},
        {1,0,0,7,0,0,0}};
        
        printf("A矩阵是:\n");
        for(i = 0;i < 6;i++)
        {
            for(j = 0;j < 7;j++)
            {
                printf("%d  ",a[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        printf("A矩阵对应的三元组是:\n");
        
        int b = 0;
        for(i = 1;i <= 6;i++)
        {
            for(j = 1;j <= 7;j++)
            {
                if(a[i-1][j-1] != 0)
                {
                    A.data[b].row = i;
                    A.data[b].col = j;
                    A.data[b].e = a[i-1][j-1];
                    printf("%d %d %d",A.data[b].row,A.data[b].col,A.data[b].e);
                    printf("\n");
                }
            }
            b++;
        }
        A.m = 6;
        A.n = 7;
        A.len = b - 1;
        FastTransposeTSMatrix(A,&B);
        for(k = 1;k <= B.len;k++)
        {
            printf("%d %d %d",B.data[k].row,B.data[k].col,B.data[k].e);
            printf("\n");
        }
}

void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)
{
    int col,p,q;
    int t = 0;
    int num[MAXSIZE],position[MAXSIZE];
    B->len=A.len;B->n=A.m;B->m=A.n;
    if(B->len)
    {
        for(col = 1;col <= A.n;col++)
            num[col]=0;
        for(t = 1;t <= A.len;t++)
            num[A.data[t].col]++;
        position[1]=1;
        for(col = 2;col <= A.n;col++)
            position[col]=position[col-1]+num[col-1];
        for(p = 1;p <= A.len;p++)
        {
            col=A.data[p].col;q=position[col];
            B->data[q].row=A.data[p].col;
            B->data[q].col=A.data[p].row;
            B->data[q].e=A.data[p].e;
            position[col]++;
        }
    }
}
我打印不出来转置后B的3元组,麻烦大家帮忙看下哪里错了
谢谢了

回复列表 (共1个回复)

沙发

可以看看这个程序,同样是距阵转置的,根据数据结构书上写的
#include<iostream>
#include<string>
#include<vector>
using namespace std;
const int MAXSIZE=50;
class Triple
{
public :
    int i,j;
    int e;
};
class TMatrix
{
  
public:
    Triple data[MAXSIZE];
     int mu,nu,tu;
     vector<int> rpos;
    TMatrix()
    {     }
    void Init()
    {  bool flag=1;
        vector<int> a;
        cin>>mu>>nu>>tu;/*
      cout<<"依次输入元素的i,j,e:\n";
       cin>>data[0].i>>data[0].j>>data[0].e;
       tu=1;
       int index=0;
       while(data[index].e!=0)
       {
           index++;
         
         // tu++;
       }
       cout<<mu<<" "<<nu<<" "<<tu<<endl;
      */
        int index=0;
        while(index<tu)
        {
           cin>>data[index].i>>data[index].j>>data[index].e;
           index++;
        }

    }
void print()
{
  cout<<"行数: "<<mu<<" "<<"列数"<<nu<<" "<<"总数"<<tu<<endl;
  for(int k=0;k<tu;k++)
  {
    cout<<data[k].i<<" "<<data[k].j<<" "<<data[k].e<<endl;
  }
}
};
TMatrix transpose(TMatrix& a)
{
  TMatrix d;
  d.mu =a.nu;
  d.nu=a.mu;
  d.tu=a.tu;
  int num[30];
  int cpot[30];
  for(int col=0;col<a.nu;col++)
      num[col]=0;
  for(int t=0;t<a.tu;t++)
      
  {    
      ++num[a.data[t].j];     
  }
  
  cpot[0]=0;
  for(col=1;col<a.nu;col++)
  {
      cpot[col]=cpot[col-1]+num[col-1];      
  }
  cout<<endl;
  for(int p=0;p<a.tu;p++)
  {
    int col=a.data[p].j;    
    int q=cpot[col];    
    d.data[q].i=a.data[p].j;
    d.data[q].j=a.data[p].i;    
    d.data[q].e=a.data[p].e;        
    ++cpot[col];
  }
return d;
}

int main()
{
  TMatrix t;
  t.Init();
  t.print();
  TMatrix b;
  b=transpose(t);
  b.print();
  return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册