我应该递归地处理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
应该指向列表中的现有节点。
如果tmp
是NULL
,则必须在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