为什么from_node和to_node的obj不符合预期

This commit is contained in:
建峰 2025-04-25 16:55:22 +08:00
parent 7ad5631aec
commit f63aa4db0a
2 changed files with 39 additions and 33 deletions

View File

@ -24,7 +24,7 @@ struct _graph_node
{ {
void* obj; void* obj;
struct _graph_node* next; struct _graph_node* next;
struct _graph_edge* edge; struct _graph_edge* edgehead;
bool visited; bool visited;
}; };

View File

@ -331,7 +331,7 @@ static struct _graph_node* graph_node_new(void* obj, uint32_t obj_size)
} }
new_node->obj = new_obj; new_node->obj = new_obj;
new_node->next = NULL; new_node->next = NULL;
new_node->edge = NULL; new_node->edgehead = NULL;
new_node->visited = false; new_node->visited = false;
return new_node; return new_node;
@ -347,10 +347,10 @@ static void greph_node_free(struct _graph_node** node)
(*node)->obj = NULL; (*node)->obj = NULL;
} }
if ((*node)->edge != NULL) if ((*node)->edgehead != NULL)
{ {
free((*node)->edge); free((*node)->edgehead);
(*node)->edge = NULL; (*node)->edgehead = NULL;
} }
free(*node); free(*node);
@ -359,7 +359,7 @@ static void greph_node_free(struct _graph_node** node)
} }
} }
static struct _graph_edge* graph_edge_new(void) static struct _graph_edge* graph_edge_new(void *target, uint32_t weight)
{ {
struct _graph_edge* new_edge = (struct _graph_edge*)malloc(sizeof(struct _graph_edge)); struct _graph_edge* new_edge = (struct _graph_edge*)malloc(sizeof(struct _graph_edge));
if (new_edge == NULL) if (new_edge == NULL)
@ -367,8 +367,8 @@ static struct _graph_edge* graph_edge_new(void)
return NULL; return NULL;
} }
new_edge->next = NULL; new_edge->next = NULL;
new_edge->weight = 0; new_edge->weight = weight;
new_edge->target = NULL; new_edge->target = target;
return new_edge; return new_edge;
} }
@ -463,18 +463,24 @@ static void graph_print(struct _graph* self)
cur = self->_head->next; cur = self->_head->next;
while (cur != NULL) while (cur != NULL)
{ {
struct _graph_edge* edge = cur->edge; if(cur->edgehead != NULL)
while (edge != NULL)
{ {
struct _graph_node* target = (struct _graph_node*)edge->target; // struct _graph_edge* edge = cur->edgehead->next;
struct _graph_edge* edge = cur->edgehead;
while (edge != NULL)
{
struct _graph_node* target = (struct _graph_node*)edge->target;
printf("from "); printf("from ");
self->print_obj(cur->obj); self->print_obj(cur->obj);
printf(" to "); printf(" to ");
self->print_obj(target->obj); self->print_obj(target->obj);
printf(": %d \n", edge->weight); printf(": %d \n", edge->weight);
edge = edge->next;
edge = edge->next;
}
} }
// self->print_obj(cur->obj); // self->print_obj(cur->obj);
cur = cur->next; cur = cur->next;
} }
@ -625,42 +631,42 @@ static bool graph_add_edge(struct _graph* self, void* from, void* to, uint32_t w
return false; return false;
} }
printf("print from and to obj start \n");
self->print_obj(from_node->obj);
self->print_obj(to_node->obj);
printf("print from and to obj end \n");
// from_node add edge // from_node add edge
struct _graph_edge* new_edge = graph_edge_new(); struct _graph_edge* new_edge = graph_edge_new(to_node, weight);
if (new_edge == NULL) if (new_edge == NULL)
{ {
return false; return false;
} }
new_edge->weight = weight; if (from_node->edgehead == NULL)
new_edge->target = to_node;
if (from_node->edge == NULL)
{ {
from_node->edge = new_edge; from_node->edgehead = new_edge;
} }
else else
{ {
new_edge->next = from_node->edge->next; new_edge->next = from_node->edgehead->next;
from_node->edge->next = new_edge; from_node->edgehead->next = new_edge;
} }
// if graph is undirected // if graph is undirected
struct _graph_edge* new_edge2 = graph_edge_new(); struct _graph_edge* new_edge2 = graph_edge_new(from_node, weight);
if (new_edge2 == NULL) if (new_edge2 == NULL)
{ {
return false; return false;
} }
new_edge2->weight = weight;
new_edge2->target = from_node;
if (to_node->edge == NULL) if (to_node->edgehead == NULL)
{ {
to_node->edge = new_edge2; to_node->edgehead = new_edge2;
} }
else else
{ {
new_edge2->next = to_node->edge->next; new_edge2->next = to_node->edgehead->next;
to_node->edge->next = new_edge2; to_node->edgehead->next = new_edge2;
} }
return true; return true;
@ -697,7 +703,7 @@ static bool graph_init(struct _graph* self, uint32_t obj_size)
} }
self->_head->visited = false; self->_head->visited = false;
self->_head->obj = NULL; self->_head->obj = NULL;
self->_head->edge = NULL; self->_head->edgehead = NULL;
self->_head->next = NULL; self->_head->next = NULL;
self->_destory = graph_destory; self->_destory = graph_destory;