//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;
}
}
}
}
}
稀疏矩阵的三元组与十字链表存储、三元组存储转置算法,十字链表的创建
最新推荐文章于 2024-06-19 12:12:34 发布