如何用C++将链式节点存储的矩阵以表格形式输出?
Hi Roger! 作为C++初学者能自己实现链式稀疏矩阵已经很棒了👏 针对你想把输出改成表格形式的需求,我来一步步帮你调整代码:
问题分析
你当前的Printout()只是遍历所有存在的节点并输出位置和值,但要实现像1 2 3 4 5 6 7 8 9这样的行式输出,需要按行逐列遍历,遇到有值的节点就输出值,没有的话补0(稀疏矩阵的常规做法),同时得先确定矩阵的最大行和列,不然不知道要输出多少行多少列。
关键修改步骤
1. 修复数组越界的隐藏bug
你的Init()函数循环初始化了x[0]到x[10](共11个元素),但main()里定义的element *a[10]只有10个元素(索引0-9),插入行号10的时候会导致数组越界!先把main()里的数组定义改成:
element *a[11], *b[11], *sum[11];
2. 重写Printout()函数
修改后的函数会先遍历所有节点找到矩阵的边界,再逐行逐列输出:
void Printout(element *x[]) { int max_row = -1; int max_col = -1; // 第一步:遍历所有节点,确定矩阵的最大行和列 for (int i = 0; i < 11; i++) { element *temp = x[i]; while (temp != NULL) { if (temp->row > max_row) max_row = temp->row; if (temp->column > max_col) max_col = temp->column; temp = temp->next; } } // 处理空矩阵的情况 if (max_row == -1) { cout << "This matrix is empty" << endl; return; } // 第二步:逐行逐列输出矩阵 for (int i = 0; i <= max_row; i++) { element *current = x[i]; // 当前行的链表头指针 for (int j = 0; j <= max_col; j++) { // 如果当前节点存在且列号匹配,输出值并移动指针 if (current != NULL && current->column == j) { cout << current->value << " "; current = current->next; } else { cout << "0 "; // 稀疏矩阵空白处补0,不需要的话可以改成"" } } cout << endl; // 每行结束换行 } }
代码逻辑解释
- 确定矩阵边界:先遍历所有节点,记录最大的行号和列号,这样我们就知道要输出多少行多少列。
- 逐行输出:对每一行,从第0列到最大列遍历:
- 如果当前行的链表中存在对应列的节点,就输出它的值,并移动到链表的下一个节点(因为你的插入逻辑是按列排序的,所以可以顺序遍历)。
- 如果没有对应节点,就输出0(如果你不需要显示0,直接输出空格也可以,但稀疏矩阵通常会补0来体现完整结构)。
额外小建议
- 你的代码里用到了
<conio.h>和<process.h>,这两个是Windows特有的头文件,而且代码里并没有用到它们的函数,可以删掉,这样代码的兼容性更好。 - 在C++中,更推荐用
new替代malloc来分配内存,比如把element *news = (element*)malloc(sizeof(element));改成element *news = new element;,不过用malloc对于初学者来说也没问题。
测试效果
如果你插入(0,0)=1、(0,1)=2、(0,2)=3、(1,0)=4、(1,1)=5、(1,2)=6、(2,0)=7、(2,1)=8、(2,2)=9,输出会变成:
1 2 3 4 5 6 7 8 9
完美符合你的需求啦!
内容的提问来源于stack exchange,提问作者RogerSK
相关产品推荐
相关产品推荐

