首页 > 代码库 > 三元组

三元组

#define  Maxsize   100
#define  M  6
#define  N  6
typedef struct 
{
    int r;//行号
    int c;//列号
    int d;//元素值
}TupNode;
typedef struct
{
    int rows;//行数值
    int cols;//列数值
    int nums;//非零元素个数
    TupNode data[Maxsize];
}TSMatrix;   //三元组顺序表定义
//从一个二维矩阵创建其三元组表示的运算算法
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]!=0)  //只存储非0元
            {
                t.data[t.nums].r =i;
                t.data [t.nums ].c=j;
                t.data [t.nums ].d=A[i][j];
                t.nums ++;
            }
        }
    }
}
//三元组元素赋值运算算法
int Value(TSMatrix &t,int x,int rs,int cs) 
{
    int i,k;
    if(rs>=t.rows || cs>=t.cols)
        return 0;
    while(k<t.nums && rs>t.data[k].r)  k++; //寻找位置
    while(k<t.nums && cs>t.data[k].c)  k++;
    if(t.data[k].r==rs && t.data[k].c==cs)
        t.data[k].d=x;   //该元素存在
    else   //该元素不存在
    {
        for(i=k;i<=t.nums ;i++) //将i后面的元素后移
        {
            t.data[i+1].r=t.data[i].r;
            t.data[i+1].c=t.data[i].c;
            t.data[i+1].d=t.data[i].d;
        }
        t.data[k].r=rs;
        t.data[k].c=cs;
        t.data[k].d=x;
        t.nums ++;
    }
    return 1;
}
//将指定位置的元素赋给变量的运算算法
int Assign(TSMatrix t,int &x,int rs,int cs)
{
    int k=0;
    if(rs>=t.rows ||cs>=t.cols)
        return 0;
    while(k<t.nums && rs>t.data[k].r)  k++;
    while(k<t.nums && cs>t.data[k].c)  k++;
    if(t.data[k].r==rs&&t.data[k].c==cs)
    {
        x=t.data[k].d;
        printf("第 %d 行第 %d 列的元素为:x=%d\n",rs,cs,x);
        return x;
    }
    else return 0;
}
//输出三元组运算算法
int  DispMat(TSMatrix t)
{
    int i;
    if(t.nums <=0)
        return 0;
    printf("\t%d\t%d\t%d\n",t.rows ,t.cols ,t.nums );
    printf("------------------------------------\n");
    for(i=0;i<t.nums ;i++)
        printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);
    return 1;
}
//矩阵转置算法
void TsanTat(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++;
                }
            }
        }
    }
}
//两矩阵相加运算算法
int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)
{
    int i=0,j=0,k=0;
    char e;
    if(a.rows !=b.rows ||a.cols!=b.cols)
    {
        printf("这两矩阵不能相加:\n");
        return 0;
    }
    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[j].r;
                 c.data[k].c=b.data[j].c;
                 c.data[k].d=b.data[j].d;
                 k++;
                 j++;
            }
            else 
            {
                  e=a.data[i].d+b.data[j].d;
                  if(e!=0)
                  {
                       c.data[k].r=a.data[i].r;
                       c.data[k].c=a.data[i].c;
                       c.data[k].d=e;
                       k++;
                  }
                  i++;j++;
            }
        }
        else if(a.data[k].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[j].r;
             c.data[k].c=b.data[j].c;
                c.data[k].d=b.data[j].d;
                k++;j++;
        }
        c.nums =k;
    }
    return 1;
}
int main(  )  //主函数
{
    TSMatrix t,tb,tp;
    int e;
    int Array[M][N]={0,0,1,0,0,0,
                   0,2,0,0,0,0,
                   3,0,0,0,0,0,
                   0,0,0,5,0,0,
                   0,0,0,0,6,0,
                   0,0,0,0,0,7};
    CreatMat(t,Array);
    printf("该稀疏矩阵为:\n");      DispMat(t);
    Assign(t,e,0,2);//查找元素
    TsanTat(t,tb);
    printf("转置后的矩阵为:\n");      DispMat(tb);
    MatAdd(t,tb,tp);
    printf("两矩阵相加后所得矩阵为:\n");  DispMat(tp);
    return 0;
}

 

三元组