C语言 如何从上到下打印链表节点



我正在尝试制作链表。我可以一个接一个地添加节点,但我无法根据需要打印链表。如何从上到下打印链表节点

#include<stdio.h>
#include<stdlib.h>
struct node{
  int N;
  struct node *next;
};
struct node* newNode(int number, struct node *next) {
    struct node *new = malloc(sizeof(*new));
    new->N = number;
    new->next = next;
    return new;
}
void show(struct node *head){
     struct node *c;
     c = head;
     while (c!=NULL){
           printf("%dn",c->N);
           c = c->next;
     }
}
int main (void ) {
    struct node *head = NULL;
    head = newNode(10, head);
    head = newNode(20, head);
    head = newNode(30, head);
    head = newNode(40, head);
    show(head);
    return 0;
}

输出 40 30 20 10

我正在尝试打印如下所示的节点

10 20 30 40

如何获得高于输出?

由于我知道这可能是练习的一部分,我将尝试以辅助的方式回答它,同时仍然给出一个全面的答案。

我撇开您在头部插入元素的事实 - 我不确定这是您想要做的,我认为问题是"一旦我正确输入了元素,如何向后打印?

我们必须研究可能的解决方案:

1( 创建一个遍历列表的方法void addToTail(Node* head, int value);并将元素添加到列表的尾部而不是头部。旁注:此操作需要时间成本高,因为它需要O(N)时间复杂性。关于复杂性,请在此处阅读更多内容。Se 也是这个 StackOverflow 问题。

2(您提到了"链表"一词。通过你所说的,你没有指定它是单链接的还是双重链接的。由于您可以访问节点实现,因此我建议您添加一个指向每个节点的指针,该指针指向前一个元素,从而将单链列表转换为双向链接列表。

struct node{
  int N;
  struct node *next;
  struct node *prev;
};

而且,当然,您需要在列表的操作中分别更新此节点 - 否则它将不起作用 - 我让这个给你。

这样,您将能够轻松地向后迭代列表,然后按所需顺序打印数字。

3(你可以实现一个函数Node * reverseList(Node* head);,通过迭代"反转"列表,然后用它来打印反转的列表。 再说一次,我让你实现。当然,您每次都需要考虑列表状态,例如,如果您需要就地反转列表或返回指向新的反向列表的指针(如上面的函数协定所示(。

你现在需要做的是重新阅读你的练习简报,停下来想一想:"我真的需要这些解决方案吗?这是对我的要求吗?

如果您只是以错误的顺序输入数据,则可能不会。

但是,如果特别要求您向后打印列表元素,那么您对如何继续有一些很好的提示。

递归方法在这里效果很好:

void show(struct node *c){
    if (c == NULL)
        return;
    show(c->next);
    printf("%dn", c->N);
}

相关内容

  • 没有找到相关文章

最新更新