三元顺序表和行逻辑链接的顺序表

第一次看三元顺序表和行逻辑连接顺序表,区别没想太明白,写了段代码梳理一下思路,顺带熟悉一下C/C++

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

#define ArrSize  5

// 三元顺序表的元素结构 
typedef struct {
	int i;	// 在原表的第几行 
	int j;  // 在原表的第几列 
	int data; // 存储的值 
} Triple;

// 三元顺序表结构 
typedef struct{
	int n =ArrSize;  // 原表有几行 
	int m =ArrSize;  // 原表有几列 
	int count; // 总共有非零元素的个数
	Triple *dataArr; //三元顺序表 
	
	// 新增一个行逻辑顺序表 , 用来存储每行第一个非零值的位置
	int *rpos; 
}TripleArr;


// 输出所有的元素 
void display(TripleArr *arr);


int main(){
	
	// 产生一个稀疏矩阵
	int arr[][ArrSize] = { {0,0,20,0,3},{0,1,0,0,0},{0,0,0,0,3}, {0,0,0,0,5},{6,0,0,0,0}};

	// 压缩
	int avaibleCount =0;
	for(int i=0; i<ArrSize ; i++){
		for(int j=0 ;j<ArrSize ;j++){
			if(arr[i][j]>0){
				avaibleCount++;
			}
		}
	}		
	Triple *data = 	 (Triple *)calloc(avaibleCount,sizeof(Triple));
	int *rposition = (int*) calloc(ArrSize,sizeof(int)); 
	int index =0;
	for(int i=0; i<ArrSize ; i++){ 
		bool first = true;
		for(int j=0 ;j<ArrSize ;j++){
			if(arr[i][j]>0){
				data[index].i = i;
				data[index].j =j;
				data[index].data =arr[i][j];
				if(first){
					// 存储在三元顺序表中的位置 
					rposition[i] = index ;
					first = false;
				}
				index++;
			}
		}
	}	

	TripleArr *tripleArr = new TripleArr();
	tripleArr->count = avaibleCount;
	tripleArr->dataArr =data;
	tripleArr->rpos = rposition;
	
	// 使用  
	display(tripleArr) ;
	
	// 释放 
	free(data);
	free(rposition);
	return 0;
	 
}

// 输出所有的元素 
void display(TripleArr *arr){
	int row = arr->n;
	int colum = arr->m;
	for(int i=0 ;i<row ; i++){
		for(int j=0 ; j<colum ; j++){
			bool zeroValue = true;
			// 如果只使用三元表,那么需要遍历 整个三元顺序表 
			/*for(int k = 0 ; k< arr->count; k++){
				if(i == arr->dataArr[k].i && j == arr->dataArr[k].j){
					printf(" %02d ",arr->dataArr[k].data);
					zeroValue = false;
				}
			}*/
			// 使用行逻辑连接的顺序表后,不用遍历所有的,只需要遍历该行的非零,
			// 根据稀疏矩阵的特性,矩阵较大时, row << arr->count  理论上是降低了遍历的循环次数 
			for(int k = arr->rpos[i]; k<arr->rpos[i+1];k++){
				if(i == arr->dataArr[k].i && j == arr->dataArr[k].j){
					printf(" %02d ",arr->dataArr[k].data);
					zeroValue = false;
				}
			} 
			
			if(zeroValue){
				printf(" %02d ",0);
			}
	
		}
		printf("\n");
	} 
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值