源代码——十字链表实现稀疏矩阵


十字链表图示:


代码实现:

<span style="font-size:18px;">#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

typedef struct Matrix_ELEMENT //稀疏矩阵成员,值 并指向下一个值
{
	int row;
	int col;

	int value;
	struct Matrix_ELEMENT *rowLink;
	struct Matrix_ELEMENT *colLink;
};

typedef struct Matrix_ELEMENT MELEMENT;

typedef MELEMENT *LINKS;	//指向一行或者一列的指针

typedef struct CROSS_LINK 
{
	int rowCount;
	int colCount;
	/*LINKS *rowLinks;
	LINKS *colLinks;*/ //上下两句等价

	MELEMENT **rowLinks;
	MELEMENT **colLinks;

}CROSS_LINK;

CROSS_LINK *initCrossLink(void);
MELEMENT *findPreCol(MELEMENT *rowLink, int col);
MELEMENT *findPreRow(MELEMENT *colLink, int row);
void destroyCrossLink(CROSS_LINK *cross);
void showCrossLink(CROSS_LINK *cross);

void showCrossLink(CROSS_LINK *cross)
{
	int i, j;
	MELEMENT *p;

	//输出的技巧
	printf("矩阵如下:\n");
	for (i = 0; i < cross->rowCount; i++)
	{
		for (p = cross->rowLinks[i], j = 0; p; p = p->rowLink)
		{
			while (j++ < p->col)
			{
				printf("0 ");
			}
			printf("%d ", p->value);
		}
		while (j++ < cross->colCount)
		{
			printf("0 ");
		}
		printf("\n");
	}
}

void destroyCrossLink(CROSS_LINK *cross)
{
	//先释放每行指针形成的链表
	int i;
	MELEMENT *p;
	for (i = 0; i < cross->rowCount; i++)
	{
		while (p = cross->rowLinks[i])
		{
			p = cross->rowLinks[i];
			cross->rowLinks[i] = p->rowLink;
			free(p);
		}
	}
	//再释放行链数组和列连数组
	free(cross->colLinks);
	free(cross->rowLinks);
	//最后释放头
	free(cross);
}

MELEMENT *findPreRow(MELEMENT *colLink, int row)
{
	MELEMENT *p, *q = NULL;

	for (p = colLink; p && row >= p->row; p = p->colLink)
	{
		q = p;
	}
	return q;
}

MELEMENT *findPreCol(MELEMENT *rowLink, int col)
{
	MELEMENT *p, *q = NULL;

	for (p = rowLink; p && col >= p->col; p = p->rowLink)
	{
		q = p;
	}
	return q;
}

CROSS_LINK *initCrossLink()
{
	CROSS_LINK *head;
	MELEMENT *mElement, *q;
	int row, col;
	int value;

	printf("请输入稀疏矩阵的阶数(行 列):");
	scanf("%d%d", &row, &col);
	
	head = (CROSS_LINK *)malloc(sizeof(CROSS_LINK));

	head->rowCount = row;
	head->colCount = col;
	head->rowLinks = (LINKS *)calloc(sizeof(LINKS),row);
	head->colLinks = (MELEMENT **)calloc(sizeof(MELEMENT *), col);

	printf("请输入(行 列 值)(行值输入为-1,结束输入):");
	scanf("%d%d%d", &row, &col, &value);
	while (row != -1) //(row != EOF)
	{
		//将row、col、he value的值对应到相应的元素
		mElement = (MELEMENT *)calloc(sizeof(MELEMENT), 1);
		//mElement->rowLink = NULL;
		//mElement->colLink = NULL;
		mElement->row = row;
		mElement->col = col;
		mElement->value = value;

		if (head->rowLinks[row] == NULL)
			head->rowLinks[row] = mElement;
		else
		{
			q = findPreCol(head->rowLinks[row], col);
			if (q == NULL)
			{
				mElement->rowLink = head->rowLinks[row];
				head->rowLinks[row] = mElement;
			}
			else
			{
				mElement->rowLink = q->rowLink;
				q->rowLink = mElement;
			}
		}
		if (head->colLinks[col] == NULL)
			head->colLinks[col] = mElement;
		else
		{
			q = findPreRow(head->colLinks[col], row);
			if (q == NULL)
			{
				mElement->colLink = head->colLinks[col];
				head->colLinks[col] = mElement;
			}
			else
			{
				mElement->colLink = q->colLink;
				q->colLink = mElement;
			}
		}
		printf("请输入(行 列 值)(行值输入为-1,结束输入):");
		scanf("%d%d%d", &row, &col, &value);
	}

	return head;
}
void main(void)
{
	CROSS_LINK *cLink;

	cLink = initCrossLink();
	showCrossLink(cLink);
	destroyCrossLink(cLink);

	system("pause");
}</span>


在vs2013中运行结果如下:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值