数组和广义表的基本运算实现(三元组)

来源:互联网 发布:广西农产品出口数据 编辑:程序博客网 时间:2024/06/10 19:41

问题及代码:

a:   b: 

/** Copyright (c) 2016, 烟台大学计算机与控制工程学院* All rights reserved.* 文件名称:6-4.cpp* 作    者:单昕昕* 完成日期:2016年5月30日* 版 本 号:v1.0* 问题描述:假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:         (1)生成如下两个稀疏矩阵的三元组a和b;         (2)输出a转置矩阵的三元组;         (3)输出a+b的三元组;         (4)输出a b的三元组。* 程序输入:无* 程序输出:如题。*/#include<cstdio>#include<cstring>#include<cmath>#include<set>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define M 4//行数#define N 4//列数#define MaxSize 1010//稀疏矩阵中非零元素最多个数typedef struct{    int r;//行号    int c;//列号    int d;//元素值} TupNode;//三元组定义typedef struct{    int rows;//行数    int cols;//列数    int nums;//非零元素个数    TupNode data[MaxSize];} TSMatrix;//三元组顺序表定义//以行序方式扫描稀疏矩阵A,将其非零元素插入到三元组t中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])//只储存非零元素            {                t.data[t.nums].r=i;                t.data[t.nums].c=j;                t.data[t.nums].d=A[i][j];                ++t.nums;            }}//输出三元组void DisMat(TSMatrix t){    if(t.nums<=0) return;    cout<<'\t'<<t.rows<<'\t'<<t.cols<<'\t'<<t.nums<<endl;    cout<<'\t'<<"-------------------"<<endl;    for(int i=0; i<t.nums; ++i)        cout<<'\t'<<t.data[i].r<<'\t'<<t.data[i].c<<'\t'<<t.data[i].d<<endl;}//矩阵转置void TranTat(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;                }}//两个稀疏矩阵相加bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){    int i=0,j=0,k=0;    int v;    if(a.rows!=b.rows||a.cols!=b.cols) return false;    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[i].r;                c.data[k].c=b.data[i].c;                c.data[k].d=b.data[i].d;                ++k,++j;            }            else            {                v=a.data[i].d+b.data[j].d;                if(v)                {                    c.data[k].r=a.data[i].r;                    c.data[k].c=a.data[i].c;                    c.data[k].d=v;                    ++k;                }                ++i,++j;            }        }        else if(a.data[i].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[i].r;            c.data[k].c=b.data[i].c;            c.data[k].d=b.data[i].d;            ++k,++j;        }        c.nums=k;    }    return true;}//两个稀疏矩阵相乘void MatMul(int a[M][N],int b[M][N],int z[M][N]){    memset(z,0,sizeof(z));    int i,j,k;    for (k=0; k<N; k++)        for(i=0; i<N; i++)            for (j=0; j<N; j++)                z[i][k]+=a[i][j]*b[j][k];}TSMatrix a,b,c;int z[M][N];int main(){    int x[M][N]= {1,0,3,0,                  0,1,0,0,                  0,0,1,0,                  0,0,1,1                 };    int y[M][N]= {3,0,0,0,                  0,4,0,0,                  0,0,1,0,                  0,0,0,2                 };    CreatMat(a,x);    cout<<"a的三元组:"<<endl;    DisMat(a);    CreatMat(b,y);    cout<<"b的三元组:"<<endl;    DisMat(b);    cout<<"a转置为c"<<endl;    TranTat(a,c);    cout<<"c的三元组:"<<endl;    DisMat(c);    cout<<"c=a+b"<<endl;    cout<<"c的三元组:"<<endl;    if(MatAdd(a,b,c))  DisMat(c);    cout<<"c=a×b"<<endl;    cout<<"c的三元组:"<<endl;    MatMul(x,y,z);    /*for(int i=0; i<4; ++i)    {        for(int j=0; j<4; ++j)            cout<<z[i][j]<<" ";        cout<<endl;    }*/    CreatMat(c,z);    DisMat(c);    return 0;}/*1 0 3 00 1 0 00 0 1 00 0 1 13 0 0 00 4 0 00 0 1 00 0 0 2*/


运行结果:

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩吃东西吐了怎么办 儿童吃饭容易吐怎么办 宝宝吃饭会吐怎么办 小孩咳嗽还呕吐怎么办 咳嗽严重到呕吐怎么办 幼儿园中班不会写字怎么办 胃难受吐了怎么办 小孩不肯学写字怎么办 孩子不爱穿内裤怎么办 孩子长期不吃肉怎么办 小孩子不吃肉怎么办呢? 一年级小孩写字慢怎么办 听障碍放弃了怎么办 宝宝开始写字该怎么办 恢复的文档乱码怎么办 小孩做作业磨蹭怎么办 宝宝用左手写字怎么办 小孩动作太慢怎么办 幼儿园不去上学怎么办 嫌弃婆婆带孩子怎么办 孩子写字特别慢怎么办 幼儿园孩子不愿写字怎么办 孩子不愿用力写字怎么办 老公得了懒癌怎么办 太懒不想上班怎么办 写字太多手臂痛怎么办 小孩读书务工证怎么办 一年级孩子撕书怎么办 孩子上幼儿园不适应怎么办 一年级没办学籍怎么办 宝宝不爱做作业怎么办 儿子不爱做作业怎么办 我不想去上学怎么办 孩子写字爱玩怎么办 孩子不爱学习写字怎么办 孩子不爱学习成绩差怎么办 小孩默生字很差怎么办 孩子默写不出来怎么办 孩子不好好写字怎么办 大孩子书写差怎么办 孩子不愿意去学校怎么办