#include <stdio.h>
#include <stdlib.h>
typedef int Datatype;
/*十字链表表示法*/
typedef struct OLNode
{
int i,j;
Datatype e;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
OLink *rowhead,*colhead;
int m,n,len;
}CrossList;
void InitMatrix(CrossList *M)
{
/*初始化矩阵*/
M->rowhead=M->colhead=NULL;
M->m=M->n=M->len=0;
}
/*按行释放节点空间*/
void DestroyMatrix(CrossList *M)
{
int i;
OLink p,q;
for(i=0;i<M->m;i++)
{
p=*(M->rowhead+i); //p指向指针数组
while(p)
{
q=p; //q指向p指向的目标,即p,q在一起
p=p->right; //p移动向下一个
free(q);
}
}
free(M->rowhead);
free(M->colhead);
InitMatrix(M);
}
void CreateMatrix(CrossList *M)
{
int i,k;
int m,n,num;
OLNode *p,*q;
if(M->rowhead) /*神来之笔,链表不空则释放空间*/
DestroyMatrix(M);
printf("输入稀疏矩阵的行数,列数,非零元素个数:");
scanf("%d%d%d",&m,&n,&num);
M->m=m;
M->n=n;
M->len=num;
M->rowhead=(OLink*)malloc(m*sizeof(OLink));
if(!M->rowhead) //如果分配失败
exit(-1);
M->colhead=(OLink*)malloc(n*sizeof(OLink));
if(!M->colhead)
exit(-1);
/*初始化十字链表*/
for(k = 0;k<m;k++)
M->rowhead[k]=NULL;
for(k=0;k<n;k++)
M->colhead[k]=NULL;
printf("请按任意次序输入%d个非零元的行号,列号以及元素值:\n",M->len);
for(k = 0;k<num;k++)
{
p = (OLink*)malloc(sizeof(OLNode));
if(!p)
exit(-1);
scanf("%d%d%d",&p->i,&p->j,&p->e);
/*将节点*p插入到行表中*/
q=M->rowhead[p->i];
if(!q||p->j<q->j)
{
p->right=M->rowhead[p->i];
M->rowhead[p->i] = p;
}
else
{
while(q->right&&q->right->j<p->j)
q=q->right; //q指向下一个节点
p->right = q->right; //将*p插入到*q之后
q->right = p;
}
/*将节点*p插入到列表中*/
q = M->colhead[p->j];
if(!q||p->i < q->i)
{
p->down=M->colhead[p->j];
M->colhead[p->j]=p;
}
else
{
while(q->down&&q->down->i<p->i)/*如果q的行号小于p的行号,则在链表中查找插入位置*/
q=q->down;
p->down=q->down;/*将p插入到q结点之下*/
q->down=p;
}
}
}
void InsertMatrix(CrossList *M,OLink p)
/*按照行序将p插入到稀疏矩阵中*/
{
OLink q=M->rowhead[p->i];/*q指向待插行表*/
if(!q||p->j<q->j)/*待插的行表空或p所指结点的列值小于首结点的列值,则直接插入*/
{
p->right=M->rowhead[p->i];
M->rowhead[p->i]=p;
}
else
{
while(q->right&&q->right->j<p->j)/*q所指不是尾结点且q的下一结点的列值小于p所指结点的列值*/
q=q->right;
p->right=q->right;
q->right=p;
}
q=M->colhead[p->j];/*q指向待插列表*/
if(!q||p->i<q->i)/*待插的列表空或p所指结点的行值小于首结点的行值*/
{
p->down=M->colhead[p->j];
M->colhead[p->j]=p;
}
else
{
while(q->down&&q->down->i<p->i)/*q所指不是尾结点且q的下一结点的行值小于p所指结点的行值*/
q=q->down;
p->down=q->down;
q->down=p;
}
M->len++;
}
void PrintMatrix(CrossList M)
/*按矩阵形式输出十字链表*/
{
int i,j;
OLink p;
for(i=0;i<M.m;i++)
{
p=M.rowhead[i];/*p指向该行的第1个非零元素*/
for(j=0;j<M.n;j++)/*从第一列到最后一列进行输出*/
if(!p||p->j!=j)/*已到该行表尾或当前结点的列值不等于当前列值,则输出0*/
printf("%-3d",0);
else
{
printf("%-3d",p->e);
p=p->right;
}
printf("\n");
}
}
int main()
{
CrossList M;
InitMatrix(&M);
CreateMatrix(&M);
DestroyMatrix(&M);
return 0;
}
以上代码参考自《数据结构》陈锐