数据结构12——以三元组表为存储结构实现矩阵相加(耿5.7)

以三元组表为存储结构实现矩阵相加(耿5.7)

Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 247, Total Submissions: 1092

Description

假设稀疏矩阵A和B均以三元组表作为存储结构。试编写矩阵相加的程序,另设三元组表C存放结果矩阵。矩阵大小为m行n列(0<m,n<100)

Input

第一行输入t1,t2(0<t1,t2<100) ,t1和t2分别是矩阵A和B中非零元素的个数,后面t1+t2行分别输入A和B中的元素,用三元组表示。

Output

输出三元组表C。

  • Sample Input 
    3 3
    1 2 3
    3 2 1
    3 4 2
    1 1 4
    3 2 5
    3 4 1
  • Sample Output
    1 1 4
    1 2 3
    3 2 6
    3 4 3

#include<stdio.h>  
#include<stdlib.h>  
  
typedef struct node{  
    int row;  
    int col;  
    int num;  
}node;  
  
typedef struct{  
    int cnt1,cnt2;  
    node matrix1[101];  
    node matrix2[101];  
}juzhen;  
  
void init(juzhen *p){  
    int t1,t2,i=0;  
    int x,y,z,tmp;  
    scanf("%d%d",&t1,&t2);  
    p->cnt1=t1;  
    p->cnt2=t2;  
    while(1){  
        scanf("%d%d%d",&x,&y,&z);  
        p->matrix1[i].row = x;  
        p->matrix1[i].col = y;  
        p->matrix1[i].num = z;  
        i++;  
        if(i==t1) break;  
    }  
    i=0;  
    while(1){  
        scanf("%d%d%d",&x,&y,&z);  
        p->matrix2[i].row = x;  
        p->matrix2[i].col = y;  
        p->matrix2[i].num = z;  
        i++;  
        if(i==t2) break;  
    }  
}  
  
void add(juzhen *p){  
    int i,j,k,t,flag;  
    int tmp;  
    for(i=0;i < p->cnt2;i++){  
        flag=1;  
        for(j=0;j < p->cnt1;j++){  
            if(p->matrix1[j].row == p->matrix2[i].row && p->matrix1[j].col == p->matrix2[i].col){  
                p->matrix1[j].num +=p->matrix2[i].num;
				if(p->matrix1[j].num == 0){//删除0
					for(t = j; t < p->cnt1-1; t++){
					    p->matrix1[t].col = p->matrix1[t+1].col;
					    p->matrix1[t].row = p->matrix1[t+1].row;
					    p->matrix1[t].num = p->matrix1[t+1].num;
					}
					p->cnt1 = p->cnt1-1;
				}
                flag=0;  
                break;  
            }     
        }  
        if(flag){
		    k=p->cnt1-1; 
            p->matrix1[++k].row = p->matrix2[i].row;  
            p->matrix1[k].col = p->matrix2[i].col;  
            p->matrix1[k].num = p->matrix2[i].num;
            p->cnt1++; 
        }  
    }    
      
    for(i=0;i < p->cnt1-1;i++){  
        for(j=i;j<p->cnt1;j++){  
            if(p->matrix1[i].row > p->matrix1[j].row){    
                tmp = p->matrix1[i].row;    
                p->matrix1[i].row = p->matrix1[j].row;    
                p->matrix1[j].row = tmp;    
                tmp =p ->matrix1[i].col;    
                p->matrix1[i].col = p->matrix1[j].col;    
                p->matrix1[j].col = tmp;    
                tmp = p->matrix1[i].num;    
                p->matrix1[i].num = p->matrix1[j].num;    
                p->matrix1[j].num = tmp;    
            }   
        }  
    }  
    for(i=0;i<p->cnt1-1;i++){    
        for(j=i;j<p->cnt1+1;j++){    
            if(p->matrix1[i].row == p->matrix1[j].row && p->matrix1[i].col > p->matrix1[j].col){    
                tmp = p->matrix1[i].col;    
                p->matrix1[i].col = p->matrix1[j].col;    
                p->matrix1[j].col = tmp;    
                tmp = p->matrix1[i].num;    
                p->matrix1[i].num = p->matrix1[j].num;    
                p->matrix1[j].num = tmp;    
            }    
        }    
   }   
}    
  
void output(juzhen *p){  
    int tmp=0;  
    while((p->cnt1)--){  
        printf("%d %d %d\n",p->matrix1[tmp].row,p->matrix1[tmp].col,p->matrix1[tmp].num);  
        tmp++;  
    }  
}  
  
int main(){  
     juzhen *p=(juzhen *)malloc(sizeof(juzhen));  
     init(p);  
     add(p);  
     output(p);  
     return 0;  
} 

题解:

      三元组相加,首先,将两个矩阵储存在两个数组中。这两个矩阵分别取出元素相加,然后将相加的结果重新按大小排序。需要注意的是,当相加结果为0时,则删除该三元组。


复习:

#include<stdio.h>
#include<stdlib.h>
#define Max 1001

typedef struct node{
	int row;
	int col;
	int num;
}node;

typedef struct matrix{
	int cnt1, cnt2;
	struct node triad1[Max];
	struct node triad2[Max];
}matrix;

void init(matrix *list){
	int a, b, x, y ,z;
	int i;
	scanf("%d%d", &a, &b);
	list->cnt1 = a;
	list->cnt2 = b;
	for(i = 0; i < a; i++){
	    scanf("%d%d%d", &x, &y, &z);
		list->triad1[i].row = x;
		list->triad1[i].col = y;
		list->triad1[i].num = z;
	}
	for(i = 0; i < b; i++){
		scanf("%d%d%d", &x, &y, &z);
	    list->triad2[i].row = x;
		list->triad2[i].col = y;
		list->triad2[i].num = z;
	}
}

void dele(matrix *list, int x){
	int i;
	for(i = x; i < list->cnt1-1; i++){
	    list->triad1[i] = list->triad1[i+1];
	}
	list->cnt1--;
}

void insert(matrix *list, int x){
	list->triad1[list->cnt1] = list->triad2[x]; 
	list->cnt1++;
}

void add(matrix *list){
	int i, j, x, y, flag;
	x = list->cnt1;
	y = list->cnt2;
	for(i = 0; i < y; i++){
		flag = 1;
		for(j = 0; j < x; j++){
			if(list->triad2[i].row == list->triad1[j].row && list->triad2[i].col == list->triad1[j].col){
			    list->triad1[j].num += list->triad2[i].num;
				if(list->triad1[j].num == 0){
				    dele(list, j);
				}
				flag = 0;
				break;
			}
		}
		if(flag){
		     insert(list, i);
		}
	}
}

void output(matrix *list){
	int i, x, y, z;
	for(i = 0; i <list->cnt1; i++){
	    x = list->triad1[i].row;
		y = list->triad1[i].col;
		z = list->triad1[i].num;
		printf("%d %d %d\n", x, y, z);
	}
}

void sort(matrix *list){
    int i, j;
	node p;
	for(i = 0; i < list->cnt1-1; i++){
		for(j = i; j < list->cnt1-i-1; j++){
			if(list->triad1[j].row > list->triad1[j+1].row){
			     p = list->triad1[j];
				 list->triad1[j] = list->triad1[j+1]; 
				 list->triad1[j+1] = p;
			}
		}
	}
	for(i = 0; i < list->cnt1-1; i++){
		for(j = i; j < list->cnt1-i-1; j++){
			if(list->triad1[j].row == list->triad1[j+1].row && list->triad1[j].col > list->triad1[j+1].col){
			     p = list->triad1[j];
				 list->triad1[j] = list->triad1[j+1];
				 list->triad1[j+1] = p;

			}
		}
	}
}

int main(){
	matrix *list = (matrix*)malloc(sizeof(matrix));
	init(list);
	add(list);
	sort(list);
	output(list);
	return 0;
}

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值