数据结构与算法-矩阵的压缩存储操作及应用C语言实现(超详细注释/设计/实验/作业)

一、引言

感谢宝子们一键三连支持,火速更新中~~
特殊矩阵,主要分为两类:①、对称矩阵:含有大量相同数据元素的矩阵。②、稀疏矩阵、上\下三角矩阵:含有大量 0 元素的矩阵。在数据结构中,压缩存储的思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。
在数据结构中稀疏矩阵的压缩存储有 3 种具体实现方式:①三元组顺序表,②行逻辑链接的顺序表,③十字链表。

二、目的

  1. 掌握矩阵压缩存储的存储结构
  2. 掌握矩阵压缩存储的基本操作
  3. 掌握矩阵压缩存储的基本特性

三、环境与设备

操作系统:Windows 10
编译器:Visual Studio 2021

四、存储结构

三元组存储结构

typedef int DataType;
typedef struct
{
	int i,j;
	DataType v;
}TriTupleElem;
typedef struct
{
	TriTupleElem data[MAX];
	int m,n,t;
}TriTupleTable;

五、函数

2.	void inputsymmatrix(int *data,int n)//输入矩阵
3.	void outputsymmatrix(int *data,int n)//输出对称矩阵
4.	void outputdsmatrix(int *data,int n)//输出三角矩阵
5.	void inputThreeMatrix(int *data,int n)//输入三对角矩阵
6.	void outputThreeMatrix(int *data,int n)//输出三对角矩阵
7.	void inputTriTable(TriTupleTable *TTT)//输入三元组矩阵
8.	void outputTriTable(TriTupleTable *TTT)//输出三元组矩阵
9.	void TransTriTable(TriTupleTable *TTT)//三元组矩阵的转置运算

六、核心代码

#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef int DataType;
typedef struct
{
	int i,j,k;
	DataType v;
}TriTupleElem;
typedef struct
{
	TriTupleElem data[MAX];
}TriTupleTable;
 
void menu();

void inputsymmatrix(int *data,int n);//输入矩阵
void outputsymmatrix(int *data,int n);//输出对称矩阵
void outputdsmatrix(int *data,int n);//输出三角矩阵
void inputThreeMatrix(int *data,int n);//输入三对角矩阵
void outputThreeMatrix(int *data,int n);//输出三对角矩阵
void inputTriTable(TriTupleTable *TTT);//输入三元组矩阵
void outputTriTable(TriTupleTable *TTT);//输出三元组矩阵
void TransTriTable(TriTupleTable *TTT);//三元组矩阵的转置运算
int main()
{
	menu();
}
void inputsymmatrix(int *data,int n)//输入矩阵
{
	int temp;
	printf("请输入对称矩阵的%d个数值:\n",n*(n+1)/2);
	for(int i=0;i<(n*(n+1)/2);i++)
	{
		printf("请输入第%d个数值:",i+1);
		scanf("%d",&temp); 
		data[i]=temp;
	}
}
void outputsymmatrix(int *data,int n)//输出对称矩阵
{
	int k;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i>=j)
			{
				k=i*(i+1)/2+j;	
			}
			else
			{
				k=j*(j+1)/2+i;
			}
			printf("%5d",data[k]);
		}
		printf("\n");
	}
}
void outputdsmatrix(int *data,int n)//输出三角矩阵
{
	int k;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i>=j)
			{
				k=i*(i+1)/2+j;	
				printf("%5d",data[k]);
			}
			else
			{
				printf("%5d",0);
			}
			
		}
		printf("\n");
	}
}
void inputThreeMatrix(int *data,int n)//输入三对角矩阵
{
	int temp;
	printf("请输入对称矩阵的%d个数值:\n",3*n-2);
	for(int i=0;i<3*n-2;i++)
	{
		printf("请输入第%d个数值:",i+1);
		scanf("%d",&temp); 
		data[i]=temp;
	}
}
void outputThreeMatrix(int *data,int n)//输出三对角矩阵
{
	int k;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i-j==-1 || i-j==1 || i-j==0)
			{
				k=2*i+j;
				printf("%5d",data[k]);
			}
			else
			{
				printf("%5d",0);
			}
		}
		printf("\n");
	}

}
void inputTriTable(TriTupleTable *TTT)//输入三元组矩阵
{
	for(int i=1;i<=TTT->data[0].v;i++)
	{
		printf("请输入三元矩阵的行 列 值:\n");
		scanf("%d %d %d",&TTT->data[i].i,&TTT->data[i].j,&TTT->data[i].v);
		TTT->data[i].k=i;
	}
}
void outputTriTable(TriTupleTable *TTT)//输出三元组矩阵
{
	int m,n,count=1;
	m=TTT->data[0].i;
	n=TTT->data[0].j;
	
	for(int i=1;i<=m;i++)                                                                                                                            
	{
		for(int j=1;j<=n;j++)
		{
			int sign=1;
			for(int p=1;p<=TTT->data[0].v;p++)
			{
				if(TTT->data[p].i==i && TTT->data[p].j==j)
				{
					sign=0;
					printf("%5d",TTT->data[p].v);
				}	
			}
			if(sign)
			{
				printf("%5d",0);
			}
		
		}
		printf("\n");
	}
	printf("置换后的三元矩阵为:\n");
	TransTriTable(TTT);
}
void TransTriTable(TriTupleTable *TTT)//三元组矩阵的转置运算
{
	int m,n,count=1;
	m=TTT->data[0].i;
	n=TTT->data[0].j;
	for(int i=1;i<=n;i++)                                                                                                                            
	{
		for(int j=1;j<=m;j++)
		{
			int sign=1;
			for(int p=1;p<=TTT->data[0].v;p++)
			{
				if(TTT->data[p].i==j && TTT->data[p].j==i)
				{
					sign=0;
					printf("%5d",TTT->data[p].v);
				}	
			}
			if(sign)
			{
				printf("%5d",0);
			}
		
		}
		printf("\n");
	}
}
void menu()
{
	system("mode con cols=80 lines=45");
	system("color F4");
	printf("\t***************************************************************\n");
	printf("\t*                        矩阵压缩                             *\n");
	printf("\t***************************************************************\n");
	printf("\t*\t\t        1.输入对称矩阵                        *\n");
	printf("\t*\t\t        2.输出对称矩阵                        *\n");
	printf("\t*\t\t        3.输出三角矩阵                        *\n");
	printf("\t*\t\t        4.输入三对角矩阵                      *\n");
	printf("\t*\t\t        5.输出三对角矩阵                      *\n");
	printf("\t*\t\t        6.输入三元组矩阵                      *\n");	
	printf("\t*\t\t        7.输出三元组矩阵                      *\n");
	printf("\t*\t\t        8.三元组矩阵的转置运算                *\n");
	printf("\t***************************************************************\n");
	int n;
	int *data;
	TriTupleTable *TTT; 
	printf("\t\t请选择功能\n");
	int a;
	scanf("%d",&a);
	while(a)
	{
		switch(a)
		{
			case 1:
				{
					printf("请输入矩阵的阶数:\n");
					scanf("%d",&n);
					data=(int *)malloc(sizeof(int *)*(n*(n+1)/2));
					inputsymmatrix(data,n);//输入矩阵
					outputsymmatrix(data,n);
					break;
				}
			case 2:outputsymmatrix(data,n);break;
			case 3:outputdsmatrix(data,n);break; 
			case 4:
				{
					printf("请输入矩阵的阶数:\n");
					scanf("%d",&n);
					data=(int *)malloc(sizeof(int *)*(3*n-2));
					inputThreeMatrix(data,n);
					outputThreeMatrix(data,n);
					break;
				}
			case 5:	outputThreeMatrix(data,n);break;	
			case 6:
				{
					int i=0;
					TTT=(TriTupleTable*)malloc(sizeof(TriTupleTable));
					printf("请输入三元矩阵的行:");
					scanf("%d",&TTT->data[i].i);
					printf("请输入三元矩阵的列:");
					scanf("%d",&TTT->data[i].j);
					printf("请输入三元矩阵非零元素的个数:");
					scanf("%d",&TTT->data[i].v);
					inputTriTable(TTT);
					outputTriTable(TTT);
					break;
				}
			case 7:outputTriTable(TTT);break;
			case 8:TransTriTable(TTT);break;
			default:printf("\t\t还在紧张创作中!!!敬请期待!!!");
		}
		printf("\t\t请选择功能\n");
		printf("\t\t温馨提示输入12可查看菜单\n");
		scanf("%d",&a);
		system("cls");
	} 
}

七、调试界面

在这里插入图片描述

八、总结

在编写程序时往往都是二维数组表示矩阵,然而在数值分析中经常出现一些阶数很高的的矩阵,同时在距震中有很多值相同的元素,或者是零元素,为了节省空间,可以对这类矩阵进行压缩存储,所谓的压缩存储就是,多个值相同的元之分配一个存储空间,对零元不分配空间。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值