三元组

#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;
}
时间: 2024-09-29 15:50:15

三元组的相关文章

稀疏矩阵的三元组顺序表的C语言实现

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

三元组的使用

#include<stdio.h>#include<stdlib.h>int InitTriplet(int **T,int v1,int v2,int v3){    *T=(int*)malloc(3*sizeof(int));    if(!*T)    {        printf("分配空间失败!\n");        exit(-1);    }    (*T)[0]=v1,(*T)[1]=v2,(*T)[2]=v3;    return 1;}

[DataStructure]稀疏矩阵的三元组存储及乘法运算

P.S.我去..我大作业不会打成系数矩阵了吧!!!!!!!!!!! 一.题目描述: 对于一个Rows X Columns稀疏矩阵,使用三元组的方法进行存储. 并在此基础上计算矩阵的乘法 二.解题报告 1.建立结构_Matrix 1 MAXVALUE为预估零元峰值个数, 2 struct _Matrix 3 { 4 int Sum;//实际输入总非零点数 5 int Rows,Columns;//矩阵行数,列数 6 double Data[MAXVALUE+1];//数据域,第i个数据的值 7 i

Project Euler 87 :Prime power triples 素数幂三元组

Prime power triples The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way: 28 = 22 + 23 + 2433 = 32 + 23 + 2449

数据结构之自建算法库——稀疏矩阵的三元组表示

本文针对数据结构基础系列网络课程(5):数组与广义表中第3课时稀疏矩阵的三元组表示. 稀疏矩阵的三元组表示相关的算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:tup.h,包含定义稀疏矩阵的三元组表示数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef TUP_H_INCLUDED #define TUP_H_INCLUDED #define M 6 #define N 7 #define MaxSize 100 //矩阵中非零元素最多个数 typedef int Ele

FZU1669 Right-angled Triangle【毕达哥拉斯三元组】

题目链接: http://acm.fzu.edu.cn/problem.php?pid=1669 题目大意: 求满足以a.b为直角边,c为斜边,并且满足a + b + c <= L的直角三角形的个数. 思路: 勾股定理,a.b.c也就是本原毕达哥拉斯三元组,则满足: x = m^2 - n^2 y = 2*m*n z = m^2 + n^2 其中m > n,且若m为奇数,则n为偶数,若m为偶数,则n为奇数. 枚举m.n,然后将三元组乘以i倍,保证 i * (x + y + z)在所给范围内(2

UvaLive 6667 Longest Chain (分治求三元组LIS&amp;树状数组)

题目链接: here 题意: 和hdu4742类似.区别就是一部分三元组是直接给出的.还有一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by,az>bz. 思路: 思路也和hdu4742here类似.只是有几个比较棘手的问题.现在变成严格大于了.对于y还是很好办的.我们在排序y的时候可以使的标号大的排在前面这样就可以防止y和它一样的更新它了.感觉比较麻烦的是x一样怎么办.这个真没想出什么好办法.就只有x和mid+1的x不一样的建一个树状数

【数据结构与算法】一、三元组的代码实现

开始复习数据结构和算法,好长时间没写c了,顺便复习一下 三元组的表示与实现 #include<iostream> #include <stdlib.h> using namespace std; //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //函数结果类型 typedef int Status; //数

数据结构_三元组

下面是我实现的三元组: typedef int NEW_TYPE; typedef struct  { NEW_TYPE num1; NEW_TYPE num2; NEW_TYPE num3; }triple; bool InitTriple(triple *p,NEW_TYPE num1,NEW_TYPE num2,NEW_TYPE num3); bool DestroyTriple(triple *p); bool Get(triple *p,int pos,NEW_TYPE *buff);