写完 这个样例,花费了 我不少时间。大部分时间 花费在 调试 内存问题上。
比如在销毁十字链表时。多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常。
当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去。free(p)的时候
,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除。_CrtIsValidHeapPointer(pUserData) 这个函数 正是 检查 这个空间是否 在链表里,若在,返回 true,否则返回
flase,。
多次 释放节点空间,必然 造成 _CrtIsValidHeapPointer(pUserData) 异常。
仅仅要释放的 不是 分配的起始 地址 都会 报 这个异常。
还有
一个 地方,就是 使用了 释放的 空间的数据。
c/c++ 内存问题。是个 头疼的问题。
以下 进入 正题:
稀疏矩阵 的 十字链表 方式,是 给 全部的行 和 列 都 当成 一个 链表 来处理。
第 i 行 j列的 非0 节点,既在 第 i行的链表上,又在 第 j列的 链表上,所以 叫 十字链表。
结构图例如以下:
以下 上代码
欢迎指出代码不足
// CrossList.cpp : 定义控制台应用程序的入口点。
//稀疏矩阵的十字链表实现
#include "stdafx.h"
#include
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 = data;
newNode->rightNext = NULL;
newNode->downNext = NULL;
}
return newNode;
}
//十字链表
struct CrossList
{
MatrixNode ** rowHead;
MatrixNode ** colHead;
int rowNum;
int colNum;
int totalNum;
};
E_State listInit(CrossList * list,int row,int col){
list->rowHead = (MatrixNode**)malloc(sizeof(MatrixNode*) * row);
list->colHead = (MatrixNode**)malloc(sizeof(MatrixNode*) * col);
if (list->rowHead && list->colHead)
{
list->rowNum = row;
list->colNum = col;
list->totalNum = 0;
//建立头指针节点
for (int i = 0; i < row; i++)
{
list->rowHead[i] = makeNode(-1,-1,-1);
if (list->rowHead[i] == NULL)
{
return E_State_Error;
}
}
for (int i = 0; i < col; i++)
{
list->colHead[i] = makeNode(-1,-1,-1);
if (list->co