#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();
}