如何解决在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 举报,一经查实,本站将立刻删除。