#include <iostream> #include <cstring> using namespace std; const int MAXN = 10; int main() { int n, m, s; cin >> n >> m >> s; // 邻接矩阵 int matrix[MAXN][MAXN]; memset(matrix, 0, sizeof(matrix)); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; matrix[u - 1][v - 1] = matrix[v - 1][u - 1] = 1; } // 输出邻接矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } // 邻接表 struct Node { int val; Node *next; }; Node *list[MAXN]; memset(list, 0, sizeof(list)); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; Node *node1 = new Node{v - 1, list[u - 1]}; list[u - 1] = node1; if (!s) { Node *node2 = new Node{u - 1, list[v - 1]}; list[v - 1] = node2; } } // 输出邻接表 for (int i = 0; i < n; i++) { cout << i << ":"; Node *p = list[i]; while (p) { cout << " " << p->val; p = p->next; } cout << endl; } return 0; }
时间: 2024-02-14 14:18:23 浏览: 80
这个代码的问题在于,邻接表的构造中,使用了数组list来存储每个节点的链表头指针,但是在为链表头指针赋值时,使用的是list[u-1]而不是list[u],这样会导致最后输出邻接表时,每个节点的链表头指针都是空指针。
修改方法很简单,只需要将list[u-1]改成list[u]即可。
以下是修改后的代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 10;
int main()
{
int n, m, s;
cin >> n >> m >> s;
// 邻接矩阵
int matrix[MAXN][MAXN];
memset(matrix, 0, sizeof(matrix));
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
matrix[u - 1][v - 1] = matrix[v - 1][u - 1] = 1;
}
// 输出邻接矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
// 邻接表
struct Node
{
int val;
Node *next;
};
Node *list[MAXN];
memset(list, 0, sizeof(list));
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
Node *node1 = new Node{v - 1, list[u]};
list[u] = node1;
if (!s)
{
Node *node2 = new Node{u - 1, list[v]};
list[v] = node2;
}
}
// 输出邻接表
for (int i = 0; i < n; i++)
{
cout << i << ":";
Node *p = list[i];
while (p)
{
cout << " " << p->val;
p = p->next;
}
cout << endl;
}
return 0;
}
```
注意这里对list数组的声明方式,我们使用了C++11的新特性,即可以在声明数组时初始化数组元素,这样可以让代码更加简洁,同时也可以避免忘记初始化数组元素的问题。
阅读全文