一个赋值导致指针地址改变和读取文件的问题,求指点

艾鹿特 2018-03-13 12:48:03
一个图论的练习:从文件读入一个有向图(带权,n 个结点,m 条边)的权矩阵表示,输出这个图的关联矩阵、边列表、正向表、邻接表表示。
输入的第一行为一个正整数 n,表示图中结点的个数;接下来有 n 行,每一行有 n 个用空格隔开的整数,第 i 行的第 j 个整数表示矩阵中的aij。边的编号按照矩阵中从左到右,从上到下的顺序编号,即第一行第一个不为 0 的权值表示的边是 e1,第一行第二个不为 0 的权值表示的边是 e2
写了这么一个程序,但是标记了两步遇到了一点问题。
#include <iostream>
#include <fstream>
using namespace std;
//邻接表的节点实现
class Node{
public:
int a,b; //a是边终点,b是权值
Node * c; //c是指向下一个节点的指针
Node(int a = 0, int b = 0, Node * c = NULL);
};
Node::Node(int a, int b, Node * c): a(a), b(b), c(c){};
int main() {
int n, e = 0, i, j, k, x = 0; //e是总边数
ifstream infile;
ofstream outfile;
infile.open("input.txt");
outfile.open("output.txt");
infile >> n; //n是题目中的n
//文件数据装入二维数组
int a[n - 1][n - 1];
for (i = 0; i < n; i ++) {
for (j = 0; j < n; j ++) {
infile >> a[i][j];
if (a[i][j] != 0)
e ++; //计算总边数
}
}
infile.close();
//打印装入二维数组的数据,测试0
for (i = 0; i < n; i ++) {
for (j = 0; j < n; j ++) {
cout<<a[i][j]<<" ";
}}
//转换模块
Node * q[n - 1]; //表示邻接表的n个节点
Node v[e - 1]; //一共e条边,所以e个节点
k = 0; //k表示当前处在第几条边
da[0] = 1;
for (i = 0; i < n; i ++) {
x = 0; //该点起始边的计数
q[i] = NULL;
for (j = 0; j < n; j ++) {
if (a[i][j] != 0) {
x ++;
k ++;
//转换邻接表
if (x == 1){ //q[i]还没有指向第一个节点
q[i] = & (v[k - 1]); //让q[i]指向结点i后的第一个节点
cout << q[0] << " " << q[1] << " " << & v[0] << " " << & v[1] << endl; //测试行1
//修改节点表示边的权值和边终点
v[k - 1].a = j + 1;
cout << q[0] << " " << q[1] << " " << & v[0] << " " << & v[1] << endl; //测试行2
v[k - 1].b = a[i][j];
v[k - 1].c = NULL;
}
else { //q[i]已经指向过了第一个节点
v[k - 2].c = & v[k - 1]; //使上一个节点指向表示新边的节点
//修改节点表示边的权值和边终点
v[k - 1].a = j + 1;
v[k - 1].b = a[i][j];
v[k - 1].c = NULL;
}
}
}
}

以上省略了转换关联矩阵、边列表、正向表的部分,经调试这些部分没有出错。
用以下的input.txt测试文件读取和转换邻接表
2
0 5
9 0
测试0发现装进二维数组的数据是
0 9 9 0
请问装入二维数组的时候哪一步有问题?
测试1和测试2的语句均在循环下运行了两次,得到了这样的结果
0x7ffeefbfec90 0x0 0x7ffeefbfec90 0x7ffeefbfeca0
0x7ffeefbfec90 0x0 0x7ffeefbfec90 0x7ffeefbfeca0
0x7ffeefbfec90 0x7ffeefbfeca0 0x7ffeefbfec90 0x7ffeefbfeca0
0x7ffe00000001 0x7ffeefbfeca0 0x7ffeefbfec90 0x7ffeefbfeca0
请问为什么在测试行1和测试行2之间给v赋值会导致指针q指向的地址变化呢?
编译环境:Xcode 9.2
...全文
341 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘来是梦 2018-03-19
  • 打赏
  • 举报
回复
int a[n - 1][n - 1]; n = 2 的时候得到是什么?
赵4老师 2018-03-14
  • 打赏
  • 举报
回复
不要依赖调试器输出复杂数据结构!而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出,非常有助于调试!或者可以说是“基础设施” 参考:十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧