#include <stdio.h>
#include <stdlib.h>
#define size 1000
typedef struct{
int row,col;//行标,列标
int e;
}triple;
typedef struct{
triple data[size+1];//data[0]不用
int m,n,len;//矩阵的行数列数和非零元素的个数
}mar;
void scan(mar *t,int n){
int i;
int x,y,z;
for(i=0;i<n;i++){
scanf("%d",&x);
scanf("%d",&y);
scanf("%d",&z);
t->data[i].row=x;
t->data[i].col=y;
t->data[i].e=z;
t->len++;
}
}//输入三元组
void print(mar *t){
int i;
for(i=0;i<t->len;i++){
printf("%d %d %d",t->data[i].row,t->data[i].col,t->data[i].e);
printf("\n");
}
}
void add(mar *a,mar *b,mar *c){
c->len = 0;
int aptr = 0, bptr = 0;//a和b的长度哨兵
while (aptr < a->len && bptr < b->len) {
if (a->data[aptr].row < b->data[bptr].row) {//将行值小的先存入,存入的过程中,将c的长度自动加一
c->data[c->len++] = a->data[aptr++];
}
else if (a->data[aptr].row > b->data[bptr].row) {
c->data[c->len++] = b->data[bptr++];
}
else {// a->data[aptr].row == b->data[bptr].row当行值相同时,分三种情况比较列值
if (a->data[aptr].col < b->data[bptr].col) {
c->data[c->len++] = a->data[aptr++];
}
else if (a->data[aptr].col > b->data[bptr].col) {
c->data[c->len++] = b->data[bptr++];
}
else {// a->data[aptr].col == b->data[bptr].col,当他们都相等的时候将俩个相加存入
if (a->data[aptr].e + b->data[bptr].e != 0) {
c->data[c->len].row = a->data[aptr].row;
c->data[c->len].col = a->data[aptr].col;
c->data[c->len].e = a->data[aptr].e + b->data[bptr].e;
c->len++;
}
aptr++;
bptr++;
}
}
}
while (aptr < a->len) c->data[c->len++] = a->data[aptr++];//将还未存完的三元组直接存入结果三元组之中
while (bptr < b->len) c->data[c->len++] = b->data[bptr++];
}
int main(){
mar *a,*b,*c;
a = (mar*)malloc(sizeof(mar));
b = (mar*)malloc(sizeof(mar));
c = (mar*)malloc(sizeof(mar));
int t1,t2;
scanf("%d%d",&t1,&t2);
a->len=t1;
b->len=t2;
scan(a,t1);
scan(b,t2);
add(a,b,c);
print(c);
return 0;
}
noj数据结构三元组加法
最新推荐文章于 2024-09-06 14:55:54 发布