gpt4 book ai didi

c - 从图表开始

转载 作者:行者123 更新时间:2023-11-30 14:24:36 26 4
gpt4 key购买 nike

我知道这听起来很天真,但是有人可以解释一下如何用 C 语言实现图表吗?我已经阅读了理论,但我无法摆脱图形编程的障碍。

<小时/>

如果有人能够解释如何使用邻接列表和邻接矩阵创建图形,以及如何在 C 代码中执行广度优先搜索和深度优先搜索并提供一些解释,我将非常感激

<小时/>

首先,我想告诉你,这不是作业。我真的很想学图表,但请不起家教。

最佳答案

我假设这里的图是顶点和边的集合。为此,您需要一个指向结构的指针数组。这是图的邻接列表表示。这些结构至少有一个值,即节点号和指向另一个结构的指针。在向图形插入新节点时,只需转到数组的适当索引并将节点推到开头。这是 O(1) 的插入时间。我的实现可能会帮助您了解它的真正工作原理。如果您具有良好的 C 语言技能,那么理解代码不会花费太多时间。

//  Graph implementation by adjacency list

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

#define MAX_SIZE 1000

typedef struct node{
int number;
struct node * next;
} Node;


// U is starting node, V is ending node
void addNode (Node *G[], int U, int V, int is_directed)
{
Node * newnode = (Node *)malloc(sizeof(Node));
newnode->number = V;
newnode->next = G[U];
G[U] = newnode;

// 0 for directed, 1 for undirected
if (is_directed)
{
Node * newnode = (Node *)malloc(sizeof(Node));
newnode->number = U;
newnode->next = G[V];
G[V] = newnode;
}
}

void printgraph(Node *G[], int num_nodes)
{
int I;
for (I=0; I<=num_nodes; I++)
{
Node *dum = G[I];
printf("%d : ",I);
while (dum != NULL)
{
printf("%d, ",dum->number);
dum =dum->next;
}
printf("\n");
}

}



void dfs (Node *G[], int num_nodes, int start_node)
{
int stack[MAX_SIZE];
int color[num_nodes+1];
memset (color, 0, sizeof(color));
int top = -1;
stack[top+1] = start_node;
top++;
while (top != -1)
{
int current = stack[top];
printf("%d ",current);
top--;
Node *tmp = G[current];
while (tmp != NULL)
{
if (color[tmp->number] == 0)
{
stack[top+1] = tmp->number;
top++;
color[tmp->number] = 1;
}
tmp = tmp->next;
}
}

}

void bfs (Node *G[], int num_nodes, int start_node)
{
int queue[MAX_SIZE];
int color[num_nodes+1];
memset (color, 0, sizeof (color));
int front=-1, rear=-1;
queue[rear+1] = start_node;
rear++;printf("\n\n");
while (front != rear)
{
front++;
int current = queue[front];
printf("%d ",current);

Node *tmp = G[current];
while (tmp != NULL)
{
if (color[tmp->number] == 0)
{
queue[rear+1] = tmp->number;
rear++;
color[tmp->number] = 1;
}
tmp = tmp->next;
}
}

}

int main(int argc, char **argv)
{
int num_nodes;
// For Demo take num_nodes = 4
scanf("%d",&num_nodes);
Node *G[num_nodes+1];
int I;
for (I=0; I<num_nodes+1 ;I++ )
G[I] = NULL;

addNode (G, 0, 2, 0);
addNode (G, 0, 1, 0);
addNode (G, 1, 3, 0);
addNode (G, 2, 4, 0);
addNode (G, 2, 1, 0);
printgraph( G, num_nodes);
printf("DFS on graph\n");
dfs(G, num_nodes, 0);
printf("\n\nBFS on graph\n");
bfs(G, num_nodes, 0);

return 0;
}

关于c - 从图表开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com