方形图L形实现

时间:2014-10-20 15:54:09

标签: c graph

如果我在这里,因为我谦虚的逻辑和调试技巧使我失望。

请原谅任何语法/拼写错误,我尽力做到最好,但这不是我的母语。

我实际上试图将图表/图表作为一组节点,包含每个节点的上,下,左,右节点和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形方式构建这种图形是我现在找到的唯一方法,但我对阅读其他方法感兴趣。

1 个答案:

答案 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()中的额外变量,而不是走图形来查找它?