クロスチェーンテーブル&疎マトリクス
3277 ワード
#include<stdio.h>
#include<stdlib.h>
typedef struct OLNode
{
int i,j; //
int e; //
struct OLNode *right,*down; //
}OLNode, *OLink;
typedef struct// , CreatSMatrix_OL()
{
OLink *rhead, *chead;
int mu, nu, tu; // 、
}CrossList;
// M(CrossList , 、 )
bool InitSMatrix(CrossList &M)
{
M.rhead=M.chead=NULL;
M.mu=M.nu=M.tu=0;
return true;
}
//
bool CreateSMatrix(CrossList &M,int m,int n,int t)
{
int i,j,k;
int e;
M.mu=m;
M.nu=n;
M.tu=t;
//
M.rhead=(OLink*)malloc((m+1)*sizeof(OLNode));
if(!M.rhead)
exit(0);
//
M.chead=(OLink*)malloc((n+1)*sizeof(OLNode));
if(!M.chead)
exit(-1);
for(k=1;k<=m;++k) // ;
M.rhead[k]=NULL;
for(k=1;k<=n;++k) // ;
M.chead[k]=NULL;
printf(" %d :
",M.tu);
OLink p,q;
for(k=0;k<t;++k)
{
scanf("%d%d%d",&i,&j,&e);
p=(OLNode*)malloc(sizeof(OLNode));
if(!p)
exit(-1);
p->i=i; //
p->j=j;
p->e=e;
// ,
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
// p
p->right=NULL;
M.rhead[i]=p;
}
else //
{
// ,
for(q=M.rhead[i]; q->right!=NULL && q->right->j < j;q = q->right)
p->right=NULL; // ,
// p->right=q->right ,
q->right=p;
}
//
if(M.chead[j] == NULL || M.chead[j]->i > i)
{
// p
p->down = NULL;
M.chead[j] = p;
}
else //
{
for(q = M.chead[j];q->down && q->down->i < i;q = q->down)
;
p->down=NULL; //
q->down=p;
}
}
return true;
}
bool CheckSMatrix(CrossList &M,int i,int j,int &e)
{
OLink p=M.rhead[i];
while(p&&p->j!=j)
p=p->right;
if(!p) return false;
e=p->e;
return true;
}
// M
bool PrintSMatrix(CrossList &M)
{
int i,j,e;
OLink p,q,r;
printf("%d %d %d
",M.mu,M.nu,M.tu);//
for(i=1;i<=M.mu;++i)
{
for(j=1;j<=M.nu;++j)
{
if(CheckSMatrix(M,i,j,e))
printf("%d ",e);
else
printf("%d ",0);
}
printf("
");
}
return true;
}
int main()
{ int m,n,t;
CrossList A,B,C;
InitSMatrix(A); // CrossList
InitSMatrix(B);
printf(" A:
");
printf(" :");
scanf("%d",&m);
printf(" :");
scanf("%d",&n);
printf(" :");
scanf("%d",&t);
CreateSMatrix(A,m,n,t);
printf(" A:
");
PrintSMatrix(A);
system("pause");
}