#define MaxVertexNum 100 //最大顶点数 bool collected[MaxVertexNum] = {false}; 实测只有第一个元素被初始化了,为什么?
时间: 2024-04-09 08:27:45 浏览: 17
对于全局数组的初始化,如果使用了大括号方式进行初始化,但没有提供足够的初始值来填充整个数组,那么只有第一个元素会被初始化,其余元素会被默认初始化为零值(对于 bool 类型来说,为 false)。
为了确保所有元素都被正确初始化为 false,你可以使用循环来遍历数组并逐个赋值为 false,如下所示:
```cpp
#define MaxVertexNum 100 //最大顶点数
bool collected[MaxVertexNum];
void initializeCollectedArray() {
for (int i = 0; i < MaxVertexNum; i++) {
collected[i] = false;
}
}
int main() {
initializeCollectedArray();
// 其他代码...
return 0;
}
```
这样就能确保所有元素都被正确初始化为 false。
相关问题
2个问题:1. 我就不想使用循环初始化数组。2.我的代码 #define MaxVertexNum 100 //最大顶点数 bool collected[MaxVertexNum] = {false}; 和你之前的例子 #define ARRAY_SIZE 10 bool collected[ARRAY_SIZE] = {false}; 有区别吗? 为什么,你建议的初始化数组方式,在我的例子里,只有第一个元素被初始化?
1. 如果你不想使用循环初始化数组,你可以使用以下方式:
```cpp
bool collected[MaxVertexNum] = {[0 ... MaxVertexNum-1] = false};
```
这种方式使用了数组初始化器(array initializer)的扩展语法,通过指定范围来初始化数组的所有元素为 false。这样就能一次性初始化所有元素,而不需要使用循环。
2. 在你的例子中,定义了一个宏 `MaxVertexNum` 和一个全局数组 `collected`,并使用大括号初始化器来初始化所有元素为 false:
```cpp
#define MaxVertexNum 100 //最大顶点数
bool collected[MaxVertexNum] = {false};
```
与我之前给出的例子相比,两者的区别在于宏定义的名称和宏展开后的值不同。在你的例子中,宏 `MaxVertexNum` 的值是 100,而在我之前的例子中,宏 `ARRAY_SIZE` 的值是 10。这意味着在编译时,数组 `collected` 的大小将根据不同的宏值而有所不同。
关于为什么在你的例子中只有第一个元素被初始化,可能是因为你的编译器不支持 C99 标准的数组初始化器扩展语法。在这种情况下,只有第一个元素会被初始化为 false,其余元素将被默认初始化为零值(对于 bool 类型来说,为 false)。
为了确保所有元素都被正确初始化为 false,你可以使用循环来遍历数组并逐个赋值为 false,或者使用上面提到的数组初始化器的扩展语法来初始化所有元素。
邻接矩阵存储图的深度优先遍历 分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */ 函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。 裁判测试程序样例: #include <stdio.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* 最大顶点数设为10 */ #define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/ typedef int Vertex; /* 用顶点下标表示顶点,为整型 */ typedef int WeightType; /* 边的权值设为整型 */ typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */ bool Visited[MaxVertexNum]; /* 顶点的访问标记 */ MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */ void Visit( Vertex V ) { printf(" %d", V); } void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); int main() { MGraph G; Vertex V; G = CreateGraph(); scanf("%d", &V); printf("DFS from %d:", V); DFS(G, V, Visit); return 0; } /* 你的代码将被嵌在这里 */ 输入样例:给定图如下 5 输出样例: DFS from 5: 5 1 3 0 2 4 6
题目描述
本题要求实现邻接矩阵存储图的深度优先遍历。
函数接口定义:
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
其中MGraph是邻接矩阵存储的图,定义如下:
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。
裁判测试程序样例:
#include <stdio.h>
typedef enum {false, true} bool;
#define MaxVertexNum 10 /* 最大顶点数设为10 */
#define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void Visit( Vertex V ) {
printf(" %d", V);
}
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
int main() {
MGraph G;
Vertex V;
G = CreateGraph();
scanf("%d", &V);
printf("DFS from %d:", V);
DFS(G, V, Visit);
return 0;
}
输入样例:
给定图如下
5
输出样例:
DFS from 5: 5 1 3 0 2 4 6
算法1
深度优先遍历
我们可以使用递归的方式实现深度优先遍历。首先标记当前节点已经被访问,然后依次访问当前节点的邻居节点,对于每个邻居节点,如果该节点没有被访问过,则递归遍历该节点。具体实现时,我们可以使用一个Visited数组来记录每个节点是否被访问过。
C++ 代码
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
Visit(V);
Visited[V] = true;
for (Vertex W = 0; W < Graph->Nv; W++) {
if (Graph->G[V][W] != 0 && !Visited[W]) {
DFS(Graph, W, Visit);
}
}
}
时间复杂度
深度优先遍历的时间复杂度是O(V + E),其中V是顶点数,E是边数。
参考文献
算法基础课程第二版
C++ 代码
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)