如何初始化双向链表中的尾指针,使其不会出现分段错误

问题描述 投票:0回答:1

现在我创建了一个循环来为双向链表创建 25 个节点。通过在主函数中将头指针初始化为 NULL,现在

forward_traversing
show_first
函数可以按预期工作。但是尾部值不能初始化为 NULL,我不知道要分配什么或在这段代码中更改什么以允许
backward_traversing
show_last
函数工作。

在调试过程中,它会在函数中抛出“分段错误”异常:-

backward_traversal
show_last.

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int value;
    struct Node *next_link;
    struct Node *prev_link;
} Node;

Node *create_node(int value)
{
    Node *new_node = malloc(sizeof(Node));
    new_node->value = value;
    new_node->next_link = NULL;
    new_node->prev_link = NULL;

    return new_node;
}

void forward_traversing(Node *head)
{
    Node *temp = head;

    while (temp != NULL)
    {
        printf("%d ", temp -> value);
        temp = temp->next_link;
    }
    printf("\n");
}

void backward_traversing(Node *tail)
{
    Node *temp = tail;

    while (temp != NULL)
    {
        printf("%d ", temp->value);
        temp = temp->prev_link;
    }
    printf("\n");
}

void show_first(Node *head)
{
    printf("%d is the first value\n", head->value);
}

void show_last(Node *tail)
{
    printf("%d is the last value\n", tail->value);
}

int main()
{
    Node *head = NULL , *temp = NULL , *tail = NULL;

    for (int i = 25; i >= 0; i--){
        temp = create_node(i);
        temp -> next_link = head;
        temp -> prev_link = tail;
        head = temp;
    }
    
    forward_traversing(head);
    backward_traversing(tail);
    show_first(head);
    show_last(tail);

    free(head);
    free(tail);
    free(temp);
    
    return 0;
}

我目前正在尝试制作几个函数以在开始、结束和引用另一个节点时插入,也许以某种方式使我的制作节点过程自动化。

对于操作系统,我有 Windows 11,编译器是 Vs Code 中的 GNU 默认编译器

c loops for-loop data-structures doubly-linked-list
1个回答
0
投票

当您的代码将新元素添加到列表的前面时,您应该仅在插入第一个元素时设置

tail
。所以:

代替:

temp -> prev_link = tail;

做:

temp -> prev_link = NULL;
if (i == 25) tail = temp; // First element
© www.soinside.com 2019 - 2024. All rights reserved.