2017-07-18 99 views
-2

我需要用C来写一个函数,给定一个指针链表,将打印出Python语法元素:例如对于由1,2,3,4和5组成的列表,该功能将打印出[1,2,3,4,5]。Ç - 使用递归打印链表

我试图写的代码如下:

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

void print_list(struct node *list) { 
    printf("["); 
    if (list == NULL) { 
     printf("]"); 
    } else { 
     printf("%d", list->data); 
     if (list->next != NULL) { 
      printf(", "); 
     } 
     print_list(list->next); 
    } 
} 

输出看起来像这样:[1,[2,[3,[4,[5 []

据我所知,每函数调用自己的时间,“[”将被打印。有没有办法在第一次调用函数时打印“[”?

+0

如何在打印之前激活调用递归函数? – Ctx

+0

像之前调用void print_list? –

+0

是的。第二个选项,添加一个标志,告诉您该parmeters如果你要打印托架 – CIsForCookies

回答

5

您可以为印刷括号的包装功能。在印刷之间,调用实际的递归函数,就像这样:

void print_list(struct node *list) { 
    putchar('['); 
    print_list_helper(list); 
    putchar(']'); 

void print_list_helper(struct node *list) { 
    if (list != NULL) 
     printf("%d", list->data); 
     if (list->next != NULL) { 
      printf(", "); 
     } 
     print_list_helper(list->next); 
    } 
} 

编辑:作为pointed out由费利克斯Palmen,一个static变量是一种选择,但不是最好的。它仅在您第一次调用该函数时有效。之后,计数器必须重置,这不容易做,并使递归函数不纯。

使用static的一个例子:

#include <stdio.h> 

void foo() { 
    static int x = 0; 
    printf("x In foo: %d\n", x); 
    x++; 
} 

int main() { 
    int i; 
    for(i = 0; i < 5; i++) { 
     foo(); 
    } 

    return 0; 
} 

此打印:

$ ./a.out 
x In foo: 0 
x In foo: 1 
x In foo: 2 
x In foo: 3 
x In foo: 4 

静态整数在函数调用之间保持其值。因此,您可以在第一次调用递归函数时使用它,但每次遇到基本情况时都需要重置该函数。

static又如:

void foo() { 
    static int x = 0; // initialization (done ONCE!) 
    printf("x In foo: %d\n", x); 
    x++; 
    if(x%2 == 0) x = 0; // reassignment (done as many times as you like) 
} 
... // everything else is the same 

这给:

$ ./a.out 
x In foo: 0 
x In foo: 1 
x In foo: 0 
x In foo: 1 
x In foo: 0 
+0

是否可以在不创建包装函数或全局变量的情况下解决问题? –

+0

好主意,但'_print_list'这个名称很差(因为以下划线开头的标识符是实现保留的)。应该是'print_list_content' –

+0

@ M.Ng它是一个静态整数变量。我不想听起来多余,因为[this](https://stackoverflow.com/a/45167070/4909087)答案已经提出了它。 –

0

使用全局变量和更改您的代码

int count=0; 
void print_list(struct node *list) { 
    if(count==0) 
     printf("["); 
    if (list == NULL) { 
     printf("]"); 
    } else { 
     printf("%d", list->data); 
     if (list->next != NULL) { 
      printf(", "); 
     } 
     print_list(list->next); 
    } 
count++; 

} 
1

你可以用一个静态的整数做到这一点。

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

void print_list(struct node *list) { 
    static int print_start = 0; 
    if (print_start == 0) { 
     printf("["); 
    } 
    if (list == NULL) { 
     printf("]"); 
     print_start = 0; 
    } else { 
     print_start++; 
     printf("%d", list->data); 
     if (list->next != NULL) { 
      printf(", "); 
     } 
     print_list(list->next); 
    } 
} 
+3

您在打印右括号时还必须设置print_start = 0 –

+0

好的解决方案。 +1 –

+1

如果这是为了练习递归,我不认为这是一个好的解决方案。递归函数通常旨在成为*纯函数,而全局变量则是失败的目的。另一方面,如果不需要递归,则有更好的迭代方法。 –

0

添加一个附加参数,显示它是从外部还是递归调用。最优雅的方式,但会花费你一些堆栈。