【发布时间】:2015-09-24 09:58:19
【问题描述】:
我正在尝试从二叉树创建一个链表。
问题是,是否可以使用简单链表代替双向链表?
我试过了:
typedef struct arvbin* ABin;
typedef struct arvbin
{
int value;
ABin right;
ABin left;
} arvb;
typedef struct slist
{
int value;
struct slist* next;
} *SList;
void preorder(ABin tree, SList *l)
{
if(tree)
{
(*l)->value = tree->value;
(*l)->next = (SList) malloc(sizeof(struct slist));
l = &((*l)->next);
printf("tese\n");
preorder(tree->left, l);
preorder(tree->right, l);
}
return;
}
当然只有树的一部分被转换了。
主调用
int main(){
SList l = (SList) malloc(sizeof(struct slist));
preorder(tree, &l);
SList l = (SList) malloc(sizeof(struct slist));
preorder(tree, &l);
printf("height tree. %d \n", height(clone));
print_t(tree);
plist(l);
}
谢谢你。c
【问题讨论】:
-
当然可以使用单链表代替双链表。为什么不呢?问题不在于数据结构,而在于您的遍历实现。例如,相同的
l值被传递给左右遍历。并且不清楚 mallocingnext->next的意图是什么,因为它似乎没有被使用。 -
能说明ABin和SList的定义吗?
-
@Ediac 添加到帖子中。谢谢。
-
@AlanAu 抱歉,这是我尝试修改代码的一次尝试,删除了该行。是的,代码有缺陷,只是表明我已经尝试过一些东西。不只是在自己尝试之前寻求帮助
-
虽然您的
main()非常小,但首字母缩略词 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 包含“完整”一词,并且您的代码未显示已创建的树,因此无需转换为一个列表。您的问题是,在您爬下节点下方树的左侧之后,您没有调整l以指向找到的内容的末尾,因此树的右侧会覆盖左侧所做的.您需要查看如何将节点插入列表。我建议对任务使用单独的函数。
标签: c tree linked-list binary-tree