稀疏矩阵的十字链接存储

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*---------------------------------------------------------------------
稀疏矩阵的链接存储结构(十字链接存储)
---------------------------------------------------------------------*/
#include
#include

typedef int ElemType; //元素类型
#define MaxRows 10 //最大行数
#define MaxColumns 10 //最大列数

//三元组结构(十字连接存储)
struct CrossNode
{
int row, col; //记录元素的行值、列值
ElemType val; //记录元素值
struct CrossNode *right, *down; //记录元素的右指向指针、下指向指针
};

//十字链接存储结构
struct CLMatrix
{
int m, n, t; //记录总行数、总列数、总的非零元素个数
struct CrossNode *rm[MaxRows+1]; //记录行首元素地址
struct CrossNode *cm[MaxColumns+1]; //记录列首元素地址
};

/*---------------函数声明---------------*/
void InitCLMatrix(struct CLMatrix *M); //初始化稀疏矩阵(十字链接存储)
void CreatCLMatrix(struct CLMatrix *M, int mtemp, int ntemp); //稀疏矩阵的建立(十字连接存储)
void outputCLMatrix(struct CLMatrix *M); //输出稀疏矩阵(十字链接存储)

/*---------------主函数---------------*/
void main(void)
{
struct CLMatrix M;
InitCLMatrix(&M);
CreatCLMatrix(&M, 3, 4);
printf("\n输出稀疏矩阵:\n");
outputCLMatrix(&M);
}

/*---------------函数---------------*/
//初始化稀疏矩阵(十字链接存储)
void InitCLMatrix(struct CLMatrix *M)
{
int i;
M->m = 0;
M->n = 0;
M->t = 0;
for(i=1; i<=MaxRows; i++)
M->rm[i] = NULL;
for(i=1; i<=MaxColumns; i++)
M->cm[i] = NULL;
}

//稀疏矩阵的建立(十字链接存储)
void CreatCLMatrix(struct CLMatrix *M, int mtemp, int ntemp)
{
int ttemp;
int rowtemp, coltemp;
ElemType valtemp;
ttemp = 0;
printf("请输入每一个三元组:\n");
scanf("%d%d%d", &rowtemp, &coltemp, &valtemp);
while(rowtemp!=0)
{
struct CrossNode *newp, *cp;
//得到和建立一个新结点
newp = malloc(sizeof(struct CrossNode));
newp->row = rowtemp;
newp->col = coltemp;
newp->val = valtemp;
newp->right = newp->down = NULL;
//把新结点链接到所在行单链表的结尾
cp = M->rm[rowtemp];
if(cp==NULL)
M->rm[rowtemp] = newp;
else
{
while(cp->right!=NULL)
cp = cp->right;
cp->right = newp;
}
//把新结点链接到所在列单链表的结尾
cp = M->cm[coltemp];
if(cp==NULL)
M->cm[coltemp] = newp;
else
{
while(cp->down!=NULL)
cp = cp->down;
cp->down = newp;
}
//输入下一个三元组
scanf("%d%d%d", &rowtemp, &coltemp, &valtemp);
}
M->t = ttemp;
}

//输出稀疏矩阵(十字链接存储)
void outputCLMatrix(struct CLMatrix *M)
{
int i;
struct CrossNode *p;
printf("( ");
//输出元素
for(i=1; i<=MaxRows; i++)
{
p = M->rm[i];
if(p!=NULL)//判断行首元素是否为空
{
while(p->right

!=NULL)//判断该元素下一右元素是否为空
{
printf("(%d,%d,%d)", p->row, p->col, p->val);
p = p->right;
}
printf("(%d,%d,%d)", p->row, p->col, p->val);//输出该行最后一个元素
}
}
printf(" )\n");
}



相关文档
最新文档