首页 > 代码库 > 看数据结构写代码(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) 稀疏矩阵(十字链表方式)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。