三元组表表示法和十字链表表示法及转置函数;
#include<stdio.h>
#include<stdlib.h>
#define maxn 100
typedef struct //三元组表表示法;
{
int row,col;
int e;
} Triple;
typedef struct
{
Triple data[maxn+1];
int m,n,len;
} TSMatrix;
void TransMatrix(int (*a)[10],int (*b)[10],int m,int n) //最基本的转置;
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
b[j][i]=a[i][j];
}
}
}
void TransposeTSMatrix(TSMatrix A,TSMatrix *B) //列徐递增转置算法;
{
int i,j,k;
B->m=A.n;
B->n=A.m;
B->len=A.len;
if(B->len>0)
{
j=1;
for(k=1; k<=A.n; k++)
{
for(i=1; i<=A.len; i++)
{
if(A.data[i].col==k)
{
B->data[j].row=A.data[i].col;
B->data[j].col=A.data[i].row;
B->data[j].e=A.data[i].e;
j++;
}
}
}
}
}
void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B) //一次定位快速转置算法;
{
int col,t,p,q;
int num[maxn],position[maxn];
B->len=A.len;
B->n=A.m;
B->m=A.n;
if(B->len)
{
for(col=1; col<=A.n; col++)
{
num[col]=0;
}
for(t=1; t<=A.len; t++)
{
num[A.data[t].col]++;
}
position[1]=1;
for(col=2; col<=A.n; col++)
{
position[col]=position[col-1]+num[col-1];
}
for(p=1; p<=A.len; p++)
{
col=A.data[p].col;
q=position[col];
B->data[q].row=A.data[p].col;
B->data[q].col=A.data[p].row;
B->data[q].e=A.data[p].e;
position[col]++;
}
}
}
typedef struct OLNode //十字链表;
{
int row,col;
int value;
struct OLNode *right,*down;
} OLNode,*OLink;
typedef struct
{
OLink *row_head,*col_head;
int m,n,len;
} CrossList;
void CreateCrossList(CrossList *M) //建立十字链表法的稀疏矩阵;
{
int m,n,t;
OLNode *p,*q;
scanf("%d%d%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink*)malloc((m+1)*sizeof(OLink)))) return;
if(!(M->col_head=(OLink*)malloc((m+1)*sizeof(OLink)))) return;
M->row_head=M->col_head=NULL;
int i,j,e;
for(scanf("%d%d%d",&i,&j,&e); i!=0; scanf("%d%d%d",&i,&j,&e))
{
if(!(p=(OLNode*)malloc(sizeof(OLNode)))) return;
p->row=i;
p->col=j;
p->value=e;
if(M->row_head[i]==NULL) M->row_head[i]=p;
else
{
q=M->row_head[i];
while(q->right!=NULL&&q->right->col<j) q=q->right;
p->right=q->right;
q->right=p;
}
if(M->col_head[j]==NULL) M->col_head[j]=p;
else
{
q=M->col_head[j];
while(q->down!=NULL&&q->down->row<i) q=q->down;
p->down=q->down;
q->down=p;
}
}
}
int main()
{
int a[10][10],b[10][10];
int x=0;
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
a[i][j]=x;
x++;
}
}
TransMatrix(a,b,5,5);
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
TSMatrix A,B,C;
A.m=5;
A.n=5;
x=0;
for(int i=1; i<=5; i++)
{
for(int j=1; j<=5; j++)
{
x++;
A.data[x].row=i;
A.data[x].col=j;
A.data[x].e=x;
}
}
A.len=x;
TransposeTSMatrix(A,&B);
printf("%d %d %d\n",(A.data[2].row),(A.data[2].col),(A.data[2].e));
printf("%d %d %d\n\n",(B.data[2].row),(B.data[2].col),(B.data[2].e));
FastTransposeTSMatrix(A,&C);
printf("%d %d %d\n",(A.data[2].row),(A.data[2].col),(A.data[2].e));
printf("%d %d %d\n\n",(C.data[2].row),(C.data[2].col),(C.data[2].e));
CrossList L;
CreateCrossList(&L);
return 0;
}