如何链接三个连续内存块

时间:2015-02-22 07:53:36

标签: c pointers

在我的下面代码中:

typedef struct node {
    key_t    key;
    struct node *left;
    struct node *right;
} text_t;

void swapping(text_t *txt, char *new_line)
{
    printf("enter\n");
    text_t *tree;
    tree=txt;
    char *tmp;

    if(tree->right!=NULL){
        printf("inside\n");
        tmp=(char *)tree->left;

        tree->left=(text_t *) new_line;
        ++tree;

        swapping(tree,tmp);
    }
}

int main()
{
    char text[256];
    char text_new[256];
    char *new_line, *nl,*object;

    new_line=strcpy(text,"hello");
    nl=strcpy(text_new,"world");

    while (*new_line) 
        printf("%c",*new_line++);
    printf("\n");

    text_t *tmp,*tree;
    tmp=(text_t *) malloc( 256 * sizeof(text_t) );

    tree=tmp;

    tmp->key=1;
    tmp->left=(text_t *) new_line;
    tmp->right=++tmp;

    --tmp;

    if(tmp->right==NULL)
    {
        printf("its NULL at key %d \n",tmp->key);
    }

    tmp++;

    tmp->key=2;
    tmp->left=(text_t *) new_line;
    tmp->right=++tmp;

    --tmp;

    if(tmp->right==NULL)
    {
        printf("its NULL at key %d \n",tmp->key);
    }
    tmp++;

    tmp->key=3;
    tmp->left=(text_t *) new_line;
    tmp->right=++tmp;

    tmp->key=4;
    tmp->left=(text_t *) new_line;
    tmp->right=NULL;

    swapping(tree,nl);

    while(tree->right!=NULL){
        printf("the element at key- %d is ", tree->key);
        object=(char *)tree->left;
        while(*object)
        printf("%c",*object++);
        printf("\n");
        tree=tree->right;
    }

    return(0);
}

我需要将3个节点(text_t)彼此相邻(如链接列表)。我使用正确的节点指针指向下一个节点,最后一个节点指向NULL。但似乎这并没有像预期的那样运作。在我分配tmp-> right = ++ tmp之后,检查tmp-> right == NULL,它会传递所有键= 1到4.我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

当你这样做时

tmp->right=++tmp;

首先增加tmp,然后分配它。然后你做一个tmp--并找到正确的指针为null。当然它是空的。 (执行此语句包括首先评估正确的部分,在分配之前递增tmp,然后分配给现在递增的变量tmp,使用' right'成员进行偏移)您应该已经完成​​:

tmp->right= (tmp+1);

答案 1 :(得分:0)

你的代码很长,很复杂而且完全错误。它没有正确缩进,导致进一步的混乱。

有很多错误,但这里有一个很大的错误:你不在结构中分配字符串,而只是在你继续时复制每个节点中new_line的值。所有节点都指向同一位置。 new_line指向本地字符数组'\0'中间的text,超过第五个字符。使用strdup在列表中分配字符串并简化代码。

您应该使用具有适当类型的类似列表的结构,而不是使用强制转换来弯曲树结构:

typedef struct text_t {
    key_t key;
    char *object;
    struct text_t *next;
} text_t;

顺便说一句,您应该测试malloc返回值。

此外,swapping函数名称错误,执行效率非常低且令人困惑的任务,使用尾递归而不是简单的循环。您可能只是想将一个节点插入,追加或添加到列表中,但代码是如此复杂,甚至无法确定您要解决的问题。