堆栈队列和数组-行逻辑链接稀疏矩阵

#include<iostream>
#include <iomanip>
#include"windows.h"
using namespace std;
struct Tripple
{
    int x,y,value;
};
struct RLSMatrix
{
    int r,c,cnt;
    Tripple* tripples;
    int* rpos;
};

RLSMatrix* createRLSMatrix(int r,int c,int maxCnt)
{
    RLSMatrix* p = (RLSMatrix*)malloc(sizeof(RLSMatrix));
    p->r=r;
    p->c=c;
    p->cnt=0;
    p->tripples=new Tripple[maxCnt];
    p->rpos=new int[p->r+1];
    p->rpos[0]=0;
    return p;
}
RLSMatrix* transpose(RLSMatrix*  src)
{
    RLSMatrix* ans =createRLSMatrix(src->c,src->r,src->cnt);
    int* ccnts = new int[src->c+1];
    int* cpos = new int[src->c+1];
    cpos[0]=0;
    for(int i=0;i<=src->c;i++)
        ccnts[i]=0;
    for(int i=0;i<src->cnt;i++)
        ccnts[src->tripples[i].y]++;
    for(int i=1;i<=src->c;i++)
    {
        ans->rpos[i]=ans->rpos[i-1]+ccnts[i-1];
        cpos[i] = ans->rpos[i];
    }

    delete[] ccnts;
    Tripple newTripple;
    for(int i=0;i<src->cnt;i++)
    {
        newTripple.x=src->tripples[i].y;
        newTripple.y=src->tripples[i].x;
        newTripple.value=src->tripples[i].value;
        ans->tripples[cpos[newTripple.x]++]=newTripple;
        ans->cnt++;
    }
    return ans;
}
void output(RLSMatrix* src)
{
    int cur=0;
    for(int i=1;i<=src->r;i++)
    {
        for(int j=1;j<=src->c;j++)
        {
            if(src->tripples[cur].x==i && src->tripples[cur].y==j)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//彰显非0元
                cout<<src->tripples[cur].value<<"   ";
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);//设置三色相加
                cur++;
            }
            else cout<<"0   ";
        }
        cout<<endl;
    }
}
void main()
{
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);//设置三色相加
     int r=11,c=18,maxCnt=45;
     RLSMatrix* m= createRLSMatrix(r,c,maxCnt);
     int lstR=0;
     for(int i=1;i<=r;i++)
     {
         for(int j=1;j<=c;j++)
         {
             if(rand()%10==1 && m->cnt<maxCnt)
             {
                 m->tripples[m->cnt].x=i;
                 m->tripples[m->cnt].y=j;
                 m->tripples[m->cnt].value=rand()%10;
                 if(i!=lstR)
                      m->rpos[i]=m->cnt;
                 m->cnt++;
             }
         }
         lstR=i;
     }
     output(m);
     cout<<endl;
     output(transpose(m));
     cin>>r;
}
时间: 2024-10-10 21:32:31

堆栈队列和数组-行逻辑链接稀疏矩阵的相关文章

数据结构 - 稀疏矩阵的封装(三元组,行逻辑链接)

稀疏矩阵(三元组,行逻辑连接) 本次代码将关于基本三元组和行逻辑链接表示的三元组进行了封装,还附加了两个系数矩阵的乘法和加法,欢迎大家参考测试代码. #pragma once #include <iostream> #include <queue> #include <vector> #define MAXSIZE 100 using namespace std; typedef struct node { int val; int row; int col; node

(数据结构第五章)行逻辑链接的顺序表

/*******************行逻辑链接的顺序表*****************/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXSIZE 12500 /// 假设非零元个数最大值为12500 #define MAXRC 12500 ///假设的每行的个数的最大值12500 #define ERROR -1 typedef stru

行逻辑链接的矩阵乘法

Description 对于一个稀疏矩阵,当需要频繁的随机存取任意一行的非零元时,则需要知道每一行的第一个非零元在三元组表中的位置.为此,可以将算法5.2中用来指示“行”信息的辅助数组cpot固定在稀疏矩阵的存储结构中.这种“带行链接信息”的三元组表即为行逻辑链接的顺序表.其类型描述如下: 针对存储于行逻辑链接顺序表的稀疏矩阵,其矩阵相乘的算法与经典算法有所不同.因此,对于两个稀疏矩阵相乘(Q=M×N)的过程可以大致描述如下: 请使用行逻辑链接的顺序表实现两个稀疏矩阵的乘法. Input 输入的

稀疏矩阵的三元组行逻辑链接的顺序表存储结构表示及实现

#define MAX_SIZE 100 #define MAX_RC 20 struct Triple { int i, j;//行下标,列下标 ElemType e;//非零元素值 }; struct RLSMatrix { Triple data[MAX_SIZE + 1];//非零元三元组表,data[0]未用 int rpos[MAX_RC + 1];//各行第1个非零元素的位置表 int mu, nu, tu;//矩阵的行数,列数,非零元个数 }; int comp(int c1,

堆栈队列和数组-三元组稀疏矩阵

#include<iostream> #include <iomanip> #include"windows.h" using namespace std; struct Tripple { int x,y,value; }; struct TrippleMatrix { int r,c,cnt; Tripple* tripples; }; TrippleMatrix* createTrippleMatrix(int r,int c,int maxCnt) {

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

算法导论10:栈链表的简化、队列的数组实现 2016.1.10

新年的前十天做了比较有意义的事情就是坚持每天写博客,明天就开始期末考试了,所以等假期再继续学习. 把昨天提到的S.bottom简化之后又改了栈的链表.代码如下(已折叠): #include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(no

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括