十字链表的实现C++
2015-11-17 15:26
513 查看
稀疏矩阵的存储——十字链表
<span style="font-size:18px;">/* 稀疏矩阵的存储——十字链表的实现 */ #include<iostream> #include<fstream> #include<string> using namespace std; //数据节点 class Node { public: int row; int col; class Node *right, *down; union Tag { int value; class Node *link; }tag; }; //十字链表 class Matrix { public: Matrix(){} ~Matrix(){} //得到行列最大值 void MAX_N(int &res, int row, int col) { res = (row > col ? row : col); } //创建十字链表 void CreateMat(string filename,int trow, int tcol) { int i, j; int MAX; MAX_N(MAX, trow, tcol);//确定行列最大数 Node *h;//共用的行列头结点 Node *p, *q, *r; mh = (Node *)malloc(sizeof(Node));//头结点 mh->row = trow;//总行数 mh->col = tcol;//总列数 r = mh; i = 0; //生成所有行列头结点(尾插法) while (i < MAX) { h = (Node *)malloc(sizeof(Node)); h->down = h->right = h; r->tag.link = h; r = h; i++; } r->tag.link = mh;//构成循环 ifstream readFile; readFile.open(filename); if (readFile.fail() || readFile.bad())//文件关联失败 { exit(0); } if(readFile.is_open())//正常打开文件 { int fdata; for (i = 0; i < trow; i++) { for (j = 0; j < tcol; j++) { readFile >> fdata; if (readFile.good()) { if (fdata != 0)//不为0插入 { p = (Node *)malloc(sizeof(Node)); p->row = i; p->col = j; p->tag.value = fdata; q = r = mh->tag.link;//指向行列头结点的开始位置 while (q->right != r&&q->right->col < j)//遍历列找到正确位置 { q = q->right; } //头插法 p->right = q->right; q->right = p; q = r = mh->tag.link; while (q->down != r&&q->down->row < i)//遍历行找到正确位置 { q = q->down; } //尾插法 p->down = q->down; q->down = p; } } } } } readFile.close(); } //输出 void DispMat() { Node *p, *q; p = mh->tag.link; while (p != mh) { q = p->right; while (p != q) { cout << "<" << q->row << "," << q->col << "," << q->tag.value << ">" << endl; q = q->right; } p = p->tag.link; } } private: Node *mh; }; int main() { Matrix mat; mat.CreateMat("data", 6, 7); mat.DispMat(); return 0; }</span>测试结果
相关文章推荐
- C++面试问题汇总
- 二叉树的基本操作C++
- c++ swap 函数
- 【C++】广义表
- VC++ 动态检测串口的热插拔
- C++经典开源库
- C#调用C++动态库时类型转换
- C++中,结构体vector使用sort排序
- C++文件读写详解(ofstream,ifstream,fstream)
- 【C++】返回栈中最小的元素,要求时间复杂度为O(1)
- 左旋字符
- LeetCode(31): Next Permutation (C++)
- QString与char *型转换
- 【C++】稀疏矩阵的普通转置与快速转置
- c++为什么将宏改进为内联、const
- 【C++】迷宫
- leetcode[C++]Surrounded Regions
- VC++从txt文本中读取字符和数字
- c语言static的作用
- C/C++代码命名和格式规范