微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C中打印链接列表

如何解决在C中打印链接列表

我正在为Lisp编译器开发链表API,但是我选择用C编写此部分,因为用汇编编写它并不是一件很有趣的事情。我可以使用下面的list函数从一系列元素中成功创建一个链表。我已经验证了它的工作原理,如以下main中的示例所示。但是为什么我的函数print_list只打印第一个元素,然后打印零?我感到很困惑。如果您了解出了什么问题,请提供任何帮助。

#include <stdio.h>
#include <stdarg.h>

typedef struct Node Node;
struct Node {
    int head; // make to a union later
    Node* tail;
};

//////////
Node cons(int curr,Node* next) {Node cell = {curr,next}; return cell;}
int car(Node node) {return node.head;}
Node* cdr(Node node) {return node.tail;}
//////////
void print_elems(Node node) {
    printf("%d",node.head);
    if (node.tail == NULL) return;
    printf(" ");
    print_elems(*node.tail);
}

void print_list(Node node) {
    printf("(");
    print_elems(node);
    printf(")\n");
}
//////////
Node make_pairs(va_list args,int argc) {
    Node linked_list;
    linked_list.head = va_arg(args,int);
    if (argc == 0) {
        linked_list.tail = NULL;
        return linked_list;
    }
    Node tail = make_pairs(args,argc - 1);
    linked_list.tail = &tail;
    return linked_list;
}

Node list(int length,...) {
    va_list elems;
    va_start(elems,length);
    Node linked_list = make_pairs(elems,length);
    va_end(elems);
    return linked_list;
}
//////////

int main() {
    Node big_list = list(5,1,2,3,4,5);

    /*
    This is NULL,as expected:
    big_list.tail -> tail -> tail -> tail -> tail -> head

    And this is 1:
    big_list.head
    */

    // but why does this only print "(1 0)"?
    print_list(big_list);
}

解决方法

您可以通过以下方式打印链接列表:这是一个示例; 我的目的只是为了让您注意到使用指针时,本地变量没有问题

typedef struct Node Node;
Node* first_element = create_list; // just for understanding "first element" is the linked list
Node* ptr = first_element; // copy in another pointer your list then you will avoid loosing your first element and breaking your list (personnal advice : not needed)

while  (ptr->tail){
    ptrinf("%d\n",ptr->head); // for exemple
    ptr = ptr->tail;
} 

//after the while ptr = the last element because ptr->tail == NULL

格式化为可运行的格式:

#include <stdio.h>
typedef struct Node Node;

void display_list (Node* first_element)
{
        Node* ptr = first_element; // copy in another pointer your list then you will avoid loosing your first element and breaking your list (personnal advice : not needed)

        while  (ptr->tail){
            ptrinf("%d\n",ptr->head); // for exemple
            ptr = ptr->tail;
        }

        //after the while ptr = the last element because ptr->tail == NULL
}

如果我没有很好地回答这个问题,请告诉我,我是新手,我会改善^^。

希望我能帮助您。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。