C 在递归函数中使用while

C 在递归函数中使用while,c,recursion,linked-list,C,Recursion,Linked List,为了显示链表,我使用了一个递归函数。由于while循环,它运行了无限循环。 当替换为“如果”时,程序工作正常,没有任何问题 正在寻找有关使用的专家意见 当 在递归函数中 带while的递归函数 int display(node *curr){ if((curr->next != NULL) ){ //<--replace "if" with "while" and it runs infinite loop printf

为了显示链表,我使用了一个递归函数。由于while循环,它运行了无限循环。 当替换为“如果”时,程序工作正常,没有任何问题

正在寻找有关使用的专家意见

在递归函数中


带while的递归函数

     int display(node *curr){
             if((curr->next != NULL) ){ //<--replace "if" with "while" and it runs infinite loop
             printf("%d :: ",curr->data);
             display(curr->next);
             }
             return 0;
      }
int显示(节点*curr){
如果((curr->next!=NULL)){//data);
显示(当前->下一步);
}
返回0;
}

使用创建和显示功能完成代码

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>

struct node {
        int data;
        struct node *next;
};

typedef struct node node;

int create(node *head);
int display(node *head);

int main(int argc, char *argv[]){
        int ch,n=0;

        node *head,*tail,*current;
        head=(node*)malloc(sizeof(node));
        create(head);
        printf("\n");
        display(head);

        return 0;
}

int create(node *curr){
            int data;
            node *next;
            printf("Enter the Data Value (Enter -1 to Finish): ");
            scanf("%d",&data);
                    curr->data=data;
            if(data == -1)
            {
                    curr->next=NULL;

                    //return curr;
            }
            else
            {
                    curr->next=(node*)malloc(sizeof(node));
                    create(curr->next);
            }

            return 0; }

    int display(node *curr){
            if((curr->next != NULL) ){
                    printf("%d :: ",curr->data);
                    display(curr->next);
            }
            return 0; }
#包括
#包括
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
typedef结构节点;
int创建(节点*头部);
int显示(节点*头部);
int main(int argc,char*argv[]){
int ch,n=0;
节点*头、*尾、*电流;
头=(节点*)malloc(节点大小);
创建(头);
printf(“\n”);
显示器(头部);
返回0;
}
int创建(节点*curr){
int数据;
节点*下一步;
printf(“输入数据值(输入-1以完成):”;
scanf(“%d”和数据);
当前->数据=数据;
如果(数据==-1)
{
当前->下一步=空;
//返回货币;
}
其他的
{
curr->next=(node*)malloc(sizeof(node));
创建(当前->下一步);
}
返回0;}
整数显示(节点*当前){
如果((当前->下一步!=NULL)){
printf(“%d::”,curr->data);
显示(当前->下一步);
}
返回0;}

很简单……

你得到了一个无限循环,因为你从来没有在列表中前进,那就是:l=l->next();因此,您永远不会达到null

为什么不能使用
while(curr->next!=null)
循环索引并打印列表,是因为对于函数
display()
的每次调用,
curr->next
的值都是常量。这似乎会成功地打印链接列表中的数据,然后不确定地打印倒数第二个数据点,因为最后一个数据点的比较将持续失败

正如Ritwick Dey所建议的,使用

int display(node *curr) 
{ 
    while (curr) 
    {
        printf("%d",curr->data);
        curr = curr->next;
    }
}

应该为你工作;通过更改当前节点的指针,可以在每次迭代时修改
循环的条件。值
NULL
将导致此检查失败,因此您可以打印最终数据点而不会出现问题。此实现还有一个额外的好处,即避免了递归函数调用的开销。

虽然问题还不完全清楚,但我想您是在问为什么在将'while'语句更改为'if'之后代码还能工作。解释如下:

1.)您没有推进下一个指针

2.)假设您已经提升了下一个指针,即使代码将无限运行

一次简单的试运行就足够了:

让我们举一个例子,假设正整数的单链接列表如下所示:

8-->9-->7-->NULL 8-->9-->7-->空 接下来是递归树,它说明了代码在什么条件下无限运行

显示器(8)
而(8->下一步)->显示(9)
        而(9->下一步)->显示(7)
               while(7->next)->display(NULL)--返回

从display(NULL)返回后,对于这种情况,它将无限运行:
而(7->next)--->display(NULL)将继续循环

while(7->next)---->display(NULL)
Ritwick的回答中已经指出了显示链接列表的正确函数。

而((curr->next!=NULL))
如果
curr->next
在循环内部没有变化(你的看起来没有变化),那么当然这是一个无限循环。我真的不知道你在问什么…我想我可以使用一些向下的投票来清楚地了解在递归中使用while:D while(7->next)---->display(NULL)