C语言 打印链表的不同功能



我看到了打印链表函数的两个(不同的?)实现。让我先给出我的代码示例:

#include <stdio.h>
#include <stdlib.h>
struct node {
        int x;
        struct node *next;
};
void free_list(struct node *current);
void print_list_a(struct node *current);
void print_list_b(struct node *head);
int main()
{
        struct node *head;
        struct node *second;
        struct node *third;
        head = NULL;
        second = NULL;
        third = NULL;
        head = malloc(sizeof(struct node));
        if (!head) {
                exit(EXIT_FAILURE);
        }
        second = malloc(sizeof(struct node));
        if (!second) {
                exit(EXIT_FAILURE);
        }
        third = malloc(sizeof(struct node));
        if (!third) {
                exit(EXIT_FAILURE);
        }
        head->x = 1;
        head->next = second;
        second->x = 2;
        second->next = third;
        third->x = 3;
        third->next = NULL;
        print_list_a(head);
        print_list_b(head);
        free_list(head);
        exit(EXIT_SUCCESS);
}

上面我声明了两个打印函数print_list_a()print_list_b()。它们的定义如下:

void print_list_a(struct node *current)
{
        while (current != NULL) {
                printf("%d->", current->x);
                current = current->next;
        }
}
void print_list_b(struct node *head)
{
        struct node *current;
        current = head;
        while (current != NULL) {
                printf("%d->", current->x);
                current = current->next;
        }
{

我的问题是:a) print_list_a()print_list_b()之间是否存在真正的差异?b)两者孰优孰劣?我有点困惑,因为两者都实现了相同的目标。我能看到的print_list_b()的唯一优点是head出现在函数参数列表中。

功能之间没有区别。两者都使用一个本地变量来存储列表中的当前节点。考虑函数参数也是函数的局部变量。

然而,对于我来说,我更喜欢函数

的以下定义
void print_list_b( const struct node *head )
{
    for ( const struct node *current = head; current != NULL; current = current->next )
    {
        printf( "%d->", current->x );
    }
}

或以下

void print_list_b( const struct node *current )
{
    for ( ; current != NULL; current = current->next )
    {
        printf( "%d->", current->x );
    }
}

但是我会使用for循环:)

考虑到编译器可以为所有循环生成相同的目标代码:while或for.:)

我建议你再考虑一个print_list函数:)

void print_list( const struct node *current )
{
    if ( current != NULL )
    {
        printf( "%d->", current->x ); print_list( current->next );
    }
}
void print_list( const struct node *current )
{
    if ( current != NULL )
    {
        print_list( current->next ); printf( "%d->", current->x ); 
    }
}

它们做完全相同的事情。打印列表,直到遇到null。

一个直接从传递的参数开始,而另一个则不必要地创建一个节点对象,将其分配给参数,然后通过列表迭代它。

相关内容

  • 没有找到相关文章

最新更新