为什么我会得到;分段错误“;尝试在带有标题的双链接列表中插入元素时?C语言

为什么我会得到;分段错误“;尝试在带有标题的双链接列表中插入元素时?C语言,c,header,segmentation-fault,doubly-linked-list,C,Header,Segmentation Fault,Doubly Linked List,编辑1:忘了把一些东西翻译成英语。现在修好了。 编辑2:标题实例 我开始研究双链接列表,但在列表的开头或结尾插入项目时遇到了问题 重要提示:我正在使用标题来完成此操作。这样做很重要,因为通常的插入已经掌握 谢谢 要在开头插入的函数: void beginning_insert(ELEMENT *list, HEADER *l, int value) { ELEMENT * p = malloc(sizeof(ELEMENT)); p -> info = value;

编辑1:忘了把一些东西翻译成英语。现在修好了。 编辑2:标题实例

我开始研究双链接列表,但在列表的开头或结尾插入项目时遇到了问题

重要提示:我正在使用标题来完成此操作。这样做很重要,因为通常的插入已经掌握

谢谢

要在开头插入的函数:

void beginning_insert(ELEMENT *list, HEADER *l, int value)
{
    ELEMENT * p = malloc(sizeof(ELEMENT));
    p -> info = value;
    p -> next = l -> head;
    p -> previous = NULL;
    l -> head = p;
    if(l -> tail == NULL)
    {
        l -> tail = l -> head;
    }
    else
    {
        (((l -> head) -> next) -> previous) = p;
    }
    l -> number_of_nodes++;

    list = p;
}
要在末尾插入的函数:

ELEMENT * end_insert(HEADER *l, int value)
{
    ELEMENT * new = malloc(sizeof(ELEMENT));
    new -> info = valor;
    new -> next = NULL;
    new -> previous = l -> tail;
    if(l-> head == NULL)
    {
        l -> head = new;
    }
    else
    {
        l -> tail -> next = new;    
    }
    l -> tail = new;
    l -> number_of_nodes++;


    return new;
}
使用的结构:

typedef struct element
{
    int info;
    struct element * next;//control
    struct element * previous;//control

} ELEMENT;

typedef struct header   //control
{
    ELEMENT * head;
    int number_of_nodes;
    ELEMENT * tail;

} HEADER;


//Header instance
HEADER * start_header()
{
    HEADER *l;
    l = malloc(sizeof(HEADER));

    l -> number_of_nodes = 0;
    l -> head = NULL;
    l -> tail = NULL;

    return l;
}

为了更好地理解双链接列表,我建议您避免使用标题

相反,你应该使用这样的东西

ELEMENT* go_start(ELEMENT* l)
{
      while (l->prev)
          l = l->prev;
      return l;
}

ELEMENT* go_end(ELEMENT* l)
{
      while (l->next)
          l = l->next;
      return l;
}
一旦这对你有意义,你应该能够轻松地推动一个新的元素

你的主菜应该非常简单,没有malloc:

int main()
{
     ELEMENT* list;

     list = push_top(list, 18);
     list = push_bottom(list, 18);
     list = push_top(list, 18);

     list = go_start(list);

     while (l->next)
     {
          printf("%d\n", l.info);
     }

     return (count_elem(list));
}
如果您可以运行此main并获得预期的输出,那么您对链表的理解应该很好;)

玩得开心

PS:您的seg故障可能来自您的else状况。您的指针可能走得太远了。

问题已解决。 代码工作正常,调用时出现问题

HEADER * header = start_header();
以前,这种做法是错误的:
HEADER=start_HEADER()

在调试器中逐步执行…向我们展示如何初始化标头实例。您是否在标头中将
head
tail
初始化为NULL?
((l->head)->prox)->ant)
这是什么?什么是
prox
?@paddy就在那里,我编辑了问题.Thks作为提示。事实上,我自己已经很好地理解了双链接列表。但是下一步是使用header.while()循环不循环。