关闭

数据结构学习-数组和广义表

标签: 数据结构
1080人阅读 评论(0) 收藏 举报
分类:

问题描述:

假设n*n的稀疏矩阵A采用三元组表示,设计一个程序实现如下功能:
1.生成如下2个稀疏矩阵的三元组a和b;

⎡ ⎣ ⎢ ⎢ ⎢ 1000 0100 3011 0001 ⎤ ⎦ ⎥ ⎥ ⎥ ⎡ ⎣ ⎢ ⎢ ⎢ 3000 0400 0010 0002 ⎤ ⎦ ⎥ ⎥ ⎥  

2.输出a转置矩阵的三元组;
3.输出a+b的三元组;
4.输出a*b的三元组。


代码:

#include <iostream>

using namespace std;
const int M=4;
const int N=4;
const int MaxSize=16;
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)
            {
                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;
    cout<<"\t"<<t.rows<<"\t"<<t.cols<<"\t"<<t.nums<<endl;;
    cout<<"\t----------------\n";
    for(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 i,j,v=0;
    tb.rows=t.cols;
    tb.cols=t.rows;
    tb.nums=t.nums;
    if(t.nums!=0)
    {
        for(i=0; i<t.cols; i++)
            for(j=0; j<t.nums; j++)
                if(t.data[j].c==i)
                {
                    tb.data[v].c=t.data[j].r;
                    tb.data[v].r=t.data[j].c;
                    tb.data[v].d=t.data[j].d;
                    v++;
                }
    }
}
void Add(TSMatrix a,TSMatrix b,TSMatrix &c)
{
    int i=0,j=0,k=0,v;
    if(a.cols!=b.cols||a.rows!=b.rows)
        return;
    c.cols=a.cols;
    c.rows=a.rows;
    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)
            {
                v=a.data[i].d+b.data[j].d;
                if(v!=0)
                {
                    c.data[k].c=a.data[i].c;
                    c.data[k].r=a.data[i].r;
                    c.data[k].d=v;
                    k++;
                }
                i++;
                j++;
            }
            else if(a.data[i].c<b.data[j].c)
            {
                c.data[k].c=a.data[i].c;
                c.data[k].r=a.data[i].r;
                c.data[k].d=a.data[i].d;
                k++;
                i++;
            }
            else
            {
                c.data[k].c=b.data[j].c;
                c.data[k].r=b.data[j].r;
                c.data[k].d=b.data[j].d;
                k++;
                j++;
            }
        }
        else if(a.data[i].r<b.data[j].r)
        {
            c.data[k].c=a.data[i].c;
            c.data[k].r=a.data[i].r;
            c.data[k].d=a.data[i].d;
            k++;
            i++;
        }
        else
        {
            c.data[k].c=b.data[j].c;
            c.data[k].r=b.data[j].r;
            c.data[k].d=b.data[j].d;
            k++;
            j++;
        }

    }
    c.nums=k;

}
int GetValue(TSMatrix t,int i,int j)
{
    int k=0;
    while(k<t.nums&&(t.data[k].r!=i||t.data[k].c!=j))
        k++;
    if(k<t.nums)
        return t.data[k].d;
    else
        return 0;
}
void Mul(TSMatrix a,TSMatrix b,TSMatrix &c)
{
    if(a.rows!=b.cols)
        return;
    int i,j,k,p=0;
    int s;
    for(i=0; i<a.rows; i++)
        for(j=0; j<b.cols; j++)
        {
            s=0;
            for(k=0; k<a.cols; k++)
                s+=GetValue(a,i,k)*GetValue(b,k,j);
            if(s!=0)
            {
                c.data[p].r=i;
                c.data[p].c=j;
                c.data[p].d=s;
                p++;
            }
        }
    c.rows=a.rows;
    c.cols=b.cols;
    c.nums=p;
}
int main()
{
    int a[M][N]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
    int b[M][N]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
    TSMatrix A,B;
    CreatMat(A,a);
    CreatMat(B,b);
    cout<<"三元组A:\n";
    DispMat(A);
    cout<<"三元组B:\n";
    DispMat(B);
    TSMatrix C;
    TranTat(A,C);
    cout<<"A转置矩阵的三元组:"<<endl;
    DispMat(C);
    Add(A,B,C);
    cout<<"A+B的三元组:"<<endl;
    DispMat(C);
    Mul(A,B,C);
    cout<<"A*B的三元组:"<<endl;
    DispMat(C);
    return 0;
}

运行结果:

这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

数据结构 - 数组、矩阵、广义表存储

数组的定义 数组的定义 数组是下标index 和值value 组成的序对的集合。 在数组中,每个有定义的下标都与一个值对应,这个值称做数组元素。 每个序对形如: (index,value) 数组...
  • wangzi11322
  • wangzi11322
  • 2015-04-29 10:14
  • 3166

数据结构(五) 数组和广义表

恩,最近几天,为了应付六级,每天在专心看《Game of throne》,沉迷无法自拔,所以复习进度就慢了下了。【啊啊啊,决定痛改前非,专心复习!】 数组和广义表这块知识实话讲不是很重要,但是考试是...
  • zhaiax672
  • zhaiax672
  • 2016-12-18 16:12
  • 670

数据结构习题之多维数组和广义表

第五章  多维数组和广义表 一、基本要求、重点、难点     本章目的是介绍多维数组的逻辑结构特征及其存储方式,特殊矩阵和稀疏矩阵的压缩存储方法。本章重点是熟悉多维数组的存储方式、矩阵的压缩存储方式...
  • erlian1992
  • erlian1992
  • 2015-07-01 15:45
  • 1820

数据结构学习笔记之广义表的相关知识点

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广,广泛的应用于人工智能等领域的表处理语言LISP语言中,因此,掌握对广义表的基础的CRUD操作很是重要
  • qq_24754061
  • qq_24754061
  • 2016-06-04 00:19
  • 1357

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

由一个存储着广义表信息的字符串建立一个广义表,并对其进行复制,求深度。 递归真是奇妙无穷啊,有些看似很复杂的东西只要找到规律就能进行递归求解。让我不得不对那些发现规律利用规律创造新事物的人肃然起...
  • Jack_Wong2010
  • Jack_Wong2010
  • 2011-10-27 12:45
  • 7866

Java数据结构和算法:字符串、数组和广义表

数组和广义表是与前述的线性表有所区别的数据结构。它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构字符串字符串的定义、存储结构字符串(string)是由n (n≥0) 个字符组...
  • axi295309066
  • axi295309066
  • 2017-01-04 17:48
  • 379

数组和广义表的基本运算实现

一、实验题目 假设nn的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能: (1)生成如下两个稀疏矩阵的三元组a和b;         (2)输出a转置矩阵的三元组; ...
  • liyingjie01
  • liyingjie01
  • 2016-05-30 13:04
  • 607

数据结构 - 数组、矩阵、广义表存储

数组的定义 数组的定义 数组是下标index 和值value 组成的序对的集合。 在数组中,每个有定义的下标都与一个值对应,这个值称做数组元素。 每个序对形如: (index,value) 数组...
  • wangzi11322
  • wangzi11322
  • 2015-04-29 10:14
  • 3166

基本数据结构(数组、串、广义表)

数组 多维数组的概念与存储 二维数组也可叫做矩阵,它可以看作是由n个行向量和m个列向量所组成的向量,a[n][m],总共n*m个数组元素。 对于二维数组a[n][m],为能根据它的数组元素的下标得出在...
  • Linoi
  • Linoi
  • 2013-12-26 17:16
  • 1419
    个人资料
    • 访问:59051次
    • 积分:2456
    • 等级:
    • 排名:第17369名
    • 原创:193篇
    • 转载:1篇
    • 译文:0篇
    • 评论:30条
    最新评论