Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 图DFS的实现_C_Graph_Depth First Search - Fatal编程技术网

C 图DFS的实现

C 图DFS的实现,c,graph,depth-first-search,C,Graph,Depth First Search,我试图实现一个图形并在C中执行DFS。但是DFS操作会导致一个错误,即一旦指针x从相邻节点的队列中跑出,w就会被分配一个随机值。条件=NULL似乎什么都不做。我希望它在队列清空后立即中断,如何实现这一点 我还想知道,如何实现运行时版本的节点数?我认为C不支持数组的动态实例。我应该声明一个非常大的数组并使用它吗 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct node {

我试图实现一个图形并在C中执行DFS。但是DFS操作会导致一个错误,即一旦指针x从相邻节点的队列中跑出,w就会被分配一个随机值。条件=NULL似乎什么都不做。我希望它在队列清空后立即中断,如何实现这一点

我还想知道,如何实现运行时版本的节点数?我认为C不支持数组的动态实例。我应该声明一个非常大的数组并使用它吗

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct node {
    int data;
    struct node* next;
};

void add(struct node **bag, int data) {
    struct node *newnode = malloc(sizeof(struct node));
    newnode->data = data;
    newnode->next = *bag;
    *bag = newnode;
}

int V;
struct node *adj[7];
bool marked[7];
int edgeTo[7 * 6];

void initialize() {
    int i = 0;
    for (i = 0; i < 7; ++i) {
        adj[i] = malloc(sizeof(struct node));
        marked[i] = false;
    }
}

void addEdge(int v, int w) {
    add(&adj[v], w);
    add(&adj[w], v);
}

void dfs(int v) {
    printf("%d  ", v);
    marked[v] = true;
    struct node *x = adj[v];
    while (x != NULL) {
        int w = x->data;
        if (marked[w] == false) {
            dfs(w);
        }
        x = x->next;
    }
}

int main(int argc, char **argv) {

    initialize();
    addEdge(0, 1);
    addEdge(0, 2);
    addEdge(0, 5);
    addEdge(1, 4);
    addEdge(3, 2);
    addEdge(3, 4);
    addEdge(3, 5);
    addEdge(3, 6);
    addEdge(5, 2);
    addEdge(6, 0);
    addEdge(6, 4);
    dfs(0);

    printf("done");
    return 0;
}
#包括
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
无效添加(结构节点**包,整数数据){
结构节点*newnode=malloc(sizeof(结构节点));
新建节点->数据=数据;
新建节点->下一步=*行李;
*bag=newnode;
}
INTV;
结构节点*adj[7];
布尔标记[7];
int edgeTo[7*6];
void initialize(){
int i=0;
对于(i=0;i<7;++i){
adj[i]=malloc(sizeof(struct node));
标记为[i]=假;
}
}
无效补遗(整数v,整数w){
添加(&adj[v],w);
添加(&adj[w],v);
}
无效dfs(整数v){
printf(“%d”,v);
标记为[v]=真;
结构节点*x=adj[v];
while(x!=NULL){
int w=x->数据;
如果(标记为[w]==false){
dfs(w);
}
x=x->next;
}
}
int main(int argc,字符**argv){
初始化();
增补(0,1);
增补(0,2);
增补(0,5);
增编(1,4);
增编(3,2);
增编(3,4);
增编(3,5);
增编(3,6);
增编(5,2);
增补(6,0);
增编(6,4);
dfs(0);
printf(“完成”);
返回0;
}

您没有正确编码初始化方法。确保初始化next to null
adj[i]->next=null

void initialize() {
    int i = 0;
    for (i = 0; i < 7; ++i) {
        adj[i] = (node*)malloc(sizeof(struct node));
        marked[i] = false;
        adj[i]->data = 0;
        adj[i]->next = NULL;
    }
}
void initialize(){
int i=0;
对于(i=0;i<7;++i){
adj[i]=(node*)malloc(sizeof(struct node));
标记为[i]=假;
adj[i]->数据=0;
adj[i]->next=NULL;
}
}

您没有正确编码初始化方法。确保初始化next to null
adj[i]->next=null

void initialize() {
    int i = 0;
    for (i = 0; i < 7; ++i) {
        adj[i] = (node*)malloc(sizeof(struct node));
        marked[i] = false;
        adj[i]->data = 0;
        adj[i]->next = NULL;
    }
}
void initialize(){
int i=0;
对于(i=0;i<7;++i){
adj[i]=(node*)malloc(sizeof(struct node));
标记为[i]=假;
adj[i]->数据=0;
adj[i]->next=NULL;
}
}

您没有正确编码初始化方法。确保初始化next to null
adj[i]->next=null

void initialize() {
    int i = 0;
    for (i = 0; i < 7; ++i) {
        adj[i] = (node*)malloc(sizeof(struct node));
        marked[i] = false;
        adj[i]->data = 0;
        adj[i]->next = NULL;
    }
}
void initialize(){
int i=0;
对于(i=0;i<7;++i){
adj[i]=(node*)malloc(sizeof(struct node));
标记为[i]=假;
adj[i]->数据=0;
adj[i]->next=NULL;
}
}

您没有正确编码初始化方法。确保初始化next to null
adj[i]->next=null

void initialize() {
    int i = 0;
    for (i = 0; i < 7; ++i) {
        adj[i] = (node*)malloc(sizeof(struct node));
        marked[i] = false;
        adj[i]->data = 0;
        adj[i]->next = NULL;
    }
}
void initialize(){
int i=0;
对于(i=0;i<7;++i){
adj[i]=(node*)malloc(sizeof(struct node));
标记为[i]=假;
adj[i]->数据=0;
adj[i]->next=NULL;
}
}


简单地说,您的程序充满了内存泄漏。为什么要分配两次内存?不要为
adj
分配内存,也要记住在分配后释放它。如果你是C新手,在编写(或从别处复制粘贴)这样的代码之前,你应该学习更多关于内存管理的知识。对于动态数组,还要检查C中的链表。请解释预期的输出是什么以及您得到的结果是什么。当我运行此命令时,我得到:
0 6 4 3 5 2 1 done
这不是您想要的吗?很快,您的程序充满了内存泄漏。为什么要分配两次内存?不要为
adj
分配内存,也要记住在分配后释放它。如果你是C新手,在编写(或从别处复制粘贴)这样的代码之前,你应该学习更多关于内存管理的知识。对于动态数组,还要检查C中的链表。请解释预期的输出是什么以及您得到的结果是什么。当我运行此命令时,我得到:
0 6 4 3 5 2 1 done
这不是您想要的吗?很快,您的程序充满了内存泄漏。为什么要分配两次内存?不要为
adj
分配内存,也要记住在分配后释放它。如果你是C新手,在编写(或从别处复制粘贴)这样的代码之前,你应该学习更多关于内存管理的知识。对于动态数组,还要检查C中的链表。请解释预期的输出是什么以及您得到的结果是什么。当我运行此命令时,我得到:
0 6 4 3 5 2 1 done
这不是您想要的吗?很快,您的程序充满了内存泄漏。为什么要分配两次内存?不要为
adj
分配内存,也要记住在分配后释放它。如果你是C新手,在编写(或从别处复制粘贴)这样的代码之前,你应该学习更多关于内存管理的知识。对于动态数组,还要检查C中的链表。请解释预期的输出是什么,以及您得到的结果是什么。当我运行此命令时,我得到:
0643552 1 done
这不是您想要的吗?