陣列和廣義表的基本運算實現(三元組)
問題及程式碼:
a: b:
/*
* Copyright (c) 2016, 煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:6-4.cpp
* 作 者:單昕昕
* 完成日期:2016年5月30日
* 版 本 號:v1.0
* 問題描述:假設n n的稀疏矩陣A採用三元組表示,設計一個程式exp6-4.cpp實現如下功能:
(1)生成如下兩個稀疏矩陣的三元組a和b;
(2)輸出a轉置矩陣的三元組;
(3)輸出a+b的三元組;
(4)輸出a b的三元組。
* 程式輸入:無
* 程式輸出:如題。
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define M 4//行數
#define N 4//列數
#define MaxSize 1010//稀疏矩陣中非零元素最多個數
typedef struct
{
int r;//行號
int c;//列號
int d;//元素值
} TupNode;//三元組定義
typedef struct
{
int rows;//行數
int cols;//列數
int nums;//非零元素個數
TupNode data[MaxSize];
} TSMatrix;//三元組順序表定義
//以行序方式掃描稀疏矩陣A,將其非零元素插入到三元組t中
void CreatMat(TSMatrix &t,int A[M][N])
{
int i,j;
t.rows=M,t.cols=N,t.nums=0;
for(i=0; i<M; ++i)//行主序開始掃描
for(j=0; j<N; ++j)
if(A[i][j])//只儲存非零元素
{
t.data[t.nums].r=i;
t.data[t.nums].c=j;
t.data[t.nums].d=A[i][j];
++t.nums;
}
}
//輸出三元組
void DisMat(TSMatrix t)
{
if(t.nums<=0) return;
cout<<'\t'<<t.rows<<'\t'<<t.cols<<'\t'<<t.nums<<endl;
cout<<'\t'<<"-------------------"<<endl;
for(int i=0; i<t.nums; ++i)
cout<<'\t'<<t.data[i].r<<'\t'<<t.data[i].c<<'\t'<<t.data[i].d<<endl;
}
//矩陣轉置
void TranTat(TSMatrix t,TSMatrix &tb)
{
int p,q=0,v;
tb.rows=t.cols;
tb.cols=t.rows;
tb.nums=t.nums;
if(t.nums!=0)
for(v=0; v<t.cols; ++v)
for(p=0; p<t.nums; ++p)
if(t.data[p].c==v)
{
tb.data[q].r=t.data[p].c;
tb.data[q].c=t.data[p].r;
tb.data[q].d=t.data[p].d;
++q;
}
}
//兩個稀疏矩陣相加
bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)
{
int i=0,j=0,k=0;
int v;
if(a.rows!=b.rows||a.cols!=b.cols) return false;
c.rows=a.rows,c.cols=a.cols;
while(i<a.nums&&j<b.nums)
{
if(a.data[i].r==b.data[j].r)
{
if(a.data[i].c<b.data[j].c)
{
c.data[k].r=a.data[i].r;
c.data[k].c=a.data[i].c;
c.data[k].d=a.data[i].d;
++k,++i;
}
else if(a.data[i].c>b.data[j].c)
{
c.data[k].r=b.data[i].r;
c.data[k].c=b.data[i].c;
c.data[k].d=b.data[i].d;
++k,++j;
}
else
{
v=a.data[i].d+b.data[j].d;
if(v)
{
c.data[k].r=a.data[i].r;
c.data[k].c=a.data[i].c;
c.data[k].d=v;
++k;
}
++i,++j;
}
}
else if(a.data[i].r<b.data[j].r)
{
c.data[k].r=a.data[i].r;
c.data[k].c=a.data[i].c;
c.data[k].d=a.data[i].d;
++k,++i;
}
else
{
c.data[k].r=b.data[i].r;
c.data[k].c=b.data[i].c;
c.data[k].d=b.data[i].d;
++k,++j;
}
c.nums=k;
}
return true;
}
//兩個稀疏矩陣相乘
void MatMul(int a[M][N],int b[M][N],int z[M][N])
{
memset(z,0,sizeof(z));
int i,j,k;
for (k=0; k<N; k++)
for(i=0; i<N; i++)
for (j=0; j<N; j++)
z[i][k]+=a[i][j]*b[j][k];
}
TSMatrix a,b,c;
int z[M][N];
int main()
{
int x[M][N]= {1,0,3,0,
0,1,0,0,
0,0,1,0,
0,0,1,1
};
int y[M][N]= {3,0,0,0,
0,4,0,0,
0,0,1,0,
0,0,0,2
};
CreatMat(a,x);
cout<<"a的三元組:"<<endl;
DisMat(a);
CreatMat(b,y);
cout<<"b的三元組:"<<endl;
DisMat(b);
cout<<"a轉置為c"<<endl;
TranTat(a,c);
cout<<"c的三元組:"<<endl;
DisMat(c);
cout<<"c=a+b"<<endl;
cout<<"c的三元組:"<<endl;
if(MatAdd(a,b,c)) DisMat(c);
cout<<"c=a×b"<<endl;
cout<<"c的三元組:"<<endl;
MatMul(x,y,z);
/*for(int i=0; i<4; ++i)
{
for(int j=0; j<4; ++j)
cout<<z[i][j]<<" ";
cout<<endl;
}*/
CreatMat(c,z);
DisMat(c);
return 0;
}
/*
1 0 3 0
0 1 0 0
0 0 1 0
0 0 1 1
3 0 0 0
0 4 0 0
0 0 1 0
0 0 0 2
*/
執行結果:
相關文章
- 位運算實現整數與位元組陣列轉換陣列
- 【numpy學習筆記】陣列的建立和基本運算筆記陣列
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- 陣列的位移運算陣列
- 串的基本運算實現-加密解密串加密解密
- 三元運算+包機制
- 線性表1.0(陣列實現)陣列
- js實現的陣列自定義排序介紹JS陣列排序
- %rowtype和陣列的基本記載陣列
- 陣列(2)陣列運算及典例(求解素數的方法)陣列
- DELPHI也可以實現控制元件陣列,用定義陣列變數實現控制元件陣列 (轉)控制元件陣列變數
- 教你如何運用golang實現陣列分割Golang陣列
- NumPy 基礎 (二) - 陣列運算陣列
- 實體類定義陣列物件,和物件陣列物件
- 【java】【集合】陣列和集合的基本概述Java陣列
- 最大連續子陣列和的實現陣列
- 陣列的基本操作陣列
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- 教你如何運用golang 實現陣列的隨機排序Golang陣列隨機排序
- verilog實現矩陣卷積運算矩陣卷積
- 第八週 專案4-稀疏矩陣的三元組表示的實現及應用矩陣
- 陣列排序的實現陣列排序
- 廣義智慧集基本定義公式公式
- 資料結構(C語言版)第2版------第四章 陣列、串和廣義表資料結構C語言陣列
- 裝個逼:自定義三元運算子
- 舌尖上的javascript陣列和字串基本操作JavaScript陣列字串
- 基礎入門:深度學習矩陣運算的概念和程式碼實現深度學習矩陣
- 陣列操作,計算組元素的極值函式陣列函式
- Python科學計算庫Numpy陣列的初始化和基本操作Python陣列
- VIVADO vhdl verilog 實現矩陣運算矩陣
- 向量化實現矩陣運算最佳化(一)矩陣
- Bert結構手動矩陣運算實現(Transform)矩陣ORM
- 初識Java(Java陣列-陣列的基本操作)Java陣列
- 使用陣列進行大資料運算陣列大資料
- c語言關於陣列的簡單運算C語言陣列
- 使用Apache的Hex類實現Hex(16進位制字串和)和位元組陣列的互轉Apache字串陣列
- JAVA的陣列基本用法Java陣列
- js實現的字串和陣列的相互轉換JS字串陣列