首页 > 代码库 > 看数据结构写代码(21) 稀疏矩阵(十字链表方式)

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间。大部分时间 花费在 调试 内存问题上。

比如在销毁十字链表时。多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常。

当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去。free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除。_CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里,若在,返回 true,否则返回 flase,。

多次 释放节点空间,必然 造成 _CrtIsValidHeapPointer(pUserData) 异常。

仅仅要释放的 不是 分配的起始 地址 都会 报 这个异常。

还有 一个 地方,就是 使用了 释放的 空间的数据。

c/c++ 内存问题。是个 头疼的问题。

以下 进入 正题:

稀疏矩阵 的 十字链表 方式,是 给 全部的行 和 列 都 当成 一个 链表 来处理。

第 i 行 j列的 非0 节点,既在 第 i行的链表上,又在 第 j列的 链表上,所以 叫 十字链表。

结构图例如以下:

技术分享

以下 上代码

欢迎指出代码不足

// CrossList.cpp : 定义控制台应用程序的入口点。
//稀疏矩阵的十字链表实现

#include "stdafx.h"
#include <stdlib.h>

typedef int ElementType;
enum E_State
{
	E_State_Error = 0,
	E_State_Ok = 1,
};

struct MatrixNode
{
	int row;
	int col;
	ElementType data;
	MatrixNode * rightNext;
	MatrixNode * downNext;
};

MatrixNode * makeNode(int row,int col,ElementType data){
	MatrixNode * newNode = (MatrixNode *) malloc(sizeof(MatrixNode));
	if (newNode != NULL)
	{
		newNode->row = row;
		newNode->col = col;
		newNode->data = http://www.mamicode.com/data;"--------------------遍历開始-----------------\n");
	for (int i = 0; i < list.rowNum; i++)
	{
		MatrixNode * next = list.rowHead[i]->rightNext;
		while (next != NULL)
		{
			printf("%d行 %d列 : %d\n",next->row+1,next->col+1,next->data);
			next = next->rightNext;
		}
	}
	printf("--------------------遍历结束------------------\n");
}

int initData[5][10] = {
	{1,0,0,0,0,0,0,0,0,0},
	{0,0,2,0,0,0,0,0,5,0},
	{0,0,0,3,0,0,0,0,0,0},
	{0,2,0,0,0,0,0,0,0,0},
	{1,0,0,0,0,0,0,0,0,9},
};

int initAddData[5][10]= {
	{1,0,0,0,3,0,0,0,0,0},
	{0,0,2,0,4,0,0,0,5,0},
	{0,0,0,3,0,0,0,0,0,0},
	{0,2,0,0,2,0,0,0,0,0},
	{1,0,0,0,1,0,0,0,0,9},
};

int initData2 [10][2] = {
	{1,0},
	{0,0},
	{0,0},
	{0,0},
	{0,0},
	{0,6},
	{0,0},
	{0,0},
	{5,0},
	{0,0},
};

int _tmain(int argc, _TCHAR* argv[])
{
	//初始化数据
	printf("--------------------矩阵1------------\n");
	CrossList list1;
	listInit(&list1,5,10);
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			int data = http://www.mamicode.com/initData[i][j];"--------------------矩阵2------------\n");
	CrossList list2;
	listInit(&list2,5,10);
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			int data = http://www.mamicode.com/initAddData[i][j];"--------------------矩阵1 = 矩阵1 + 矩阵2------------\n");
	listAdd(&list1,list2);
	listTraverse(list1);
	printf("--------------------矩阵1 = 矩阵1 - 矩阵2------------\n");
	listSub(&list1,list2);
	listTraverse(list1);
	printf("--------------------矩阵3------------\n");
	CrossList list3;
	listInit(&list3,10,2);
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			int data = http://www.mamicode.com/initData2[i][j];"--------------------矩阵4 = 矩阵1 * 矩阵3------------\n");
	CrossList list4;
	listMult(list1,list3,&list4);
	listTraverse(list4);
	//释放内存空间
	listDestory(&list1);
	listDestory(&list2);
	listDestory(&list3);
	listDestory(&list4);
	return 0;
}
执行截图:

技术分享

技术分享



看数据结构写代码(21) 稀疏矩阵(十字链表方式)