以三元组表为存储结构实现矩阵相加(耿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;
}