三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》

Posted 自由的背包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》相关的知识,希望对你有一定的参考价值。

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

#define MAXSIZE 225
#define N 9
typedef struct{
	int i,j;
	int e;
}Triple;
 
typedef struct{
	Triple data[MAXSIZE+1];
	int mu,nu,tu;
}TSMatrix;

int CreatSMatrix(TSMatrix &M){
	M.mu= N;
	M.nu = N;
	M.tu = 0;
	return 1;
}

void TransposeSMatrix(TSMatrix M,TSMatrix &T){
	T.mu = M.mu;
	T.nu = M.nu;
	T.tu = M.tu;
	int c=1;
	for(int i = 1;i<N;i++){
		for(int j = 1;j<N;j++){
			if(M.data[c].e!=0){
				T.data[c].e = M.data[c].e;
				T.data[c].i = M.data[c].j;
				T.data[c].j = M.data[c].i;
				c++;
			}
		}
	}	
}
int InsertElem(TSMatrix *M,int row,int col,int e){
	int i,t,p;	
	if(M->tu>=MAXSIZE){
		printf("\nError:Insert position is beyond the arrange.\n"); 
		return 0;
	}
	p=1;
	if(M->tu==0){
		M->data[p].i = row;
		M->data[p].j = col;
		M->data[p].e = e;
		M->tu++;
		return 1;
	}
	
for(t=1;t<=M->tu;t++)//寻找合适的插入位置  
        if((row>=M->data[t].i)&&(col>=M->data[t].j))  
                p++;  
    if(row==M->data[t-1].i && col==M->data[t-1].j){//插入前,该元素已经存在  
        M->data[t-1].e=e;  
        return 1;  
    }  
    for(i=M->tu;i>=p;i--){//移动p之后的元素  
        M->data[i+1].i=M->data[i].i;  
        M->data[i+1].j=M->data[i].j;  
        M->data[i+1].e=M->data[i].e;  
    }  
    //插入新元素  
    M->data[p].i=row;  
    M->data[p].j=col;  
    M->data[p].e=e;  
    M->tu++;  
    return 1;  
	
	
	
	
	
	
}



void AddSMatrix(TSMatrix M,TSMatrix T,TSMatrix &W){
	int c=1;
	for(int i = 1;i<=W.mu;i++){
		for(int j = 1;j<=W.nu;j++){
			if(i==M.data[c].i&&j==M.data[c].j&&i==T.data[c].i&&j==T.data[c].j){
			
				W.data[c].e= M.data[c].e +T.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;}
			else if(i==M.data[c].i&&j==M.data[c].j){
				W.data[c].e= M.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;
			}else if(i==T.data[c].i&&j==T.data[c].j){
				W.data[c].e=T.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;
			}
		}
	}
}
void PrintfSMatrix(TSMatrix *M){
	int i,j,p=1;
	if(M->tu==0){
		printf("0矩阵");
	    exit(0); 
	}
	for(i=1;i<=M->mu;i++){
		for(j=1;j<=M->nu;j++){
			if(i==M->data[p].i&&j==M->data[p].j){
				printf("%d\t",M->data[p].e);
				p++;
			}else{
				printf("0\t");
			}
		}
		printf("\n");
	} 
	printf("\n");
} 


int main(){
	TSMatrix M,T,W;
	CreatSMatrix(M);
	CreatSMatrix(T);
	CreatSMatrix(W);
	int r,c,e,n,x,p=1;
	printf("请输入非零元素的个数;");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("\请输入非零元素的行数列数及非零元素");
		scanf("%d %d %d",&r,&c,&e); 
		InsertElem(&M,r,c,e);
	}
	
	for(int i=1;i<=M.mu;i++){
		for(int j=1;j<=M.nu;j++){
			if(i==M.data[p].i&&j==M.data[p].j){
				printf("%d\t",M.data[p].e);
				p++;
			}else{
				printf("0\t");
			}
		}
		printf("\n");
	} 
	while(1){
		printf("1.转置  2.相加\n输入相应编号执行操作:");
		scanf("%d",&x);
		switch(x){
			case 1:
				TransposeSMatrix(M,T);
				PrintfSMatrix(&T);
				break;
			case 2:
				AddSMatrix(M,T,W);
				PrintfSMatrix(&W);
				exit(0);
		} 
	}
	
	return 0; 
}

 

以上是关于三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》的主要内容,如果未能解决你的问题,请参考以下文章

关于稀疏矩阵三元组的转置

设计算法,将m*n稀疏矩阵转换成三元组表示,并分析其时间复杂度和空间复杂度

数据结构22:数组和广义表

MATLAB 稀疏矩阵

数据结构实验报告之三元组顺序表存储的稀疏矩阵练习

C++实现矩阵压缩