Рекурсивно печатать единый связанный список в C - PullRequest
0 голосов
/ 07 апреля 2020

Я должен работать рекурсивно над одним круглым связанным списком в C, моя проблема в том, что я рекурсивен, я не могу распечатать список правильно, и у меня возникли некоторые проблемы с доступом к клавише tmp-> на дисплее () функция (ошибка сегментации из-за несанкционированного доступа), когда я * * * * * * * более 1 элемента, и я хочу отобразить список позже. И tmp, и list объявляются как struct node* tmp = NULL; и struct node* list = NULL; Основной экстракт:

    case 8:
tmp = list;
        if (tmp->next == tmp)
    printf("\n%d\n", tmp->key);
else
            display (list, tmp);
        break;

Функция:

void display (struct node* head, struct node* tmp){

    if (head != NULL){
        if (tmp != head){
            printf ("%d ", tmp->key);
            tmp = tmp->next;
            display(head, tmp);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020
void display (struct node *head, struct node *this){

    if (!head) return;
    if (!this) return;

    printf ("%d ", this->key);

    if (this->next == head) return;
    display(head, this->next);
}

И, хвостовая рекурсия удаляется компилятором (g cc -O4 -S):


.globl  display
        .type   display, @function
display:
.LFB24:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rdi, %rbp
        pushq   %rbx
        .cfi_def_cfa_offset 24
        .cfi_offset 3, -24
        subq    $8, %rsp
        .cfi_def_cfa_offset 32
        testq   %rdi, %rdi
        je      .L1
        testq   %rsi, %rsi
        movq    %rsi, %rbx
        jne     .L4
        jmp     .L1
        .p2align 4,,10
        .p2align 3
.L12:
        testq   %rbx, %rbx
        je      .L1
.L4:
        movl    8(%rbx), %edx
        xorl    %eax, %eax
        movl    $.LC0, %esi
        movl    $1, %edi
        call    __printf_chk
        movq    (%rbx), %rbx
        cmpq    %rbp, %rbx
        jne     .L12
.L1:
        addq    $8, %rsp
        .cfi_def_cfa_offset 24
        popq    %rbx
        .cfi_def_cfa_offset 16
        popq    %rbp
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
.LFE24:
        .size   display, .-display
0 голосов
/ 07 апреля 2020

Проект предполагает, что tmp должен указывать на существующий узел в списке.

Если tmp равно NULL, вам придется проверить это условие в display(), чтобы избежать ошибка сегментации.

Вы также захотите проверить, является ли tmp NULL перед этим кодом:

        if (tmp->next == tmp)
...