在我的下面代码中:
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.我在这里做错了吗?
答案 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
函数名称错误,执行效率非常低且令人困惑的任务,使用尾递归而不是简单的循环。您可能只是想将一个节点插入,追加或添加到列表中,但代码是如此复杂,甚至无法确定您要解决的问题。