1. 程式人生 > >(重新放入原始碼)稀疏矩陣壓縮儲存及轉置,加法運算(採用三元表)

(重新放入原始碼)稀疏矩陣壓縮儲存及轉置,加法運算(採用三元表)


一、        實驗環境

VC6.0,

 二、        實驗目的

 輸入任意兩個稀疏矩陣進入三元表,求出其加法運算後的矩陣,轉置矩陣,輸出矩陣。

 三、        實驗內容

1用C語言實現稀疏矩陣的三元組儲存結構 ;

2實現稀疏矩陣的矩陣輸入、矩陣輸出等演算法;

3.利用三元組儲存結構解決稀疏矩陣的運算問題(稀疏矩陣的轉置、稀疏矩陣的加法等) 。

四、        資料結構與演算法思想描述

    用三元表實現的。採用結構體表示三元表,三元組表。

(1)建立稀疏矩陣,以行優先順序存放,使用者只需輸入稀疏矩陣非零元素的個數,及其具體座標,值。就能依次放入三元表中,

(2)兩個稀疏矩陣相加,首先遍歷A,將值全部放入C裡,同樣,B也放入C裡。

迴圈A,B。如果兩矩陣存在座標相同的點則相加之後更改C中同樣位置的值。

(3) 稀疏矩陣的轉置,將A的行列數互換再賦值給D。遍歷a,將元素值的橫縱座標互換,元素值不變,賦值到d.的三元表組裡面。

(4) 輸出稀疏矩陣,建立一個數組,大小最大為【10】【10】,全部賦值為0,在遍歷三元表,當行列存在時,將三元表的元素值賦值到數組裡。在逐個輸出陣列。



#include<stdio.h>
#include<stdlib.h>
typedef struct{
   int row,col;
   int e;
}triplelist;
typedef struct{
    triplelist data[100];
    int m,n,len;
}node;
//宣告函式
void create(node &a);//建立稀疏矩陣三元組
void add(node &a,node &b,node &c);//兩個稀疏矩陣相加
void nodeprint(node &a);//輸出稀疏矩陣
void nodetransposition(node &a,node &d);//稀疏矩陣的轉置
void create(node &a){
     int i,l;
     scanf("%d",&l);
     while(l>100){
          printf("稀疏矩陣的個數不能超過100!\n");
          printf("請重新輸入稀疏矩陣中的非零元素:");
          scanf("%d",&l);
     }
    a.len=l;
    printf("請輸入稀疏矩陣中的行數:\n");
    scanf("%d",&a.m);
    printf("請輸入稀疏矩陣中的列數:\n");
    scanf("%d",&a.n);
    for(i=0;i<l;i++){
       printf("請輸入稀疏矩陣中的第%d個非零元素的行標(從0開始),列標(從0開始),元素值:\n",i);
       scanf("%d",&a.data[i].row);
        scanf("%d",&a.data[i].col);
           scanf("%d",&a.data[i].e);
         while(a.data[i].row+1>a.m){
               printf("請重新輸入稀疏矩陣中的第%d個非零元素的行標:\n",i);
                 scanf("%d",&a.data[i].row);
         }
          while(a.data[i].col+1>a.n){
               printf("請重新輸入稀疏矩陣中的第%d個非零元素的列標:\n",i);
                 scanf("%d",&a.data[i].col);
         }
    }
}
void add(node &a,node &b,node &c){
    if(a.m==b.m&&a.n==b.n){
        int i,j,k=0;
        c.m=a.m;
        c.n=a.n;
       for(i=0;i<a.len;i++)
            for(j=0;j<b.len;j++){
                if(a.data[i].row==b.data[j].row&&a.data[i].col==b.data[j].col){
                    c.data[k].col=a.data[i].col;
                    c.data[k].row=a.data[i].row;
                    c.data[k].e=a.data[i].e+b.data[j].e;
                    k++;
                }
                else{
                    c.data[k].col=a.data[i].col;
                    c.data[k].row=a.data[i].row;
                    c.data[k].e=a.data[i].e;
                    k++;
                    c.data[k].col=b.data[j].col;
                    c.data[k].row=b.data[j].row;
                    c.data[k].e=b.data[j].e;
                    k++;
                }
                 
            }
    c.len=k;
    }
    else{
         printf("只有同型矩陣才能進行加法運算(即:兩個矩陣的行列相同)\n");
    }

}
void nodeprint(node &a){
     int k=0,i,j,m=a.m ,n=a.n;     
     int b[10][10]={0};
     for(i=0;i<m;i++)
         for(j=0;j<n;j++)
             for(k=0;k<a.len;k++)
                 if(a.data[k].row==i&&a.data[k].col==j){
                    b[i][j]=a.data[k].e;  
                }

    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
         printf("%d ",b[i][j]);
        printf("\n");
     }
}
void nodetransposition(node &a,node &d){
     int i;
     d.m=a.n;
     d.n=a.m;
     d.len=a.len;
     for(i=0;i<a.len;i++){
        d.data[i].col=a.data[i].row;
        d.data[i].row=a.data[i].col;
        d.data[i].e=a.data[i].e;
     }

}
int main(){
    node a,b,c,d;
    printf("輸入第一個稀疏矩陣的非零元素的個數:\n");
    create(a);
    printf("輸入第二個稀疏矩陣的非零元素的個數:\n");
    create(b);
    printf("輸出第一個稀疏矩陣:\n");
    nodeprint(a);
    printf("輸出第二個稀疏矩陣:\n");
    nodeprint(b);
    printf("輸入第一個稀疏矩陣的轉置矩陣:\n");
    nodetransposition(a,d);
    nodeprint(d);
    printf("輸入兩個稀疏矩陣相加之和為:\n");
    add(a,b,c);
    nodeprint(c);
  return 0;
}









實驗分析:

輸入:created(node&a)函式,輸入非零元素個數,行列數,再輸入非零元素座標,

輸出:nodeprint(node &a)函式:建立一個數組,大小最大為【10】【10】,全部賦值為0,在遍歷三元表,當行列存在時,將三元表的元素值賦值到數組裡。在逐個輸出陣列。

轉置:nodetransposition(node &a,node &d),將a的行列數互換放到d中。遍歷a,將元素值的橫縱座標互換,元素值不變,賦值到d.data[]裡面。

加法運算:add(node&a,node &d,node &c)分別遍歷a,b將值放到c裡面,然後在同時遍歷a,b當兩矩陣相同的位置上有值時,相加在放入c中。如果兩個不同型矩陣,則不能進行加法運算。

Main()函式:建立兩個矩陣,依次呼叫created(node&a),nodeprint(node &a),nodetransposition(node &a,node &d), add(node&a,node &d,node &c) ,nodeprint(node&a)。