#include<stdio.h>
#include<malloc.h>
#define smax 45
typedef int datatype;
typedef struct lnode   int i,j;
 struct lnode *cptr,*rptr;
 union
 {
  struct lnode *next;
  datatype v;
 }uval;
}link;
int flag=0;


link *creatlinkmat()
{
 link *p,*q,*head,*cp[smax];
 int i,j,k,m,n,t,s;
 datatype v;
 printf("Print m,n,t:\n");
 scanf("%d,%d,%d",&m,&n,&t); 
 if(m>n)s=m; else s=n; 
 head=(link *)malloc(sizeof(link));  
 head->i=m;head->j=n;
 cp[0]=head;   

 for(i=1;i<=s;i++)  {
  p=(link *)malloc(sizeof(link));
  p->i=0;p->j=0;
  p->rptr=p;p->cptr=p;
  cp[i]=p; cp[i-1]->uval.next=p;
 }
 cp[s]->uval.next=head;
 for(k=1;k<=t;k++)
 {
  printf("\t Print i,j,v:",k);
  scanf("%d%d%d",&i,&j,&v);
  p=(link *)malloc(sizeof(link));
  p->i=i;p->j=j;p->uval.v=v;
  q=cp[i];
  while((q->rptr!=cp[i])&&(q->rptr->j<j))
   q=q->rptr;
  p->rptr=q->rptr;
  q->rptr=p;
  q=cp[j];
  while((q->cptr!=cp[j])&&(q->cptr->i<i))
   q=q->cptr;
  p->cptr=q->cptr;
  q->cptr=p;
 }
 return head;
}

void insert(int i,int j,int v,link *cp[])
{
 link *p,*q;
 p=(link *)malloc(sizeof(link));
 p->i=i;p->j=j;p->uval.v=v;
 
 q=cp[i];
 while((q->rptr!=cp[i])&&(q->rptr->j<j))
  q=q->rptr;
 
 p->rptr=q->rptr;
 q->rptr=p;
 
 q=cp[j];
 while((q->cptr!=cp[j])&&(q->cptr->i<i))
  q=q->cptr ;
 
 p->cptr=q->cptr;
 q->cptr=p;
}


void print(link *A)
{
 link *p,*q,*r;
 int k,col,t,row;
 col=A->j;
 printf("The Matrix:\n");
 p=A->uval.next;
 while(p!=A)
 {
  q=p->rptr;
  if(q==A->cptr)break;
  r=p;
  while(q!=p)
  {
   for(k=1;k<q->j-(r->j);k++)
    printf("  0");
   printf("%3d",q->uval.v);
   q=q->rptr;
   r=r->rptr;
  }
  k=r->j;
  for(t=k;t<col;t++)
   printf("  0");
  printf("\n");
  p=p->uval.next;
 }
}
link *add(link *a,link *b)
{
 link *p,*q,*u,*v,*r,*cp[smax],*c; int s,i;
 if(a->i!=b->i||a->j!=b->j)
 { flag=1;return NULL; }
 
 c=(link *)malloc(sizeof(link));
 c->i=a->i;c->j=a->j;
 if(c->i>c->j)s=c->i; else s=c->j;
 cp[0]=c;
 for(i=1;i<=s;i++)
 {
  r=(link *)malloc(sizeof(link));
  r->i=0;r->j=0;
  r->rptr=r;r->cptr=r;
  cp[i]=r;
  cp[i-1]->uval.next=r;
 }
 cp[s]->uval.next =c; 
  
 p=a->uval.next;u=b->uval.next;
 while(p!=a&&u!=b)
 {
  q=p->rptr;v=u->rptr;
  if(q==p&&v!=u)
   while(v!=u)
   {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
  else if(v==u&&q!=p)
   while(q!=p)
   {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
  else if(q!=p&&v!=u)
  {
   while(q!=p&&v!=u)
   {
    if(q->j<v->j)
    {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
    else if(q->j>v->j)
    {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
    else
    {if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
     q=q->rptr;v=v->rptr;
    }
   }
   if(q==p&&v!=u)
    while(v!=u)
    {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
   else if(v==u&&q!=p)
     while(q!=p)
     {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
   else; 
  }
  else ; 
   
  p=p->uval.next;u=u->uval.next;
 }
 return c;
}

void main()
{
 link *A,*B,*C;
 A=creatlinkmat();print(A);
 B=creatlinkmat();print(B);
 C=add(A,B);
 if(flag==1)printf("A,B can not plus!");
 else printf("Matrix c is:\n");print(C);
 getch();
}