数据结构上机:数组和三元组表示及建立在其上的相关运算

来源:互联网 发布:软件服务保密合同范本 编辑:程序博客网 时间:2024/04/29 17:27
问题描述:数组和三元组表示及建立在其上的相关运算
作者:何知令

完成时间:2017年6月15日

算法设计:

三元组相加:先将三元组a存入c中,再遍历三元组b,若b中元素的行列值与a中某一元素行列值相同,将其元素值加到相应位置的c.data[k]中,否则新建一个数据域,把b的元素存在其中,这样就实现了相同行列数的三元组的相加;

三元组相乘:仔细分析矩阵相乘的方式发现:能相乘的数据的行列值满足:横行元素的列等于竖行元素的行,将其作为判断条件,用双层循环比较每一组三元组a和b中的元素是否满足条件,若满足,相应位置的结果三元组c的元素值为其对应元素的乘积,否则相乘结果为0,不需考虑;

矩阵转置:只需将其行列值互换就行

说明:这只是行列值相同的情况,不是广泛情况,广泛情况需要对每一种做出考虑

代码:

/*问题描述:数组和三元组表示及建立在其上的相关运算作者:何知令完成时间:2017年6月15日*/#include <stdio.h>#include <stdlib.h>#define MaxSize 16typedef struct{    int r;    int c;    int d;//元素值} TupNode;typedef struct{    int rows;    int cols;    int nums;//非零元素个数    TupNode data[MaxSize];} TSMatrix; //三元组顺序表定义TSMatrix CreatMat(TSMatrix t,int A[4][4]){    int i,j;    t.rows=4;    t.cols=4;    t.nums=0;    for(i=0; i<4; i++)    {        for(j=0; j<4; j++)        {            if(A[i][j]!=0)            {                t.data[t.nums].r=i;                t.data[t.nums].c=j;                t.data[t.nums].d=A[i][j];                t.nums++;            }        }    }    return t;}void DispMat(TSMatrix t){    int i;    if(t.nums<=0)        return;    printf("%d\t%d\t%d\n",t.rows,t.cols,t.nums);    printf("------------------\n");    for(i=0; i<t.nums; i++)        printf("%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);    printf("\n");}TSMatrix TranTat(TSMatrix t,TSMatrix tb){    int p,q=0,v;//q为tb.data的下标    tb.rows=t.cols;    tb.cols=t.rows;    tb.nums=t.nums;    if(t.nums!=0)//当存在非零元素事执行转置    {        for(v=0; v<t.cols; v++)//tb.data[q]中的记录以c域的次序排列            for(p=0; p<t.nums; p++)//p为t.data的下标                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++;                }    }    return tb;}TSMatrix MatAdd(TSMatrix a,TSMatrix b,TSMatrix c){    int i=0,j=0,k=0;    c.rows=a.rows;    c.cols=a.cols;    for(i=0; i<a.nums; i++)    {        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++;    }    for(i=0; i<b.nums; i++)    {        for(j=0; j<a.nums; j++)        {            if(a.data[j].r==b.data[i].r&&a.data[j].c==b.data[i].c)//如果这两个数据在同行同列加起来            {                c.data[j].d+=b.data[i].d;            }            else            {                c.data[k].r=b.data[i].r;                c.data[k].c=b.data[i].c;                c.data[k].d=b.data[i].d;                k++;            }        }    }    return c;//成功返回1}TSMatrix MatMul(TSMatrix a,TSMatrix b,TSMatrix c){    int i,j,k=0;    int v;    c.rows=a.rows;    c.cols=a.cols;    for(i=0; i<a.nums; i++)    {        for(j=0; j<b.nums; j++)        {            if(a.data[i].c==b.data[j].r)//如果两个数据行列数正好相反,则才两个数能相乘            {                v=a.data[i].d*b.data[j].d;                c.data[k].r=a.data[i].r;                c.data[k].c=b.data[j].c;                c.data[k].d=v;                k++;            }        }    }    return c;}int main(){    int A[4][4]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};    int B[4][4]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};    TSMatrix a;    TSMatrix b;    TSMatrix tb;    a=CreatMat(a,A);    b=CreatMat(b,B);    DispMat(a);    DispMat(b);    printf("a转置为c\n");    tb=TranTat(a,tb);    DispMat(tb);    printf("c=a+b:\n");    printf("c的三元组为:\n");    tb=MatAdd(a,b,tb);    DispMat(tb);    printf("c=a*b:\n");    tb=MatMul(a,b,tb);    DispMat(tb);    return 0;}
程序运行结果展示:

知识点总结:三元组存储

学习心得:结构体函数传址的问题似乎不是第一次遇到了



阅读全文
0 0