在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
}

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

希望我能帮助您。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...