为什么我在尝试在带有标题的双向链表中插入元素时遇到"Segmentation faults"?C 语言



编辑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;
}

一旦这对您有意义,您应该能够轻松推送新的 elem。

你的主菜应该保持非常简单,里面没有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("%dn", l.info);
     }
     return (count_elem(list));
}

如果你可以运行这个 main 并获得预期的输出,你对链表的理解应该是很好的;)

玩得愉快

PS:您的赛格故障可能来自您的其他条件。你可能在指针上走得太远了。

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

HEADER * header = start_header();

以前,它以错误的方式完成: HEADER header = start_header();

相关内容

  • 没有找到相关文章