在递归函数中使用while

时间:2016-11-23 05:30:23

标签: c recursion linked-list

显示链表,我正在使用递归函数。由于while循环,它运行无限循环。 当用&#34替换时;如果"该计划没有任何问题。

寻找关于

使用的专家意见
  

,而

在递归函数中。

带有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;
      }

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

#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; }

4 个答案:

答案 0 :(得分:1)

strValue = Regex.Replace(strValue, "rgm.*?;1\\.", "");

简单......

答案 1 :(得分:1)

您无法使用while(curr->next != NULL)循环索引并打印列表的原因是因为对于函数display()的每次调用,curr->next的值都是常量。这似乎会成功打印链表中的数据,然后无限打印倒数第二个数据点,因为最后一个数据点的比较将不断失败。

按照Ritwick Dey的建议使用

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

应该适合你;通过更改当前节点的指针,您可以在每次迭代时修改while循环的条件。值NULL将导致此检查失败,因此您可以毫无问题地打印最终数据点。此实现具有避免递归函数调用的成本的额外好处。

答案 2 :(得分:1)

虽然这个问题还不完全清楚,但我认为您在更改&#39; while&#39;之后会问为什么代码正常工作?声明如果&#39;。解释如下:

1.)你没有推进你的下一个指针。

2.)假设你已经推进了下一个指针,那么你的代码将无限运行。

简单的干运行应该足够了:

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

8-->9-->7-->NULL 

接下来将是您的递归树,它说明了您的代码无限运行的条件。

显示器(8)
 而(8-&gt;下面) - &GT;显示器(9)
  而(9-&gt;下面) - &GT;显示器(7)
而(7-&gt;下面) - &GT;显示器(NULL) - 返回

从显示器返回后(NULL),对于这种情况,这将无限运行:

while(7->next)---->display(NULL)
并且它将继续循环。

在Ritwick的回答中已经指出了显示链接列表的正确功能。

答案 3 :(得分:-1)

你得到一个无限循环,因为你永远不会在列表中前进,那是:l = l-&gt; next();所以,你永远不会达到null