稀疏矩阵

#include <stdio.h>
#include 
<stdlib.h>
#include 
<malloc.h>

#define ERROR 0;
#define OK 1;
#define MAXSIZE 10
#define ElemType int


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


typedef 
struct{
    Triple data[MAXSIZE
+1];
    
int mu;//矩阵的行数
    int nu;//矩阵的列数
    int tu;//矩阵的非零元个数
}
TSMatrix;

//插入元素到稀疏矩阵中
int Insert(TSMatrix &M,int set){
    
int i,j,e,k;
    scanf(
"%d%d%d",&i,&j,&e);
    
for(k=1;k<=MAXSIZE;k++){
        
if(M.data[k].i==i&&M.data[k].j==j){
            printf(
"输入错误,该位置已经有元素了! ");
            
return ERROR;
        }

    }

    M.data[
set].i=i;
    M.data[
set].j=j;
    M.data[
set].e=e;
    
return OK;
}


//快速转置矩阵
//M为原矩阵,T为新矩阵
int FTSMatrix(TSMatrix M,TSMatrix &T){
    
int col;    //表示M中的第col列
    int num[MAXSIZE+1];    //表示M中第col列中非零元素的个数
    int cpot[MAXSIZE+1];    //表示该元素应该插入的位置
    T.mu=M.nu;    
    T.nu
=M.mu;
    T.tu
=M.tu;
    
if(T.tu){
        
for(col=1;col<=T.tu;col++){
            num[col]
=0;        //初始化每行含有非零元的个数
        }

        
for(int t=1;t<=M.tu;t++){
            
++num[M.data[t].j];    //j中记录的是元素所在的列.这个变量刚好又可以当作T行中含有的元素个数
        }

        cpot[
1]=1;
        
for(col=2;col<=M.nu;col++){
            cpot[col]
=cpot[col-1]+num[col-1];//计算下一个存储位置
        }


        
//开始转置
        for(int p=1;p<=M.tu;p++){
            col
=M.data[p].j;
            T.data[cpot[col]].i
=M.data[p].j;
            T.data[cpot[col]].j
=M.data[p].i;
            T.data[cpot[col]].e
=M.data[p].e;
            cpot[col]
++;
        }

    }

    
return OK;
}


//仅仅打印非零元
void Print(TSMatrix M){
    
for(int i=1;i<11;i++){
        printf(
"%d %d %d ",M.data[i].i,M.data[i].j,M.data[i].e);
    }

}


//打印所有的元素
void PrintAll(TSMatrix M){
    
int getElem(TSMatrix M,int m,int n);
    printf(
" ");
    
for(int m=0;m<M.mu;m++){
        
for(int n=0;n<M.nu;n++){
            
if(m==0){
                printf(
"%3d",n);
            }
else if(n==0){
                printf(
"%3d:",m);
            }
else{
                printf(
"%3d",getElem(M,m,n));
            }

        }

        printf(
" ");
    }

}


//返回指定位置的元素
int getElem(TSMatrix M,int m,int n){
    
for(int k=1;k<=MAXSIZE;k++){
        
if(M.data[k].i==m&&M.data[k].j==n){
            
return M.data[k].e;
        }

    }

    
return ERROR;
}


void main(){
    TSMatrix M;
    TSMatrix T;
    M.mu
=11;
    M.nu
=12;
    M.tu
=MAXSIZE;
    printf(
"输入行下标/列下标/元素: ");
    
for(int i=1;i<11;i++){
        printf(
"输入第%d个元素:",i);
        
if(!Insert(M,i))
            i
--;
    }

    printf(
"打印原始稀疏矩阵 ");
    PrintAll(M);
    printf(
"开始转置稀疏矩阵 ");
    FTSMatrix(M,T);
    printf(
"打印转置稀疏矩阵 ");
    PrintAll(T);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值