64,682
社区成员
发帖
与我相关
我的任务
分享
#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;
}
}
}
}