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 }