![](https://www.evernote.com/shard/s200/res/e93d1b5d-f700-472b-b4c5-f5a96fef0048/1338785239322.jpg)
公式化描述代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
为了避免第一个表和最后一个表的处理方法与其他的表不同,定义了两个边界表:表 0和表m+1,其中first[0]=last[0]=-1, first[m+1]=last[m+1]=MaxSize-1。为了在第 i 个表的第 k 个元素之后插入一个元素,首先需要为新元素创建空间。如果last[i]=first[i+1],则在第 i 个表和第 i + 1个表之间没有空间,因此不能把第 k + 1至最后一个元素向后移动一个位置。在这种情况下,通过检查关系式 last[i-1]<first[i]是否成立,可以确定是否有可能把第i 个表的1至k-1元素向前移一个位置;如果这个关系式不成立,要么需要把表 1至表i-1的元素向前移一个位置,要么把表 i+1至表m 向后移一个位置,然后为表 i创建需要增长的空间。当表中所有的元素总数少于 MaxSize时,这种移位的方法是可行的。图3-4是一个伪 C++函数,它向表 i 中插入一个新的元素,可以把该函数细化为兼容的 C++代码。
![](https://www.evernote.com/shard/s200/res/4ecf5325-da80-4d8b-a326-d17f5adea5bf/1338785502790.jpg)
![](https://www.evernote.com/shard/s200/res/3232c2ac-f547-4a1a-bf3f-86cd7faa177d/1338791582214.jpg)
![](https://www.evernote.com/shard/s200/res/fe1820de-1785-4b8e-801e-0eea712310b4/1338794305358.jpg)
![](https://www.evernote.com/shard/s200/res/871c0498-223f-4d80-bc43-45511df74cc0/1338801455329.jpg)
链表描述如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
下面是一个扩展的链表,包括了尾指针:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对应的测试代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://www.evernote.com/shard/s200/res/d13e7e7b-0096-4997-ab3b-5dce6b6fca99/1338802286529.jpg)
![](https://www.evernote.com/shard/s200/res/1cd76cd5-8ba8-47d4-b45e-b0846ac790ae/1338808241540.jpg)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://www.evernote.com/shard/s200/res/439cc1ca-9900-4433-a0de-5c91cf5183a8/1338814595114.jpg)
![](https://www.evernote.com/shard/s200/res/09027c83-4352-4748-a504-49a41cc9e9ea/1338814793449.jpg)
应用:箱子排序
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://www.evernote.com/shard/s200/res/db72f160-52e0-4085-b760-81ffce1837ec/1338884037858.jpg)
一维数组代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
二维数组代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
两种数组的测试代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
利用数组来实现二维矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://www.evernote.com/shard/s200/res/26ca15eb-a7f6-403a-b89c-469b809bf64e/latex-temp.gif)
![](https://www.evernote.com/shard/s200/res/26ca15eb-a7f6-403a-b89c-469b809bf64e/latex-temp.gif)
![](https://www.evernote.com/shard/s200/res/26ca15eb-a7f6-403a-b89c-469b809bf64e/latex-temp.gif)
![](https://www.evernote.com/shard/s200/res/aa9cf41f-beea-414b-be58-aad55483cb54/1338900396862.jpg)
对角矩阵实现代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
三对角角矩阵实现代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
下三角矩阵实现代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://www.evernote.com/shard/s200/res/8297fe42-2462-4b83-9893-c33da6f35e91/1338911915010.jpg)
稀疏矩阵数组实现代码:其中包括矩阵乘法的实现
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
稀疏矩阵链表实现的代码: 包括矩阵乘法的实现
方法一:利用前面实现的链表实现
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
#include " Chain_extended.h "
using namespace std;
template < class T>
class LinkedMatrix;
template < class T>
class HeadNode;
template < class T>
class CNode{
friend class LinkedMatrix<T>;
friend class HeadNode<T>;
public:
int operator!=( const CNode<T>& y){
return (value!=y.value);
}
void Output(ostream& out) const{
out<< " column "<<col<< " value "<<value;
}
private:
int col;
T value;
};
template< class T>
ostream& operator<<(ostream& out, const CNode<T>& x){
x.Output( out); out<<endl;
return out;
}
template< class T>
class HeadNode{
friend class LinkedMatrix<T>;
public:
int operator!=( const HeadNode<T>& y){
return (row!=y.row);
}
void Output(ostream& out) const{
out<< " row "<<row;
}
private:
int row;
Chain<CNode<T> >a;
};
template< class T>
ostream& operator<<(ostream& out, const HeadNode<T>& x){
x.Output( out);
out<<endl;
return out;
}
template< class T>
class LinkedMatrix{
public:
LinkedMatrix(){}
~LinkedMatrix(){}
void Transpose(LinkedMatrix<T> &b) const;
void Add( const LinkedMatrix<T> &b,LinkedMatrix<T>& c) const;
void Output(ostream& out) const;
void Input(istream& in);
private:
int rows,cols;
Chain<HeadNode<T> >a;
};
template< class T>
void LinkedMatrix<T>::Transpose(LinkedMatrix<T> &b) const
{
b.a.Erase();
Chain<CNode<T> >* bin;
bin= new Chain<CNode <T> >[cols+ 1];
ChainIterator<HeadNode<T> > p;
HeadNode<T>* h=p.Initialize(a);
while(h){
int r=h->row;
ChainIterator<CNode<T> > q;
CNode<T> *z=q.Initialize(h->a);
CNode<T> x;
x.col=r;
while(z){
x.value=z->value;
bin[z->col].Append(x);
z=q.Next();
}
h=p.Next();
}
b.rows=cols;
b.cols=rows;
HeadNode<T> H;
for( int i= 1;i<=cols;i++)
if(!bin[i].IsEmpty()){
H.row=i;
H.a=bin[i];
b.a.Append(H);
bin[i].Zero();
}
H.a.Zero();
delete[] bin;
}
template< class T>
void LinkedMatrix<T>::Add( const LinkedMatrix<T> &b,LinkedMatrix<T>& c) const
{
}
template< class T>
void LinkedMatrix<T>::Output(ostream& out) const
{
ChainIterator<HeadNode<T> > p;
out<< " rows= "<<rows<< " columns= "<<cols<<endl;
HeadNode<T> *h=p.Initialize(a);
if(!h){
out<< " No non-zero terms "<<endl;
return ;
}
while(h){
out<< " row "<<h->row<<endl;
out<<h->a<<endl;
h=p.Next();
}
}
template< class T>
ostream& operator<<(ostream & out, const LinkedMatrix<T> & c)
{
c.Output( out);
return out;
}
template< class T>
void LinkedMatrix<T>::Input(istream& in)
{
a.Erase();
int terms;
cout<< " Enter number of rows,columns and terms "<<endl;
in>>rows>>cols>>terms;
HeadNode<T> H;
H.row= 0;
for( int i= 1;i<=terms;i++){
cout<< " Enter row,column and value of term "<<i<<endl;
int row,col;
T value;
in>>row>>col>>value;
if(row>H.row){
if(H.row)
a.Append(H);
H.row=row;
H.a.Zero();
}
CNode<T>* c= new CNode<T>;
c->col=col;
c->value=value;
H.a.Append(*c);
}
if(H.row)
a.Append(H);
H.a.Zero();
}
template< class T>
istream& operator>>(istream& in,LinkedMatrix<T> &c)
{
c.Input( in);
return in;
}
int main( void)
{
LinkedMatrix< int> a, b, c;
// test input and output
cin >> a;
cout << " Matrix a is " << endl << a;
cin >> b;
cout << " Matrix b is " << endl << b;
// test transpose
a.Transpose(c);
cout << " The transpose of a is " << endl << c;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
#include <list>
#include <vector>
using namespace std;
template < class T>
class LinkedMatrix;
template < class T>
class HeadNode;
template < class T>
class CNode{
friend class LinkedMatrix<T>;
friend class HeadNode<T>;
public:
int operator!=( const CNode<T>& y){
return (value!=y.value);
}
void Output(ostream& out) const{
out<< " column "<<col<< " value "<<value;
}
private:
int col;
T value;
};
template< class T>
ostream& operator<<(ostream& out, const CNode<T>& x){
x.Output( out); out<<endl;
return out;
}
template< class T>
class HeadNode{
friend class LinkedMatrix<T>;
public:
int operator!=( const HeadNode<T>& y){
return (row!=y.row);
}
void Output(ostream& out) const{
out<< " row "<<row;
}
private:
int row;
list<CNode<T> > a;
};
template< class T>
ostream& operator<<(ostream& out, const HeadNode<T>& x){
x.Output( out);
out<<endl;
return out;
}
template< class T>
class LinkedMatrix{
public:
LinkedMatrix(){}
~LinkedMatrix(){}
void Transpose(LinkedMatrix<T> &b) const;
void Add( const LinkedMatrix<T> &b,LinkedMatrix<T>& c) const;
void Multiply( const LinkedMatrix<T> &b,LinkedMatrix<T>& c) const;
void Output(ostream& out) const;
void Input(istream& in);
private:
int rows,cols;
list<HeadNode<T> > a;
};
template< class T>
void LinkedMatrix<T>::Transpose(LinkedMatrix<T> &b) const
{
b.a.clear();
vector<list<CNode<T> > > bin(cols+ 1);
typename list<HeadNode<T> >::const_iterator it;
typename list<CNode<T> >::const_iterator it2;
for(it=a.begin();it!=a.end();++it){
int r=it->row;
CNode<T> x;
x.col=r;
for(it2=(*it).a.begin();it2!=(*it).a.end();++it2){
x.value=it2->value;
bin[it2->col].push_back(x);
}
}
b.rows=cols;
b.cols=rows;
HeadNode<T> H;
for( int i= 1;i<=cols;i++)
if(!bin[i].empty()){
H.row=i;
H.a=bin[i];
b.a.push_back(H);
}
}
template< class T>
void LinkedMatrix<T>::Add( const LinkedMatrix<T> &b,LinkedMatrix<T>& c) const
{
if(rows!=b.rows||cols!=b.cols)
throw " Size Miss Match ";
c.a.clear();
c.rows=rows;
c.cols=cols;
typename list<HeadNode<T> >::const_iterator itt;
typename list<HeadNode<T> >::const_iterator itb;
typename list<CNode<T> >::const_iterator it2t;
typename list<CNode<T> >::const_iterator it2b;
itt=a.begin();
itb=b.a.begin();
while(itt!=a.end()&&itb!=b.a.end()){
int rt=itt->row;
int rb=itb->row;
if(rt>rb){
c.a.push_back(*itb);
++itb;
}
else if(rt<rb){
c.a.push_back(*itt);
++itt;
}
else{
it2t=(*itt).a.begin();
it2b=(*itb).a.begin();
HeadNode<T> H;
H.row=rt;
while(it2t!=(*itt).a.end()&&
it2b!=(*itb).a.end()){
int ct=it2t->col;
int cb=it2b->col;
if(ct>cb){
H.a.push_back(*it2b);
++it2b;
}
else if(ct<cb){
H.a.push_back(*it2t);
++it2t;
}
else{
CNode<T> cn;
cn.col=ct;
cn.value=it2t->value+it2b->value;
H.a.push_back(cn);
++it2t;
++it2b;
}
}
while(it2t!=(*itt).a.end())
H.a.push_back(*it2t++);
while(it2b!=(*itb).a.end())
H.a.push_back(*it2b++);
c.a.push_back(H);
++itt;
++itb;
}
}
while(itt!=a.end())
c.a.push_back(*itt++);
while(itb!=b.a.end())
c.a.push_back(*itb++);
}
template< class T>
void LinkedMatrix<T>::Multiply( const LinkedMatrix<T> &b2,LinkedMatrix<T>& c) const
{
if(cols!=b2.rows)
throw " Size Miss Match ";
c.a.clear();
c.rows=rows;
c.cols=b2.cols;
LinkedMatrix<T> b;
b2.Transpose(b);
typename list<HeadNode<T> >::const_iterator itt;
typename list<HeadNode<T> >::const_iterator itb;
typename list<CNode<T> >::const_iterator it2t;
typename list<CNode<T> >::const_iterator it2b;
itt=a.begin();
while(itt!=a.end()){
int rt=itt->row;
HeadNode<T> H;
H.row=rt;
itb=b.a.begin();
while(itb!=b.a.end()){
int rb=itb->row;
it2t=(*itt).a.begin();
it2b=(*itb).a.begin();
CNode<T> cn;
cn.col=rb;
T sum= 0;
while(it2t!=(*itt).a.end()&&
it2b!=(*itb).a.end()){
int ct=it2t->col;
int cb=it2b->col;
if(ct>cb){
++it2b;
} else if(ct<cb){
++it2t;
} else {
sum+=it2t->value*it2b->value;
++it2t;
++it2b;
}
}
if(sum!= 0){
cn.value=sum;
H.a.push_back(cn);
}
++itb;
}
c.a.push_back(H);
++itt;
}
}
template< class T>
void LinkedMatrix<T>::Output(ostream& out) const
{
out<< " rows= "<<rows<< " columns= "<<cols<<endl;
typename list<HeadNode<T> >::const_iterator it;
typename list<CNode<T> >::const_iterator it2;
for(it=a.begin();it!=a.end();it++){
out<< " row "<<it->row<<endl;
for(it2=(*it).a.begin();it2!=(*it).a.end();it2++){
out<<(*it2);
}
}
}
template< class T>
ostream& operator<<(ostream & out, const LinkedMatrix<T> & c)
{
c.Output( out);
return out;
}
template< class T>
void LinkedMatrix<T>::Input(istream& in)
{
a.clear();
int terms;
cout<< " Enter number of rows,columns and terms "<<endl;
in>>rows>>cols>>terms;
typename list<HeadNode<T> >::iterator it;
typename list<CNode<T> >::iterator it2;
for( int i= 1;i<=terms;i++){
cout<< " Enter row,column and value of term "<<i<<endl;
int row,col;
T value;
in>>row>>col>>value;
CNode<T> c;
c.col=col;
c.value=value;
for(it=a.begin();it!=a.end()&&row>(*it).row;it++);
if(it==a.end()){
HeadNode<T> H;
H.row=row;
H.a.push_back(c);
a.push_back(H);
}
else if(row<(*it).row){
HeadNode<T> H;
H.row=row;
H.a.push_back(c);
a.insert(it,H);
}
else if((*it).row==row){
for(it2=(*it).a.begin();it2!=(*it).a.end()&&col>(*it2).col;it2++);
if(it2==(*it).a.end()){
(*it).a.push_back(c);
}
else{
(*it).a.insert(it2,c);
}
}
}
}
template< class T>
istream& operator>>(istream& in,LinkedMatrix<T> &c)
{
c.Input( in);
return in;
}
int main( void)
{
LinkedMatrix< int> a, b, c;
// test input and output
cin >> a;
cout << " Matrix a is " << endl << a;
cin >> b;
cout << " Matrix b is " << endl << b;
// test transpose
// a.Transpose(c);
// cout << "The transpose of a is" << endl << c;
// a.Add(b,c);
// cout << "The sum of a and b is" << endl << c;
a.Multiply(b,c);
cout << " The sum of a and b is " << endl << c;
return 0;
}