用三元組連結串列表示的稀疏矩陣類
稀疏矩陣類:XL_array.h
#include <iostream>
#include <iomanip>
using namespace std;
template <class T>
struct B
{
int i; /*非零元素行號*/
int j; /*非零元素列號*/
T v; /*非零元素值*/
B<T> *next; /* 指向下一個結點的指標*/
};
template <class T>
class XL_array
{
private:
int mm; /* 稀疏矩陣的行數*/
int nn; /* 稀疏矩陣的列數*/
int tt; /* 稀疏矩陣非零個數*/
B<T> * head; /*三元組連結串列頭指標*/
public:
XL_array()
{
head=NULL;return; /* 三元組連結串列初始化*/
}
void in_XL_array(); /*以三元組形式從鍵盤輸入稀疏矩陣非零元素*/
void th_XL_array(int,int,T[]); /*由一般稀疏矩陣轉換*/
void prt_XL_array(); /*按行輸出稀疏矩陣*/
XL_array tran_XL_array(); /*稀疏矩陣轉置*/
XL_array operator +(XL_array &); /*稀疏矩陣相加*/
};
//以三元組形式從鍵盤輸入稀疏矩陣非零元素
template<class T>
void XL_array<T>::in_XL_array()
{
int k,m,n;
T d;
B<T> *p,*q;
cout<<"請輸入行數 列數 非零元素個數:"<<endl;
cin>>mm>>nn>>tt;
q=NULL;
cout<<"輸入行號 列號 非零元素值:"<<endl;
for(k=0;k<tt;k++)
{
cin>>m>>n>>d;
p=new B<T>;
p->i=m-1;
p->j=n-1;
p->v=d;
p->next=NULL;
if(head==NULL)head=p;
else q->next=p;
q=p;
}
return;
}
/*由一般稀疏矩陣轉換*/
template<class T>
void XL_array<T>::th_XL_array(int m,int n,T a[])
{
int t=0,p,q;
B<T>*s,*k;
T d;
mm=m;nn=n;
k=NULL;
for(p=0;p<m;p++)
for(q=0;q<n;q++)
{
d=a[p*n+q];
if(d!=0)
{
s=new B<T>;
s->i=p;
s->j=q;
s->v=d;
s->next=NULL;
if(NULL==head) head=s;
else k->next=s;
k=s;
t=t+1;
}
}
tt=t;
return;
}
/*按行輸出稀疏矩陣*/
template<class T>
void XL_array<T>::prt_XL_array()
{
int k,kk;
B<T> *p;
p=head;
for(k=0;k<mm;k++) /*按行輸出*/
{
for(kk=0;kk<nn;kk++) /*輸出一行*/
if (p!=NULL)
{
if((p->i==k)&&(p->j==kk)) /*輸出非零元素*/
{
cout<<setw(8)<<p->v;
p=p->next;
}
else
cout<<setw(8)<<0;
}
else
cout<<setw(8)<<0;
cout<<endl;
}
return;
}
/*稀疏矩陣轉置*/
template <class T>
XL_array<T> XL_array<T>::tran_XL_array()
{
XL_array<T> at; /*定義轉置矩陣物件*/
int p;
B<T> *s,*k,*q;
at.mm=nn;at.nn=mm;at.tt=tt; /*轉置矩陣行列數及非零元素個數*/
k=NULL;
for(p=0;p<nn;p++)
for(q=head;q!=NULL;q=q->next)
{
if(q->j==p)
{
s=new B<T>;
s->i=q->j;
s->j=q->i;
s->v=q->v;
s->next=NULL;
if(k==NULL)at.head=s;
else k->next=s;
k=s;
}
}
return at;
}
//稀疏矩陣相加
template <class T>
XL_array<T> XL_array<T>::operator+(XL_array &b)
{
XL_array<T> c;
T d;
B<T> *m,*n,*q,*s;
int k=0;
q=NULL; /*記住鏈尾 */
if((mm!=b.mm)||(nn!=b.nn))
cout<<"不能相加"<<endl;
else
{
m=head;n=b.head;
while((m!=NULL)&&(n!=NULL))
{
if(m->i==n->i) /* 行號相同*/
{ if(m->j==n->j) /* 列號相同則相加*/
{
d=m->v+n->v;
if(d!=0) /* 相加後非零*/
{
s=new B<T>; /*申請一個三元組結點*/
s->i=m->i;
s->j=m->j;
s->v=d;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s; /*記住鏈尾*/
k=k+1; /*非零元素個數加1*/
}
m=m->next;n=n->next;
}
else if (m->j<n->j) /*列號不同則複製列號小的一項*/
{
s=new B<T>;
s->i=m->i;s->j=m->j;s->v=m->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
m=m->next;
}
else /* 列號不同複製另一項*/
{
s=new B<T>;
s->i=n->i;s->j=n->j;s->v=n->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
n=n->next;
}
}
else if(m->i<n->i) /*複製矩陣中行號小的非零元素*/
{
s=new B<T>;
s->i=m->i;s->j=m->j;s->v=m->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
m=m->next;
}
else /* 複製另一矩陣中本行的一個非零元素*/
{
s=new B<T>;
s->i=n->i;s->j=n->j;s->v=n->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
n=n->next;
}
}
while(m!=NULL) /*複製矩陣中剩餘的非零元素*/
{
s=new B<T>;
s->i=m->i;s->j=m->j;s->v=m->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
m=m->next;
}
while(n!=NULL) /*複製另一個矩陣中剩餘的非零元素個數*/
{
s=new B<T>;
s->i=n->i;s->j=n->j;s->v=n->v;
s->next=NULL;
if(q==NULL)c.head=s;
else q->next=s;
q=s;
k=k+1;
n=n->next;
}
c.mm=mm;c.nn=nn;c.tt=k;
}
return c; /* 返回想加結果*/
}
2.應用例項
#include "XL_array.h"
#include <stdlib.h>
int main()
{
double a[7][8]={{0,0,3,0,0,0,0,1},
{0,0,0,0,0,0,0,0},
{9,0,0,0,0,0,0,0},
{0,0,0,0,7,0,0,0},
{0,0,0,0,0,0,6,0},
{0,0,0,2,0,3,0,0},
{0,0,5,0,0,0,0,0}};
XL_array<double> x,y,z,xt,c;
x.th_XL_array(7,8,&a[0][0]);
cout<<"輸出稀疏矩陣x:"<<endl;
x.prt_XL_array();
xt=x.tran_XL_array();
cout<<"輸出轉置稀疏矩陣xt:"<<endl;
xt.prt_XL_array();
y.in_XL_array();
cout<<"輸出稀疏矩陣y:"<<endl;
y.prt_XL_array();
z=x+y;
cout<<"輸出稀疏矩陣z=x+y:"<<endl;
z.prt_XL_array();
system("pause");
return 0;
}
3.實驗結果:
相關文章
- 用十字連結串列表示的稀疏矩陣類矩陣
- 用三列二維陣列表示的稀疏矩陣類陣列矩陣
- 第八週 專案4-稀疏矩陣的三元組表示的實現及應用矩陣
- 稀疏矩陣之三元組壓縮儲存並且轉置矩陣
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【2】) (轉)資料結構C++矩陣
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【1】) (轉)資料結構C++矩陣
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 稀疏矩陣矩陣
- 資料結構(一)-稀疏矩陣資料結構矩陣
- 稀疏矩陣轉置矩陣
- MapReduce矩陣;及快排單連結串列之解答矩陣
- 【scipy 基礎】--稀疏矩陣矩陣
- CUDA版本稀疏矩陣向量乘矩陣
- OpenMP 版本稀疏矩陣向量乘矩陣
- C/C++ 陣列連結串列表示式計算C++陣列
- 陣列和連結串列陣列
- 陣列與連結串列陣列
- 資料結構之連結串列與陣列(1):陣列和連結串列的簡介資料結構陣列
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 陣列和連結串列的區別陣列
- 可變陣列——連結串列前言陣列
- 陣列模擬單連結串列陣列
- 面試-陣列和連結串列的區別面試陣列
- 刪除陣列中的元素(連結串列)陣列
- 線性結構 陣列與連結串列陣列
- OpenGL 矩陣變換相關連結矩陣
- 矩陣連乘矩陣
- (連結串列)連結串列的排序問題排序
- 資料結構之連結串列與陣列(3):單向連結串列上的簡單操作資料結構陣列
- 模擬STL連結串列類的實現
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 資料結構之陣列和連結串列資料結構陣列
- C++中的連結串列類的設計C++
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- MKL稀疏矩陣運算示例及函式封裝矩陣函式封裝