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

原创 2016年05月30日 13:04:08

一、实验题目

假设nn的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:

(1)生成如下两个稀疏矩阵的三元组a和b;

       

(2)输出a转置矩阵的三元组;

(3)输出a+b的三元组;

(4)输出ab的三元组。

二、实验目的

掌握稀疏矩阵的存储结构以及基本运算实现算法。

三、实验要求

针对程序exp6-4.cpp,输出结果如下:

 

 

#include <iostream>
#include <stdio.h>
#define M 4
#define N 4
#define Maxsize 100
using namespace std;
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;
    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);
}
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=a.data[j].r;
                c.data[k].c=a.data[j].c;
                c.data[k].d=a.data[j].d;
                k++;j++;
            }
            else
            {
                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)
        {
            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;
}
int getvalue(TSMatrix c,int i,int j)
{
    int k=0;
    while (k<c.nums && (c.data[k].r!=i || c.data[k].c!=j))
		k++;
    if (k<c.nums)
		return(c.data[k].d);
    else
		return(0);
}
bool MatMul(TSMatrix a,TSMatrix b,TSMatrix &c)
{
    int i,j,k,p=0;
	int s;
	if (a.cols!=b.rows)
		return false;
	for (i=0;i<a.rows;i++)
		for (j=0;j<b.cols;j++)
		{
            s=0;
            for (k=0;k<a.cols;k++)
				s=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;
	return true;
}
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);
	printf("a的三元组:\n");
	DispMat(a);
	printf("b的三元组:\n");
	DispMat(b);
	printf("a转置为c\n");
	TranTat(a,c);
	printf("c的三元组:\n");
	DispMat(c);
	printf("c=a+b\n");
	MatAdd(a,b,c);
	printf("c的三元组:\n");
	DispMat(c);
	printf("c=a×b\n");
	MatMul(a,b,c);
	printf("c的三元组:\n");
	DispMat(c);
	return 0;
}


稀疏矩阵的三元组表示的实现及应用(1)——建立稀疏矩阵三元组表示的算法库

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 对称矩阵压缩存储的实现与应用.cpp *...
  • zzh_569754126
  • zzh_569754126
  • 2015年10月30日 08:28
  • 2933

!实现稀疏矩阵(采用三元组表示)的基本运算

/*exp5-4.cpp*/ #include #define N 4 typedef int ElemType; #define MaxSize 100/*矩阵非零元素最多个数*/ typ...
  • lilanfeng1991
  • lilanfeng1991
  • 2013年01月28日 09:23
  • 1370

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

广义表的建立与一般操作C\C++ 一、广义表的概念         广义表是线性表的推广,但线性表的元素仅限于原子项,原子作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限...
  • g15827636417
  • g15827636417
  • 2016年10月20日 20:41
  • 1743

第6次数据结构上机(数组和广义表的基本运算实现)

实验名称:数组和广义表的基本运算实现 指导教师:           王莹洁               专业班级:       计163-1         姓   名:      曹欣...
  • cxy201658503125
  • cxy201658503125
  • 2017年06月09日 17:16
  • 196

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

问题及代码: a:   b:  /* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:6-4.cpp * 作 ...
  • MIKASA3
  • MIKASA3
  • 2016年05月30日 16:33
  • 754

数据结构 - 数组和广义表的基本运算实现

实验题目:假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能: (1)生成如下两个稀疏矩阵的三元组a和b; (2)输出a转置矩阵的三元组; ...
  • mayuko2012
  • mayuko2012
  • 2016年06月10日 22:20
  • 417

2015年大二上-数据结构-数组与广义表(2)-4.下三角矩阵的压缩存储及基本运算

/* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2015年12月14日 *...
  • Annpion
  • Annpion
  • 2015年12月16日 18:43
  • 671

第八周(2) 数组和广义表 对称矩阵的压缩存储及基本运算

/* Copyright (c)2017,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第8周(2)项目2 - 对称矩阵的压缩存储及基本运算 作 者:孙仁圆 ...
  • renyuansun
  • renyuansun
  • 2017年11月08日 11:15
  • 103

2015年大二上-数据结构-数组与广义表(2)-3.上三角矩阵的压缩存储及基本运算

/* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2015年12月14日 *...
  • Annpion
  • Annpion
  • 2015年12月16日 18:39
  • 2258

实现广义表的各种基本运算算法

/*algo8-1.cpp*/ #include #include typedef char ElemType; typedef struct lnode {  int tag;/*结...
  • lilanfeng1991
  • lilanfeng1991
  • 2013年02月20日 14:44
  • 930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组和广义表的基本运算实现
举报原因:
原因补充:

(最多只允许输入30个字)