C++ 在区间树中插入链表元素

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 *

我使用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 *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
    1
    ,“l”和“I”。使用有意义的名称。你知道6个月后l、u、h是什么吗?他们没有被评论,所以你必须解释它们。“我不明白在上述两种情况下段错误发生在哪里”-也许你应该问你的调试器-它肯定知道。@MartinJames人们认为我从未调试过代码,只是把它发布在编程平台上,让一些人讽刺地评论一下me@user3600483"人们认为,我从来没有调试过代码,我在你的帖子中看不到任何测试/调试结果/结论的证据。也许你只是忘了把它们抄进来?你是对的。我开始在每行之后使用print语句检查程序崩溃的地方。尽管您的建议是正确的,但在第一种情况下,当children为NULL时,我的程序并没有崩溃,而是在head->top=a语句中崩溃。但我不明白为什么?如果你能就此提出一些建议,那就太好了。
    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)