数据结构稀疏矩阵的基本操作

实现稀疏矩阵的输入、输出、添加元素、删除元素、转置操作。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define true 0
#define false 1
typedef struct
{
	int i, j;//记录矩阵行和列的数值
	int e;//记录非零元素的值
}Triple;
typedef struct
{
	Triple data[MAXSIZE + 1];
	int mu, nu, tu;//记录矩阵行数、列数、非零元素个数
}TSMatrix;
int get(TSMatrix &T);//输入
int show(TSMatrix &T);//输出
int init(TSMatrix &T);//插入
int del(TSMatrix &T);//删除
int transport(TSMatrix &L, TSMatrix &T);//转置
int main()//主函数
{
	int x=-1 ;
	TSMatrix t;
	while(x!=0)
	{
		printf("请输入要执行的操作:\n1.建立矩阵\n2.矩阵的插入\n3.矩阵的删除\n4.矩阵的转置\n0.退出\n");
		scanf("%d", &x);
		switch (x)
		{
		case 1:
			if(get(t)==0)
			show(t);
			break;
		case 2:
			printf("矩阵的插入\n");
			init(t);
			printf("插入此元素后\n");
			show(t);
			break;
		case 3:
			printf("矩阵的删除\n");
			if(del(t)==0)
			{
			printf("删除后\n");
			show(t); 
			}
			else
			{
				printf("该数据已为0\n");
			}
			break;
		case 4:
			printf("矩阵的转置\n");
			TSMatrix l;
			transport(t, l);
			printf("转置后\n");
			show(l);
			break;
		}
	}
	system("pause");
	return 0;
}
int get(TSMatrix &T)//建立矩阵
{
	int i,m,n,e;
	printf("请输入矩阵的行数、列数和非零元个数\n" );
	scanf("%d", &T.mu);
	scanf("%d", &T.nu);
	scanf("%d", &T.tu);
	if (T.tu > MAXSIZE||T.tu>(T.mu*T.nu))
	{
		printf("非零元素太多,请重新输入\n"); return false;
	}
	T.data[0].i = 0;
	for (i = 1; i <= T.tu; i++)
	{
		printf("请输入第 %d 个非零元的行数、列数以及非零元的值\n" ,i);
		scanf("%d", &m);
		scanf("%d", &n);
		scanf("%d", &e);
		if (m<1 || m>T.mu || n<1 || n>T.nu)
		{
			printf("行或列超出范围,请重新输入\n"); return false;
		}
		if (m < T.data[i - 1].i || m == T.data[i - 1].i&&n <= T.data[i - 1].j)
		{
			printf("行或列的顺序有错,请重新输入\n"); return false;
		}
		T.data[i].i = m;
		T.data[i].j = n;
		T.data[i].e = e;
	}
	return true;
}
int show(TSMatrix &T)//输出矩阵
{
	int i, j, k, p;
	for (i = 1; i <= T.mu; i++)
	{
		for (j = 1; j <= T.nu; j++)
		{
			p = 0;
			for (k = 1; k <= T.tu; k++)
				if (T.data[k].i == i&&T.data[k].j == j) 
				{ printf("%d",T.data[k].e ); p = 1; }
			if (p == 0)printf("0");
		}
		printf("\n");
	}
	return 0;
}
int init(TSMatrix &T)//插入元素
{
	int m, n, k, r = 1;
	printf("请输入要插入的行数、列数和非零元的值\n" );
	scanf("%d",&m);
	scanf("%d",&n);
	scanf("%d", &k);
	if (T.tu == 0)
	{
		T.tu = T.tu + 1;
		T.data[T.tu].i = m;
		T.data[T.tu].j = n;
		T.data[T.tu].e = k;
	}
	for (r = 1; r <= T.tu; r++)
		if (T.data[r].i == m&&T.data[r].j == n)
		{
			printf("此位置已有数据,请存储在其他位置\n");
			return false;
			break;
		}
		
			T.tu = T.tu + 1;
			T.data[T.tu].i = m;
			T.data[T.tu].j = n;
			T.data[T.tu].e = k;
			return true;
			
}
int del(TSMatrix &T)//删除元素
{
	int m, n, r;
	printf("请输入要删除的行数、列数\n" );
	scanf( "%d", &m);
	scanf("%d", &n);
	
	for (r = 1; r <= T.tu; r++)
		if (T.data[r].i == m&&T.data[r].j == n)
		{
			T.data[r].e = 0;
			return true;
			break;
		}
			return false;
}
int transport(TSMatrix & L, TSMatrix &T)//转置矩阵
{
	T.mu = L.nu; T.nu = L.mu; T.tu = L.tu;
	if (T.tu)
	{
		int m, n, p = 1;
		for (m = 1; m <= T.mu; m++)
			for (n = 1; n <= T.tu; n++)
				if (L.data[n].j == m)
				{
					T.data[p].i = L.data[n].j;
					T.data[p].j = L.data[n].i;
					T.data[p].e = L.data[n].e;
					p++;
				}
	}
	return 0;
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值