在C中递归地打印环状单链表



我应该递归地处理C中的循环单链表,我的问题是,由于递归,我无法正确打印列表,并且当我推送超过1个元素时,在访问display((函数中的tmp->键时遇到了一些问题(由于非法访问而导致分段错误(,我想稍后显示列表。tmp和list都声明为struct node* tmp = NULL;struct node* list = NULL;主要提取物:

case 8:
tmp = list;
if (tmp->next == tmp)
printf("n%dn", 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);
}
}
}

设计建议tmp应该指向列表中的现有节点。

如果tmpNULL,则必须在display()中检查该条件,以避免出现分段错误。

您还需要在以下代码之前检查tmp是否为NULL

if (tmp->next == tmp)
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);
}

并且,编译器(gcc-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

相关内容

  • 没有找到相关文章

最新更新