我正在尝试在C中使用数组存储顶点并使用邻接矩阵存储边的方式在C中实现图形。
所有顶点都是“命名”,name是它们在数组中的索引。例如,如果我通过给它赋予索引“ 2”来添加顶点,它将被放置在数组的第三位置,以便如果我想检查矩阵中两个顶点是否相邻,则可以在O(1)中完成。
如果数组已满,我将进行重新分配以增加其大小,以便每次添加成功。
嗯,有一些问题。
如果删除节点该怎么办?阵列中将有未使用的空间,因此浪费了内存。 (我无法移动所有其他顶点,因为可能会发生名为“ 10”的顶点将移动到不同位置的情况,因此,如果我要检查节点“ 10”的相邻点,结果将是另一个节点的相邻点)
如果我添加一个名为“ 50”的节点并且数组长度仅为10会怎样?我必须分配至少51个位置的数组,并且会有很多未使用的空间。
您有什么建议或解决方案吗?
答案 0 :(得分:0)
不要使用数组。使用双向链接列表。这样,您可以随意添加和删除节点。
这是一个粗略的例子:
typedef struct node {
int vertex;
node prev;
node next;
} *node;
node *global;
void insert_node(node a)
{
global->next = a;
global->next->vertex = global->vertex + 10;
global->next->prev = global;
global = global->next;
}
void delete_node(node b)
{
while( global->prev )
global = global->prev;
while( global != b )
global = global->next;
global->prev->next = global->next;
global->next->prev = global->prev;
while( global->next )
global = global->next;
free(b);
}
node create_node(void)
{
node ret;
ret = malloc(sizeof(*ret));
memset(ret, 0, sizeof(*ret));
insert_node(ret);
return global;
}