数据结构——c语言 稀疏矩阵三元组

本文介绍了一种使用C语言实现的稀疏矩阵操作方法,包括生成随机稀疏矩阵、将其转换为三元组顺序表形式、快速转置以及两稀疏矩阵相加的算法。通过示例代码展示了如何进行这些操作。

戳这里还有其他数据结构的题目噢

https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501


稀疏矩阵A、B均采用三元组顺序表表示,验证实现矩阵A快速转置算法,并设计、验证矩阵A、B相加得到矩阵c的算法。

(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。

(2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表形式存储。

(3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。

(4)输出随机生成的稀疏矩阵A、B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。

 直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 500

typedef int arr_type;

//储存行 列 值 
typedef struct {
	int row;
	int col;
	arr_type value;
}array;

//储存三元组顺序表+总行数,总列数,总非零元素个数 
typedef struct {
	array arr[MAX];
	int rownum,colnum,all;
}sparse_matrix;


//生成随机稀疏矩阵三元组 
arr_type  rand_array(sparse_matrix *s1,sparse_matrix *s2){
	srand(time(NULL));
	int r1,r2;
	r1 = s1->rownum * s1->colnum;
	r2 = s2->rownum * s2->colnum;
	int k;
	s1->all = 0,s2->all = 0;
	//矩阵A随机生成
	for(int i = 0;i < s1->rownum;i++)
		for(int j = 0;j < s1->colnum;j++)
		{
			k = rand()%r1;
			if(k < (r1/20))
			{
				s1->arr[s1->all].value = (rand()%9)+1;
				s1->arr[s1->all].row = i;
				s1->arr[s1->all].col = j;
				s1->all++;
			}
		}
	if(r1/s1->all > 20)
		return 1;
	//矩阵B随机生成 
	for(int i = 0;i < s2->rownum;i++)
		for(int j = 0;j < s2->colnum;j++)
		{
			k = rand()%r2;
			if(k < (r2/20))
			{
				s2->arr[s2->all].value = (rand()%9)+1;
				s2->arr[s2->all].row = i;
				s2->arr[s2->all].col = j;
				s2->all++;
			}
		}
	if(r2/s2->all > 20)
		return 1;
	
	return 0;
}

//转置稀疏矩阵 
sparse_matrix transposition(sparse_matrix *s){
	
	sparse_matrix T; 
	int p, q, col;
	int num[s->colnum + 1];//列数变为行数,记录行数即记录原来列数 
	int cpot[s->colnum + 1];
	
	T.rownum = s->colnum;  T.colnum = s->rownum;   T.all = s->all;
	if (s->all != 0)
	{
		for (col = 0; col < s->colnum; col++) 
			num[col] = 0;//一共有几行,全部赋值为0 
		for (int t = 0; t < s->all; t++) 
		{
			num[s->arr[t].col]++;//记录转置后每行的元素个数  
		}
		cpot[0] = 0;//转置在新的三元组中的位置(三元组的行) 
		for (col = 1; col < s->colnum; col++)
			cpot[col] = cpot[col-1] + num[col-1];
		for (p = 0; p < s->all; p++) 
		{
			col = s->arr[p].col;  //储存在三元组的数据的列(即行)
			 
			q = cpot[col];      // p 是代表 矩阵a的位置,q代表在b中要插入的位置。
			T.arr[q].col = s->arr[p].row;
			T.arr[q].row = s->arr[p].col;
			T.arr[q].value = s->arr[p].value;
			cpot[col]++;      //位置发生变化让他自动加一
		}
	}
	return T;
}

sparse_matrix add_matrix(sparse_matrix *p,sparse_matrix *q){
	
	sparse_matrix r;
	r.all = 0;
	int pp = 0,qq = 0;
	while(1)
	{
		if(p->arr[pp].row > q->arr[qq].row)
			{
				r.arr[r.all].col = q->arr[qq].col;
				r.arr[r.all].row = q->arr[qq].row;
				r.arr[r.all].value = q->arr[qq].value;
				r.all++,qq++;
			} 
		else if(p->arr[pp].row < q->arr[qq].row)
			{
				r.arr[r.all].col = p->arr[pp].col;
				r.arr[r.all].row = p->arr[pp].row;
				r.arr[r.all].value = p->arr[pp].value;
				r.all++,pp++;
			}
		else if(p->arr[pp].row == q->arr[qq].row)
		{
			if(p->arr[pp].col == q->arr[qq].col)
			{
				r.arr[r.all].value = p->arr[pp].value + q->arr[qq].value;
				r.arr[r.all].col = p->arr[pp].col;
				r.arr[r.all].row = p->arr[pp].row;
				r.all++;
				pp++,qq++;				
			}
			else if(p->arr[pp].col > q->arr[qq].col)
			{
				r.arr[r.all].col = q->arr[qq].col;
				r.arr[r.all].row = q->arr[qq].row;
				r.arr[r.all].value = q->arr[qq].value;
				r.all++,qq++;				
			} 
			else if(p->arr[pp].col < q->arr[qq].col)
			{
				r.arr[r.all].col = p->arr[pp].col;
				r.arr[r.all].row = p->arr[pp].row;
				r.arr[r.all].value = p->arr[pp].value;
				r.all++,pp++;
			}
		}
		if(pp == p->all)
		{
			while(1){
				if(q->all == qq)
					break;
				r.arr[r.all].col = q->arr[qq].col;
				r.arr[r.all].row = q->arr[qq].row;
				r.arr[r.all].value = q->arr[qq].value;
				r.all++,qq++;				
			}
			break;
		}
		if(qq == q->all)
		{
			while(1){
				if(p->all == pp)
					break;
				r.arr[r.all].col = p->arr[pp].col;
				r.arr[r.all].row = p->arr[pp].row;
				r.arr[r.all].value = p->arr[pp].value;
				r.all++,pp++;			
			}
			break;
		}
		
	}
	return r;
}

void print_matrix(sparse_matrix a){
	
	int ord=0,zero = 0;
	
	for(int i = 0;i < a.rownum;i++)
	{
		for(int j = 0;j < a.colnum;j++)
		{
			if((i == a.arr[ord].row)&&
				(j == a.arr[ord].col))
				{
				printf("% 3d",a.arr[ord].value);
				ord++;
				}
			else
				printf("% 3d",zero);
			
		}
	printf("\n");
	}
	printf("\n");
}

int main()
{
	sparse_matrix a,b,a1,c;
	printf("请输入矩阵行和列数:\n");
	scanf("%d %d",&a.rownum,&a.colnum);
	b.rownum = a.rownum,b.colnum = a.colnum;
	if(rand_array(&a,&b)){
		printf("随机生成矩阵失败!\n");
		return 0;
	}
	print_matrix(a);
	print_matrix(b);
	a1 = transposition(&a);
	print_matrix(a1);
	c = add_matrix(&a1,&b); 
	print_matrix(c);
	
	return 0;
}

 (请不要直接复制使用。代码仅供参考,希望读者借此代码自身可以理解学习)

如果代码对您有帮助,不要忘记评论收藏噢~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

起当风萧

如果喜欢请支持一下~~

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

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

打赏作者

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

抵扣说明:

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

余额充值