1. 三元组表
1.1 结构体
#define MaxSize 20000
typedef int ElemType;
typedef struct{
int i,j; //行号和列号
ElemType elem; //元素值
}Triple;
typedef struct{
Triple data[MaxSize];
int mu,nu,tu; //行数,列数和非零元个数
}TSMatrix;
1.2 运算
· 转置
void TransposeSMatrix(TSMatrix M,TSMatrix *T)
{
int p,q,col;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
if(T->tu){
q=0;
for(col=0;col<M.nu;++col)
for(p=0;p<M.tu;++p)
if(M.data[p].j==col){
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].elem=M.data[p].elem;
q++;
}
}
}
· 矩阵乘法
用一个ctemp[]累加,只把A矩阵中j值和B中i值相等的元素对应相乘,A[I][k]和B[k][j]相乘,把A的第I行乘完累加,就是C[I][J]的值。
2. 十字链表
结点结构
typedef int ElemType;
typedef struct OLNode{
int i,j;
ElemType e;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct{
OLink *Rhead,*Chead;
int mu,nu,tu;
}CrossList;
· 存储
对结点分别进行行插入和列插入。
void CreateCrossList(CrossList *M)
{
int k,m,n,t;
scanf("%d%d%d",&m,&n,&t);
M->mu=m;
M->nu=n;
M->tu=t;
//创建表头数组
M->Rhead=(OLink*)malloc((m+1)*sizeof(OLink));
M->Chead=(OLink*)malloc((n+1)*sizeof(OLink));
//初始化
for(k=1;k<=m;k++)
M->Rhead[k]=NULL;
for(k=1;k<=n;k++)
M->Chead[k]=NULL;
int i,j,e;
OLink p,q;
//输入结点并插入
for(k=1;k<=t;k++){
scanf("%d%d%d",&i,&j,&e);
p=(OLink)malloc(sizeof(OLNode));
p->i=i; p->j=j; p->e=e;
if(M->Rhead[i]==NULL||M->Rhead[i]->j>j){
//插在表头
p->right=M->Rhead[i];
M->Rhead[i]=p;
}
else{
//寻找合适的地方进行插入
for(q=M->Rhead[i];q->right&&q->right->j<j;q=q->right)
;
p->right=q->right;
q->right=p;
}
if(M->Chead[j]==NULL||M->Chead[j]->i>i){
p->down=M->Chead[j];
M->Chead[j]=p;
}
else{
for(q=M->Chead[j];q->down&&q->down->i<i;q=q->down)
;
p->down=q->down;
q->down=p;
}
}
}