如果我在这里,因为我谦虚的逻辑和调试技巧使我失望。
请原谅任何语法/拼写错误,我尽力做到最好,但这不是我的母语。
我实际上试图将图表/图表作为一组节点,包含每个节点的上,下,左,右节点和x,y位置。
为此,我决定在y轴上分配节点,然后在Bottomest右侧创建一个节点,然后迭代此过程,同时x<我的图表的大小。
然后,我释放了最后一个最有意义的节点,因为它超出了我想要构建的图形。 此后,我想链接我的图形中尚未链接到其相邻节点的元素。
当试图访问最右边的最底层节点的左边元素时,我得到一些段错误!
对于那些不清楚的人,我在尝试做什么(3 * 3图表):
http://imgur.com/bPi3Au2,kCInKDs#1
以及我到目前为止(3 * 3图表):
http://imgur.com/bPi3Au2,kCInKDs#0
这里是代码:(此文件是.h)
#include <stdlib.h>
typedef struct s_ftree
{
struct s_ftree *up;
struct s_ftree *bottom;
struct s_ftree *left;
struct s_ftree *right;
int x;
int y;
} t_ftree;
t_ftree *node_constructor(int x, int y)
{
t_ftree *node = (t_ftree*)malloc(sizeof(t_ftree));
node->x = x;
node->y = y;
node->up = NULL;
node->bottom = NULL;
node->left = NULL;
node->right = NULL;
return (node);
}
t_ftree *graph_constructor(int graph_size) /*Main fucnction, this is called from
a compiled .c file */
{
int x;
int y;
x = 0;
y = 0;
t_ftree *curr = node_constructor(0, 0);
while(x < graph_size)
{
while (y < graph_size)
{
curr->up = node_constructor(x, ++y);
curr->up->bottom = curr;
curr = curr->up;
}
while (--y > 0)
curr = curr->bottom;
x++;
curr->right = node_constructor(x, y);
curr->right->left = curr;
curr = curr->right;
}
--x;
curr = curr->left; /* Suppressing the last bottom right element */
free(curr->right);
curr->right = NULL;
while(--x > 0)
{
curr = curr->left; /* Segfault here !! */
}
/* other treatments here */
return (curr);
}
所以我试图接受一个未分配的元素,我不知道我是否错误地表达了我尝试制作图表的方式以及实际位置I&#39 ;当你指定curr-&gt; left to curr或者来自脑损伤的愚蠢错误时,我在进行:/
除此之外,以L形方式构建这种图形是我现在找到的唯一方法,但我对阅读其他方法感兴趣。
答案 0 :(得分:0)
我无法发现您最终要删除额外节点的方式或原因,但绝对可以避免这种情况。
另外,您是否考虑过首先构建所有节点,然后初始化所有链接?它暂时使用了更多的内存,但它可能更容易编写和推理。这样的事情,也许是:
t_ftree *graph_constructor(int graph_size) {
/* here and below, graph_size is assumed > 0 */
t_ftree **grid = malloc(graph_size * graph_size * sizeof(t_ftree *));
t_ftree *node00;
int x, y;
if (!grid) {
return NULL;
}
for (x = 0; x < graph_size; x += 1) {
for (y = 0; y < graph_size; y += 1) {
grid[x * graph_size + y] = node_constructor(x, y);
}
}
for (x = 0; x < graph_size - 1; x += 1) {
for (y = 0; y < graph_size; y += 1) {
grid[x * graph_size + y]->right = grid[(x + 1) * graph_size + y];
}
}
for (x = 1; x < graph_size; x += 1) {
for (y = 0; y < graph_size; y += 1) {
grid[x * graph_size + y]->left = grid[(x - 1) * graph_size + y];
}
}
for (x = 0; x < graph_size; x += 1) {
for (y = 0; y < graph_size - 1; y += 1) {
grid[x * graph_size + y]->up = grid[x * graph_size + y + 1];
}
}
for (x = 0; x < graph_size; x += 1) {
for (y = 1; y < graph_size; y += 1) {
grid[x * graph_size + y]->down = grid[x * graph_size + y - 1];
}
}
node00 = *grid;
free(grid);
return node00;
}
另请注意,虽然typedef
可能合理地存在于头文件(.h)中,并且您也可能将函数原型放在这样的头文件中,但函数实现应该在普通的C源文件中(.c) ),而不是在头文件中。
无论如何,如果您更喜欢构建图形的方法,那么为什么不至少保留一个指向节点(0,0)的外部指针作为函数graph_constructor()
中的额外变量,而不是走图形来查找它?