//  aaa.h  //

#include<iostream>
using namespace std;

typedef struct
{
 int i,j,e;
}Triple;

typedef struct
{
 Triple data[30];
 int mu,nu,tu;
}TSMtatrix;

TSMtatrix Init(TSMtatrix &M)//初始化三元组顺序表
{
 M.mu=5;M.nu=5;M.tu=0;
 M.data[0].i=0;M.data[0].j=0;M.data[0].e=1;
 return M;
}

TSMtatrix houyi(TSMtatrix &M,int k)//把三元组顺序表从 M.tu-k+1 位置开始向后移位
{
 M.tu++;
 int test=M.tu;
 for(int w=1;w<=k;w++){
  M.data[test]=M.data[test-1];
  test--;
 }
 return M;
}

TSMtatrix qianyi(TSMtatrix &M,int k)//把三元组顺序表从 M.tu-k 位置开始向前移位
{
 int test=M.tu;
 for(int w=0;w<k;w++)
  M.data[M.tu-k+w]=M.data[M.tu-k+w+1];
 M.tu--;
 return M;
}
void out(TSMtatrix M)//输出三元组顺序表
{
 for(int i=1;i<=M.tu;i++){
  cout<<M.data[i].i<<"  "<<M.data[i].j<<"  "<<M.data[i].e<<endl;
 }
}

 

//  aaa.cpp  //

#include"aaa.h"

void main()
{
 int A[5][5]={
  {0,0,3,0,0},
  {5,0,0,6,0},
  {3,0,0,0,0},
  {0,7,0,0,4},
  {0,0,0,1,0},
  };
 int B[5][5]={
  {0,3,0,0,0},
  {-5,0,6,0,0},
  {8,0,0,0,0},
  {0,2,0,7,0},
  {0,0,1,0,4},
  };
 TSMtatrix M,N,R;
 Init(M);Init(N);Init(R);
 //M.tu++;N.tu++;R.tu++;
 int t1=1,t2=1;
 for(int i=0;i<M.mu;i++)
  for(int j=0;j<M.nu;j++){
   if(A[i][j]!=0){
    M.tu++;
    M.data[M.tu].i=i;
    M.data[M.tu].j=j;
    M.data[M.tu].e=A[i][j];
   }
   if(B[i][j]!=0){
    N.tu++;
    N.data[N.tu].i=i;
    N.data[N.tu].j=j;
    N.data[N.tu].e=B[i][j];
   }
  }
 for(i=1;i<=M.tu;i++){
  R.tu++;
  R.data[R.tu]=M.data[i];
 }
 cout<<"矩阵M的三元组顺序表为:\n";out(M);
 cout<<"矩阵N的三元组顺序表为:\n";out(N);
 for(i=1;i<=N.tu;i++){
  for(int j=1;j<=R.tu;j++){
   if(R.data[j].i==N.data[i].i && R.data[j].j==N.data[i].j){
    R.data[j].e+=N.data[i].e;//如果有两元素位置相同的的,就直接相加
   }
   if(R.data[j].i==N.data[i].i && R.data[j].j>N.data[i].j || R.data[j].i>N.data[i].i)
    if(R.data[j-1].i==N.data[i].i && R.data[j-1].j<N.data[i].j || R.data[j-1].i<N.data[i].i){
     houyi(R,R.tu+1-j);//如果有两元素位置相同不同,就向后移一位,插入新的元素
     R.data[j]=N.data[i];
   }
   
  }
  if(R.data[R.tu].i==N.data[i].i && R.data[R.tu].j<N.data[i].j || R.data[R.tu].i<N.data[i].i){
   R.tu++;
   R.data[R.tu]=N.data[i];
  }
 }
 for(int j=1;j<=R.tu;j++)
  if(R.data[j].e==0)
    qianyi(R,R.tu-j);//如果有两元素相加为零的,就向前移一位
 cout<<"矩阵M+N的三元组顺序表为:\n";out(R);
}

posted on 2013-04-29 11:43  向云武  阅读(299)  评论(0编辑  收藏  举报