问题在图形中删除/插入顶点

时间:2019-05-26 15:15:49

标签: c graph

我正在尝试在C中使用数组存储顶点并使用邻接矩阵存储边的方式在C中实现图形。

所有顶点都是“命名”,name是它们在数组中的索引。例如,如果我通过给它赋予索引“ 2”来添加顶点,它将被放置在数组的第三位置,以便如果我想检查矩阵中两个顶点是否相邻,则可以在O(1)中完成。

如果数组已满,我将进行重新分配以增加其大小,以便每次添加成功。

嗯,有一些问题。

  • 如果删除节点该怎么办?阵列中将有未使用的空间,因此浪费了内存。 (我无法移动所有其他顶点,因为可能会发生名为“ 10”的顶点将移动到不同位置的情况,因此,如果我要检查节点“ 10”的相邻点,结果将是另一个节点的相邻点)

  • 如果我添加一个名为“ 50”的节点并且数组长度仅为10会怎样?我必须分配至少51个位置的数组,并且会有很多未使用的空间。

您有什么建议或解决方案吗?

1 个答案:

答案 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;
}