当前位置: 首页 > 知识库问答 >
问题:

使用递归反向打印链表数据时出现分段错误

卓俊晖
2023-03-14
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
        char c;
        struct node *next;
} node_t;

node_t *head = NULL;

void insert_list(node_t *node)
{
    static node_t *temp = NULL;
    if (!head) {
        head = node;
        //temp = node;
    }
    else {
        temp->next = node;
    }
    temp = node;

}

void create_list(char c)
{
    node_t *temp = NULL;
    temp = malloc(sizeof(node_t));
    if (temp) {
        temp->c = c;
        temp->next = NULL;
        insert_list(temp);
    }
    else
        return;
}

void print_list_reversely(node_t *temp)
{
    if (!temp)
        return;
    //print_list_reversely(temp->next); /* Working piece */
    temp = temp->next; /* This and next line together*/
    print_list_reversely(temp); /* Causing SEGFAULT */
    printf("data is %c\n", temp->c);
    return;
}

int main()
{
    create_list('a');   
    create_list('b');   
    create_list('c');
    print_list_reversely(head);
    return 0;
}

Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40      if (!temp)
(gdb) p temp
$5 = (node_t *) 0x0
(gdb) n
41          return;
(gdb) n
47  }
(gdb) n
print_list_reversely (temp=0x602050) at create.c:45
45      printf("data is %c\n", temp->c);
Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40      if (!temp)
(gdb) p temp
$3 = (node_t *) 0x0
(gdb) n
41          return;
(gdb) n
47  }
(gdb) 
print_list_reversely (temp=0x0) at create.c:45
45      printf("data is %c\n", temp->c);

共有1个答案

魏彦
2023-03-14

认为您处于最后一个节点。

//temp = temp->next; /* This and next line together*/
//print_list_reversely(temp); /* Causing SEGFAULT */
printf("data is %c\n", temp->c);

您将TMP赋给null,并尝试打印它,导致null指针取消引用。

我认为你有以下列表

1->2->NULL
print_list_reversely(1)
           tmp = [2]
                 --->      print_list_reversely(2)
                           tmp = [NULL]
                                          --->      print_list_reversely(NULL)
                                                    return;
                           print(null->c) //Seg fault
 类似资料:
  • 我试图以相反的顺序打印一个链表,但实际上没有使用递归进行反转,但我的输出结果非常奇怪。看起来我的代码基本上选择了第一个节点,并在打印完链表的其余部分(按原始顺序)后将其打印出来。我所写的代码(据我所知)是正确的,并且与internet上解决此问题的代码相匹配。 这是我的代码: 以下是节点类: 这是我给出的输入,然后是输出: 这里发生的另一个奇怪的事情是,如果我改变递归的条件,假设我这样做: 然后是

  • 还缺少的是将最后一个节点的next赋值为NULL。 在任何世界里,像这样的东西会起作用吗?它给出了一个运行时/分段错误。

  • 我在Hackerrank上解决反向挑战的指纹 方法接受一个参数-链表的头部。您不应该从stdin/console中读取任何输入。头部可能是空的,所以不应该打印任何东西。按照与stdout/console相反的顺序打印链表的元素(使用printf或cout),每行一个。 NB:节点的结构为struct Node{int data;struct Node*next;}

  • 我做了一个使用递归方法反转单链表的函数。然而,我在执行下面的代码时遇到了一些困难: 我应该如何在ReverseCursive函数/方法中传递第二个参数,以便执行它? 作为第二个参数,我想简单地传递链表的头节点。但是我不知道如何从类的init方法中获取头节点linked_list 我试了几件事,但都解决不了。也许我不太擅长OOP概念。有人能帮我解决这个问题吗?