C++ 在区间树中插入链表元素
我使用struct创建了一个区间树。列表中有要插入的键。定义如下C++ 在区间树中插入链表元素,c++,c,tree,linked-list,segmentation-fault,C++,C,Tree,Linked List,Segmentation Fault,我使用struct创建了一个区间树。列表中有要插入的键。定义如下 l-下限 u-上限 h-树高 链接列表的顶端。 左和右分别指向左子对象和右子对象 #include<stdio.h> #include<stdlib.h> #include<math.h> struct list{ int data; struct list *next; }; struct node{ int l,u,h; struct list *
- l-下限
- u-上限
- h-树高
- 链接列表的顶端。
左和右分别指向左子对象和右子对象
#include<stdio.h> #include<stdlib.h> #include<math.h> struct list{ int data; struct list *next; }; struct node{ int l,u,h; struct list *top; struct node *left,*right; }; int lower[100],upper[100],size; struct node *root; }
我不了解在上述两种情况下,节段故障发生在何处。有人有解决方案吗?在这两种方法中,您调用
,而不检查插入间隔树(head->left,i)
是否为空。与head->left
相同。这意味着调用head->right
时使用insert\u interval\u tree
,并且没有在那里选中它。这就是它崩溃的原因 还有其他错误。例如,在第二种方法中,在head==NULL
中修改insert_list
,但是head
没有作为引用传递,因此除了分配从未释放的内存外,这没有任何效果 如果要通过引用传递head
,请按如下方式声明函数:head
void insert_list(list *&head,int i)
C语言和C++语言是不同的语言。看起来像C,但不包含推荐的样式。选择一种语言!请不要命名任何变量
。很难区分l
和l
,“l”和“I”。使用有意义的名称。你知道6个月后l、u、h是什么吗?他们没有被评论,所以你必须解释它们。“我不明白在上述两种情况下段错误发生在哪里”-也许你应该问你的调试器-它肯定知道。@MartinJames人们认为我从未调试过代码,只是把它发布在编程平台上,让一些人讽刺地评论一下me@user3600483"人们认为,我从来没有调试过代码,我在你的帖子中看不到任何测试/调试结果/结论的证据。也许你只是忘了把它们抄进来?你是对的。我开始在每行之后使用print语句检查程序崩溃的地方。尽管您的建议是正确的,但在第一种情况下,当children为NULL时,我的程序并没有崩溃,而是在head->top=a语句中崩溃。但我不明白为什么?如果你能就此提出一些建议,那就太好了。1
void insert_list(struct list *head,int i) { if(head==NULL) { head=(struct list *)malloc(sizeof(struct list)); head->data=i; head->next=NULL; } else { while(head->next!=NULL) head=head->next; head->next=(struct list *)malloc(sizeof(struct list)); head->next->data=i; head->next->next=NULL; } } void insert_interval_tree(struct node *head,int i) { if(i<(head->u) && i>=(head->l)) { insert_list(head->top,i); return; } else if(i<(head->l)) return insert_interval_tree(head->left,i); else return insert_interval_tree(head->right,i); }
struct node * create_interval_tree(int start,int end) { struct node *head=(struct node *)malloc(sizeof(struct node )); head->l=lower[(start+end)/2]; head->left=NULL; head->top=NULL; head->u=upper[(start+end)/2]; head->right=NULL; head->h=0; if(((start+end)/2)-start>0) head->left=create_interval_tree(start,(start+end)/2-1); if(end-((start+end)/2)>0) head->right=create_interval_tree((start+end)/2+1,end); return head; }
void insert_list(list *&head,int i)