稀疏矩阵的三元组与十字链表存储、三元组存储转置算法,十字链表的创建

//Sparse Matrix
#include<iostream>
#define MAXRow 100
#define MAXCol 100
#define MAXNoneZero 20
using namespace std;
//三元组存储结构
typedef struct spNode
{
	int i, j, v;
}spNode;
typedef struct spMatrix
{
	int mu, nu, tu;//行数、列数、非零元个数
	spNode data[MAXNoneZero];
};

//十字链表存储结构
typedef struct
{
	int i, j, v;
	croNode* down, * right;
}croNode,*cLink;
typedef struct
{
	int mu, nu, tu;
	cLink* colHead, *rowHead;
}croLinkedList;

int main()
{
	return 0;
}

void createSparseMatrix(spMatrix* spMat, int a[][], int x, int y)
{
	spMat->mu = x;
	spMat->nu = y;
	spMat->tu = 0;
	//x,y a的行数和列数
	for (int m = 0; m < x; m++)
	{
		for (int n = 0; n < y; n++)
		{
			if(a[m][n]!=0)
			{
				spMat->data[spMat->tu].i = m;
				spMat->data[spMat->tu].j = n;
				spMat->data[spMat->tu].v = a[m][n];
				spMat->tu++;
			}
		}
	}
}
void Atrans2B_1(spMatrix* A, spMatrix* B)
{
	B = (spMatrix*)malloc(sizeof(spMatrix));
	B->mu = A->nu;
	B->nu = A->mu;
	B->tu = 0;
	for (int col = 0; col < A->nu; col++)
	{
		for (int k = 0; k < A->tu; k++)
		{
			if (A->data[k].j == col)
			{
				B->data[B->tu].i = A->data[k].j;
				B->data[B->tu].j = A->data[k].i;
				B->data[B->tu].v = A->data[k].v;
				B->tu++;
			}
		}
	}
}
void Atrans2B_2(spMatrix*A,spMatrix*B)
{
	B = (spMatrix*)malloc(sizeof(spMatrix));
	B->mu = A->nu;
	B->nu = A->mu;
	B->tu = 0;
	int* num = new int[A->nu], * cpot = new int[A->nu];
	//num[i]:A的第i列含非零元个数
	//cpot[i]:A的第i列的第一个非零元在B的三元组数组中的下标
	for (int i = 0; i < A->nu; i++)num[i] = cpot[i] = 0;
	for (int k = 0; k < A->nu; k++)   num[A->data[k].j]++;
	for (int k = 1; k < A->nu; k++) cpot[k] = cpot[k - 1] + num[k - 1];
	for (int k = 0; k < A->nu; k++)
	{
		int pos_inB = cpot[A->data[k].j];
		B->data[pos_inB].i = A->data[k].j;
		B->data[pos_inB].j = A->data[k].i;
		B->data[pos_inB].v = A->data[k].v;
		cpot[A->data[k].j]++;
	}
}


void createCroLinkedListSpMat(croLinkedList* croSpMat, int a[][], int x, int y)
{
	croSpMat = (croLinkedList*)malloc(sizeof(croLinkedList));
	croSpMat->mu = x;
	croSpMat->nu = y;
	croSpMat->tu = 0;
	croSpMat->colHead = (cLink*)malloc(sizeof(cLink) * y);
	croSpMat->rowHead = (cLink*)malloc(sizeof(cLink) * x);

	for (int k = 0; k < croSpMat->mu; k++)croSpMat->rowHead[k] = NULL;
	for (int k = 0; k < croSpMat->nu; k++)croSpMat->colHead[k] = NULL;

	for (int m = 0; m < x; m++)
	{
		for (int n = 0; n < y; n++)
		{
			if (a[m][n] != 0)
			{
				croNode* node = (croNode*)malloc(sizeof(croNode));
				node->i = m;
				node->j = n;
				node->down = node->right = NULL;
				if (croSpMat->rowHead[m] = NULL) croSpMat->rowHead[m] = node;
				else
				{
					cLink p = croSpMat->rowHead[m];
					while (p->right != NULL)p = p->right;
					p->right = node;
				}
				if (croSpMat->colHead[n] = NULL)croSpMat->colHead[n] = node;
				else
				{
					cLink p = croSpMat->colHead[n];
					while (p->down != NULL)p = p->down;
					p->down = node;
				}
			}
		}
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值