c - 在图中删除/插入顶点的问题
问题描述
我试图在 C 中使用数组来存储顶点和邻接矩阵来存储边来实现图形。
顶点都是“命名的”,名称是它们在数组中的索引。例如,如果我通过给它索引“2”来添加顶点,它将被放置在数组的第三个位置,这样如果我想检查矩阵中的两个顶点是否相邻,它可以在 O(1) 中完成。
如果数组已满,我将进行重新分配以增加其大小,以便每次添加都成功。
嗯,有一些问题。
如果我删除一个节点怎么办?数组中会有未使用的空间,所以很浪费内存。(我不能移动所有其他顶点,因为可能会发生名为“10”的顶点将移动到不同的位置,所以如果我想检查节点“10”的相邻节点,结果将是另一个节点的相邻节点)
如果我添加一个名为“50”的节点并且数组长度只有 10 怎么办?我必须分配一个至少有 51 个位置的数组,并且会有很多未使用的空间。
您有任何提示或解决方案吗?
解决方案
不要使用数组。使用双链表。这样,您可以随意添加和删除节点。
这是一个粗略的例子:
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;
}
推荐阅读
- python - 循环数据框以通过递增值来移动列
- python - 循环 JSON 到附加 CSV 的多文件处理
- python - 合并列表列表中的嵌套列表
- php - Apache 级别的隐藏规则?
- r - R中的do()函数
- amazon-web-services - 如何在 AWS Parameter Store 中存储密码
- powershell - 重命名子文件夹时出现 PowerShell 错误
- json - 将餐厅菜单数据转换为 json
- python-3.x - 抓取时提取号码
- tensorflow - How to access Spark DataFrame data in GPU from ML Libraries such as PyTorch or Tensorflow