关闭

稀疏矩阵构成的广义表

标签: 应用控件
559人阅读 评论(0) 收藏 举报
分类:

   题目要求:

假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:
 (1)生成如下两个稀疏矩阵的三元组a和b;
 (2)输出a转置矩阵的三元组;
 (3)输出a+b的三元组;
 (4)输出a b的三元组。


输入代码:

#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
#define M 4//稀疏矩阵行数
#define N 4//稀疏矩阵列数
#define MaxSize 100//稀疏矩阵中非零元素最多的个数
int z[M][N];
typedef int ElemType;
typedef struct
{
    int r;//行号
    int c;//列号
    ElemType d;//元素值
} TupNode;
typedef struct
{
    int rows;//行数
    int cols;//列数
    int nums;//非零元素个数
    TupNode data[MaxSize];
} TSMatrix; //三元组顺序表定义
/*
对一个二维稀疏矩阵创建其三元组表示
*/
void CreatMat(TSMatrix &t,ElemType 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)//只存贮非零元素
            {
                t.data[t.nums].r=i;
                t.data[t.nums].c=j;
                t.data[t.nums].d=A[i][j];
                t.nums++;
            }
    }
}
/*
输出三元组
*/
void DispMat(TSMatrix t)
{
    int i;
    if(t.nums<=0)//没有非零元素时返回
    {
        return ;
    }
    printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);
    printf("\t----------------------\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);
    }
}
/*
三元组元素赋值
*/
bool Value(TSMatrix &t,ElemType x,int i,int j)
{
    int k=0,k1;
    if(i>=t.rows||j>=t.rows)
        return false;
    while(k<t.nums&&t.data[k].r<i)//查找行
        k++;
    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)//查找列
        k++;
    if(t.data[k].r==i&&t.data[k].c==j)//存在这样的元素
        t.data[k].d=x;
    else
    {
        for(k1=t.nums-1; k1>=k; k1--)
        {
            t.data[k1+1].r=t.data[k1].r;
            t.data[k1+1].c=t.data[k1].c;
            t.data[k1+1].d=t.data[k1].d;
        }
        t.data[k].r=i;
        t.data[k].c=j;
        t.data[k].d=x;
        t.nums++;
    }
    return true;
}
/*
矩阵转置
*/
void 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++)
            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;
    ElemType v;
    if(a.rows!=b.rows||a.cols!=b.cols)
        return false;
    c.rows=a.rows;
    c.cols=a.cols;//c的行列数与a的相同
    while(i<a.nums&&j<b.nums)//处理a和b的每一个元素
    {
        if(a.data[i].r==b.data[j].r)//行号相同
        {
            if(a.data[i].c<b.data[j].c)//a元素的列号小宇b元素的列号
            {
                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)//a元素的列号大于b元素的列号
            {
                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//a元素的列号等于b元素的列号
            {
                v=a.data[i].d+b.data[j].d;
                if(v!=0)
                {
                    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)//a元素的行号小于b元素的行号
        {
            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 true;
}
/*
两个稀疏矩阵相乘的运算
*/
void MatMul(int a[M][N],int b[M][N],int z[M][N])
{
    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];
}
int main()
{
    int  A1[M][N]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
    int  B1[M][N]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
    TSMatrix a,b,c;
    CreatMat(a,A1);
    CreatMat(b,B1);
    cout<<"a的三元组: "<<endl;
    DispMat(a);
    cout<<"b的三元组: "<<endl;
    DispMat(b);
    cout<<"a转置为c:"<<endl;
    TranTat(a,c);
    cout<<"c的三元组: "<<endl;
    DispMat(c);
    cout<<"c=a+b: "<<endl;
    MatAdd(a,b,c);
    cout<<"c的三元组: "<<endl;
    DispMat(c);
    cout<<"c=a*b: "<<endl;
    MatMul(A1,B1,z);
    CreatMat(c,z);a
    cout<<"c的三元组: "<<endl;
    DispMat(c);
    return 0;
}





运行截图:



0
0
查看评论

数据结构例程——稀疏矩阵的十字链表表示

本文针对数据结构基础系列网络课程(5):数组与广义表中第4课时稀疏矩阵的十字链表表示。下面的程序中,实现了创建并显示十字链表的算法。#include <stdio.h> #include <malloc.h> #define M 3 /...
  • sxhelijian
  • sxhelijian
  • 2015-10-07 21:16
  • 4571

经典算法题15-稀疏矩阵及三元组

一. 引入我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用。当然矩阵有着不足的地方就是空间和时间复杂度都维持在N²上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory。。。那么面临的一个问题就是如何来压...
  • shibing624
  • shibing624
  • 2016-12-07 16:45
  • 589

广义表的建立与一般操作C\C++

广义表的建立与一般操作C\C++ 一、广义表的概念         广义表是线性表的推广,但线性表的元素仅限于原子项,原子作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,允许它们具有自身独立类型结构,就产生了广义表的概念。 ...
  • g15827636417
  • g15827636417
  • 2016-10-20 20:41
  • 1823

广义表的基本操作实现

广义表的四个特征:(1)广义线性表;(2)元素复合性;(3)元素递归性;(4)元素共享性     广义表的上述四个特征对于他的使用价值和应用效果起到了很大的作用。广义表的结构相当灵活,它可以兼容线性表、数组、树和有向图等各种常用的数据结构。当二维数组的每行或每列作为子表处理时,...
  • qq_28598203
  • qq_28598203
  • 2016-04-21 19:19
  • 4012

广义表存储

节点形态: 存储结构: 每个节点都包含一个标志域,如果为0(即原子),那么仅含一个值域,如果是1(列表),那么说明该节点包含两个指针域。 需要注意的是求广义表长度的操作,其实计算的是根节点及其兄弟的个数,比如图2中广义表的长度为2,图3中广义表的长度为4。 ...
  • RowandJJ
  • RowandJJ
  • 2014-05-14 23:46
  • 2188

广义表的读取和输出,树的拷贝及比较的实现

1. 树采用链表的形式保存,每一个节点设计成一个数据域和n个指针域, n为树的度,为了方便固定为树的最大度,但是有点浪费空间。 2. 实现的函数使用到栈来处理,遍历树时采用递归的方法。 //tree.h #include #define DEGREE 3 typedef struct No...
  • haoyuedangkong_fei
  • haoyuedangkong_fei
  • 2016-05-23 18:29
  • 823

建立树的两种方法以及用广义表显示树

一种是先序建树,一种是层序建树(自己瞎起的名字,呵呵) 1.先序建树(string用来以广义表形式显示树) void CreateBTREE(BTREE & BT ,string & lists) { cout <<"\n请输入节点信息(‘#’表...
  • x5942110
  • x5942110
  • 2012-12-12 02:10
  • 1179

广义表的存储结构(广义表的递归算法,复制广义表,求广义表的深度)

// c5-5.h 广义表的头尾链表存储结构(见图5.16) enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表 typedef struct GLNode { ElemTag tag; // 公共部分,用于区分原子结点和表结点 union // ...
  • KongkOngL
  • KongkOngL
  • 2014-08-21 21:51
  • 1999

数据结构_数组与广义表_广义表的建立、遍历、复制、求深度

由一个存储着广义表信息的字符串建立一个广义表,并对其进行复制,求深度。 递归真是奇妙无穷啊,有些看似很复杂的东西只要找到规律就能进行递归求解。让我不得不对那些发现规律利用规律创造新事物的人肃然起敬。其实在众多美丽的事物中,人的思想也是很美丽的,那些数学家,哲学家能在意识的世界创造出瑰丽的奇观,...
  • Jack_Wong2010
  • Jack_Wong2010
  • 2011-10-27 12:45
  • 7895

广义表操作 (Java实现)——广义表深度、广义表长度、打印广义表信息

广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同。而广义表是允许线性表容纳自身结构的数据结构。 广义表定义:       广义表是由n个元素组成的序列:LS = (a1,a2, ... an);其中 ai是一个...
  • sun_star1chen
  • sun_star1chen
  • 2014-01-06 09:03
  • 2134
    个人资料
    • 访问:420491次
    • 积分:11677
    • 等级:
    • 排名:第1554名
    • 原创:772篇
    • 转载:6篇
    • 译文:0篇
    • 评论:90条
    最新评论