数据结构--矩阵

系列文章目录

第七话  数据结构之特殊矩阵

文章目录

  • 一、了解什么是数组
  • 二、数组的基本特征
  • 三、上下三角矩阵
    • 1.上三角矩阵
    • 2.下三角矩阵
    • 3.实现运用
  • 四、稀疏矩阵
  • 五、总结

前言

数组和广义表,可看成是线性表的扩展。即线性表中的数据元素既可以是单个元素,也可以是一个线性结构。数组中的每个数据元素可用类型相同的数组来表示;广义表则比较灵活,每个数据元素可以是不在分的原子类型,也可以是子表。数组和广义表都是常用的数据结构,在相关领域有着广泛的应用。

一、了解什么是数组?

数组是一种很多高级语言都支持的、应用广泛的数据类型,可以看作线性表的推广。数组作为一种数据类型。从逻辑结构上看,数组可以看成是一般线性表的特殊形式;二维数组可以看成是线性表的线性表。

二、数组的基本特征

1.不变性

    数组具有固定格式和数量,每个数据元素用唯一的一组下标来标识。因此,在数组上不能做插入、删除元素的操作。

2、顺序存储

    由于数组具有一经生成即长度固定、连续存放的特性,所以一般都采用顺序存储结构来存储。

三、数组的上下三角矩阵

1、上三角矩阵 

        

#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
    int a[N*(N+1)/2+1] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,50};
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            if(i>j){
                printf("%3d",a[N*(N+1)/2]);
            }else{
                printf("%3d",a[i*(2*N-i+1)/2+j-i]);
            }
        }
        printf("\n");
    }
    return 0;
}

 在主函数实现如下:

 

 2、下三角矩阵

#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
    int a[N*(N+1)/2+1] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,50};
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            if(i>=j){
                printf("%3d",a[i*(i+1)/2+j]);
            }else{
                printf("%3d",a[N*(N+1)/2]);
            }
        }
        printf("\n");
    }
    return 0;
}

在主函数中实现如下: 

 

四、稀疏矩阵

1、根据如下图来创造一个稀疏矩阵 

图的意思为:

总共有6个非零元素

在第2行第1列有一个元素6,

在第2行第9列有一个元素2

在第3行第6列有一个元素8

以此类推...

 形成如下图的稀疏矩阵

 

#include <stdio.h>
#include <stdlib.h>
#define maxsize 15
typedef struct{
    int i;
    int j;
    int v;
}node;
typedef struct{
    node date[maxsize];
    int row;
    int col;
    int count;
}Matrix;
int main(void)
{
    Matrix a;
    a.date[0].i = 1;
    a.date[0].j = 0;
    a.date[0].v = 6;
    a.date[1].i = 1;
    a.date[1].j = 8;
    a.date[1].v = 2;
    a.date[2].i = 2;
    a.date[2].j = 5;
    a.date[2].v = 8;
    a.date[3].i = 4;
    a.date[3].j = 2;
    a.date[3].v = 3;
    a.date[4].i = 4;
    a.date[4].j = 3;
    a.date[4].v = 5;
    a.date[5].i = 6;
    a.date[5].j = 7;
    a.date[5].v = 9;
    a.row = 9;
    a.col = 9;
    a.count = 6;
    int k,n,m;
    int flag;
    for(k=0;k<a.row;k++){
        for(n=0;n<a.col;n++){
            flag = 0;
            for(m=0;m<a.count;m++){
                if(k==a.date[m].i&&n==a.date[m].j){
                    printf("%3d",a.date[m].v);
                    flag=1;
                    break;
                }
            }
        if(flag==0){
            printf("%3d",0);
        }
        }
        printf("\n");
    }
    return 0;
}

在主函数中实现如下: 

 


五、总结

1、特殊矩阵的压缩存储

针对三角矩阵,主要掌握进行压缩存储时的下标变换公式

2、稀疏矩阵的压缩存储

稀疏矩阵的压缩存储,一般用三元组的顺序存储,少数用十字链表存储

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值