
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct Node{ 4 int col,row,data; 5 Node*right,*down; 6 }OLNode,*OLink; 7 typedef struct{ 8 OLink*Rhead,*Chead; 9 int m,n,length; 10 }CrossList; 11 void Delete(int n,OLink*T,OLink p) 12 { 13 OLink t=*T; 14 if(n)//删除行元素 15 { 16 if(t==p)*T=NULL;//注意要考虑删除元素为首元素的情况! 17 else 18 { 19 while(t->right!=p)t=t->right; 20 t->right=p->right; 21 } 22 } 23 else 24 { 25 if(t==p)*T=NULL; 26 else 27 { 28 while(t->down!=p)t=t->down; 29 t->down=p->down; 30 } 31 } 32 33 } 34 void Ins(CrossList*C,OLNode*p) 35 { 36 OLNode*t; 37 if(C->Rhead[p->row]==NULL)p->right=NULL,C->Rhead[p->row]=p;//改动A 38 39 else if(C->Rhead[p->row]->col>p->col)p->right=C->Rhead[p->row],C->Rhead[p->row]=p;//改动A 40 41 else 42 { 43 t=C->Rhead[p->row]; 44 while(t->right&&t->right->col<p->col)t=t->right; 45 if(t->col==p->col) 46 { 47 if(t->data+p->data)t->data=t->data+p->data; 48 else Delete(1,&(C->Rhead[p->row]),t); 49 /*基于A*/ 50 } 51 else p->right=t->right,t->right=p;//改动a 52 } 53 54 /*列同上*/ 55 if(C->Chead[p->col]==NULL)p->down=NULL,C->Chead[p->col]=p; 56 else if(C->Chead[p->col]->row>p->row)p->down=C->Chead[p->col],C->Chead[p->col]=p; 57 else 58 { 59 t=C->Chead[p->col]; 60 while(t->down&&t->down->row<p->row)t=t->down; 61 if(t->row==p->row) 62 { 63 if(t->data+p->data);//在行遍历中已修改data值 64 else Delete(0,&(C->Chead[p->col]),t); 65 } 66 else p->down=t->down,t->down=p; 67 } 68 69 } 70 void Create(CrossList*C) 71 { 72 OLink p; 73 CrossList*T=C; 74 scanf("%d %d %d",&C->m,&C->n,&C->length); 75 C->Rhead=(OLink*)malloc(sizeof(OLink)*(C->m+1)); 76 C->Chead=(OLink*)malloc(sizeof(OLink)*(C->n+1)); 77 for(int t=1;t<=C->m;t++)C->Rhead[t]=NULL; 78 for(int t=1;t<=C->n;t++)C->Chead[t]=NULL; 79 for(int t=1;t<=C->length;t++) 80 { 81 p=(OLink)malloc(sizeof(OLNode)); 82 scanf("%d %d %d",&p->row,&p->col,&p->data); 83 p->right=NULL,p->down=NULL; 84 Ins(T,p); 85 86 } 87 } 88 void Add(CrossList*A,CrossList*B) 89 { 90 OLink b; 91 OLink p; 92 CrossList*T=A; 93 for(int t=1;t<=B->m;t++) 94 { 95 if(B->Rhead[t]) 96 { 97 b=B->Rhead[t]; 98 while(b) 99 { 100 p=(OLink)malloc(sizeof(OLNode)); 101 *p=*b; 102 Ins(T,p); 103 b=b->right; 104 } 105 } 106 } 107 108 } 109 void Order(CrossList*C) 110 { 111 OLink t; 112 int k; 113 for(k=1;k<=C->m;k++) 114 { 115 if(C->Rhead[k]) 116 { 117 t=C->Rhead[k]; 118 while(t) 119 { 120 printf("第%d行第%d列:%d\n",t->row,t->col,t->data); 121 t=t->right; 122 } 123 } 124 } 125 } 126 int main() 127 { 128 CrossList A,B; 129 Create(&A); 130 Create(&B); 131 Add(&A,&B); 132 Order(&A); 133 return 0; 134 }