您的位置:首页 > 编程语言

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

2016-09-05 19:16 337 查看

十字链表图示:



代码实现:

<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中运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构