稀疏矩阵的链式存储——十字链表法

【创建】

CrossList* Create(int A[][maxSize], int m, int n)
{
	CrossList* cl = (CrossList*)malloc(sizeof(CrossList));
	cl->m = m;
	cl->n = n;
	cl->k = 0;

	int i, j, k;
	OLNode* r, *p;

	//申请头结点数组
	if (!(cl->rhead = (OLNode*)malloc(sizeof(OLNode)*m)))
		return NULL;

	if (!(cl->chead = (OLNode*)malloc(sizeof(OLNode)*n)))
		return NULL;

	//初始化行结点数组
	for (i = 0; i < m; ++i)
	{
		cl->rhead[i].right = NULL;
		cl->rhead[i].down = NULL;
	}

	//初始化列结点数组
	for (j = 0; j < n; ++j)
	{
		cl->chead[j].right = NULL;
		cl->chead[j].down = NULL;
	}

	//设置指向每个列结点的尾指针
	OLNode* temp_c[maxSize];
	for (j = 0; j < n; ++j)
	{
		temp_c[j] = &cl->chead[j];
	}

	//存储非零元素
	k = 0;
	for (i = 0; i < m; ++i)
	{
		//设置指向行结点的指针
		r = &cl->rhead[i];
		for (j = 0; j < n; ++j)
		{
			if (A[i][j] != 0)
			{
				p = (OLNode*)malloc(sizeof(OLNode));
				p->val = A[i][j];
				p->row = i;
				p->col = j;
				p->down = p->right = NULL;

				//插入行链表中
				r->right = p;
				r = p;

				//插入列链表中
				temp_c[j]->down = p;
				temp_c[j] = p;

				k++;
			}
		}
	}

	cl->k = k;
	return cl;
}

【查找】

int Find(CrossList* cl, int i, int j)
{
	OLNode*p, *q;
	p = cl->rhead[i].right;

	while (p != NULL )
	{
		if (p->col == j)
			return p->val;
		p = p->right;
	}

	return 0;
}

查找操作错误代码:

int Find(CrossList* cl, int i, int j)
{
	OLNode*p, *q;
	p = cl->rhead[i].right;
	q = cl->chead[j].down;

	while (p != NULL && q != NULL)
	{
		if (p == q)
			return p->val;
		p = p->right;
		q = q->down;
	}
	return 0;
}

【打印】

void PrintList(CrossList*cl)
{
	int i, j;
	for (i = 0; i < cl->m; ++i)
	{
		for (j = 0; j < cl->n; ++j)
			printf("%d ", Find(cl, i, j));
		printf("\n");
	}
}

【数据测试】

#include <stdio.h>
#include <stdlib.h>
#define maxSize 100

typedef struct OLNode
{
	int row, col, val;
	struct OLNode *right, *down;
}OLNode;

typedef struct
{
	OLNode* rhead, *chead;
	int m, n, k;//行数、列数和非零元素个数
}CrossList;

CrossList* Create(int A[][maxSize], int m, int n)
{
	CrossList* cl = (CrossList*)malloc(sizeof(CrossList));
	cl->m = m;
	cl->n = n;
	cl->k = 0;

	int i, j, k;
	OLNode* r, *p;

	//申请头结点数组
	if (!(cl->rhead = (OLNode*)malloc(sizeof(OLNode)*m)))
		return NULL;

	if (!(cl->chead = (OLNode*)malloc(sizeof(OLNode)*n)))
		return NULL;

	//初始化行结点数组
	for (i = 0; i < m; ++i)
	{
		cl->rhead[i].right = NULL;
		cl->rhead[i].down = NULL;
	}

	//初始化列结点数组
	for (j = 0; j < n; ++j)
	{
		cl->chead[j].right = NULL;
		cl->chead[j].down = NULL;
	}

	//设置指向每个列结点的尾指针
	OLNode* temp_c[maxSize];
	for (j = 0; j < n; ++j)
	{
		temp_c[j] = &cl->chead[j];
	}

	//存储非零元素
	k = 0;
	for (i = 0; i < m; ++i)
	{
		//设置指向行结点的指针
		r = &cl->rhead[i];
		for (j = 0; j < n; ++j)
		{
			if (A[i][j] != 0)
			{
				p = (OLNode*)malloc(sizeof(OLNode));
				p->val = A[i][j];
				p->row = i;
				p->col = j;
				p->down = p->right = NULL;

				//插入行链表中
				r->right = p;
				r = p;

				//插入列链表中
				temp_c[j]->down = p;
				temp_c[j] = p;

				k++;
			}
		}
	}

	cl->k = k;
	return cl;
}


int Find(CrossList* cl, int i, int j)
{
	OLNode*p, *q;
	p = cl->rhead[i].right;

	while (p != NULL)
	{
		if (p->col == j)
			return p->val;
		p = p->right;
	}

	return 0;
}

void PrintList(CrossList*cl)
{
	int i, j;
	for (i = 0; i < cl->m; ++i)
	{
		for (j = 0; j < cl->n; ++j)
			printf("%d ", Find(cl, i, j));
		printf("\n");
	}
}

int main()
{
	int A[maxSize][maxSize];
	int m, n;
	m = 3, n = 4;

	int i, j;

	for (i = 0; i < m; ++i)
		for (j = 0; j < n; ++j)
			A[i][j] = 0;

	A[1][0] = 1;
	A[1][3] = 3;
	A[2][3] = 6;
	A[0][1] = 9;

	CrossList* M = Create(A, m, n);
	PrintList(M);

	return 0;
}

【结果】

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值