ReverseList函数失效问题:单向链表反转未生效的原因排查
为啥链表没反转?问题出在这
最关键的坑:你调用了两次反转函数
看你的调用代码,在判断分支里连续调用了两次ReverseList(&L[i_num]):
if(ReverseList(&L[i_num]) == INFEASIBLE) printf("The list doesn't exist!\n"); else if(ReverseList(&L[i_num]) == ERROR) printf("The list is empty!\n"); else printf("Success!\n");
第一次调用已经把链表反转好了,但第二次调用直接把反转后的链表又转回去了——等于做了两次反转,结果和没转一样,这就是你觉得链表没变化的核心原因。
还有个小问题:反转函数没处理空链表
你的ReverseList函数里,只判断了指针L是否为空,没判断链表本身(*L)是否为空。这会导致空链表调用函数时,不会返回ERROR,而是直接返回OK,所以你代码里的else if分支永远不会触发,不符合你原本的错误提示逻辑。
怎么改?
- 先存返回值,再判断:把函数调用的结果先存起来,避免重复调用:
case 15://ReverseList status ret = ReverseList(&L[i_num]); if(ret == INFEASIBLE) printf("The list doesn't exist!\n"); else if(ret == ERROR) printf("The list is empty!\n"); else printf("Success!\n"); getchar(); getchar(); break;
- 给反转函数补上空链表判断:
status ReverseList(LinkList *L) //reverse the list { if(L == NULL) { return INFEASIBLE; } if(*L == NULL) // 新增:判断链表是否为空 { return ERROR; } LinkList prev=NULL; LinkList cur=*L; LinkList next=NULL; while(cur) { next=cur->next; cur->next=prev; prev=cur; cur=next; } *L=prev; return OK; }
内容的提问来源于stack exchange,提问作者Konrad Gerrens
相关产品推荐
相关产品推荐

