【问题标题】:How to print linked list node top to bottom如何从上到下打印链表节点
【发布时间】:2020-03-17 05:24:13
【问题描述】:

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

#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("%d\n",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

如何获得以上输出?

【问题讨论】:

  • 这不是有效的 C++。请不要标记不相关的语言(new 是 C++ 中的关键字)
  • 您正在正确打印列表,从头到尾。但是,您每次都在头部添加元素,但将其视为堆栈。您可以将新元素添加到尾部而不是头部,或者将列表从后面(尾部)打印到前面(头部)。
  • 你会考虑改变你当前的列表结构吗?您可以切换到双链表,然后将新元素添加到尾部或从尾部开始迭代。
  • 您正在将新节点插入到列表的开头。如果你在最后插入,那么你会得到预期的结果。
  • 您可以采取两条主要路线: 1. 将结构修改为双向链表;在这里,您有上一个(前)链接以及下一个链接,因此您可以从最后开始并向后工作。 2. 将列表向下工作,直到找到结尾,然后将其打印出来;跟踪最后一个并打印出来,也许使用递归调用。您希望向后打印列表的频率与添加或删除元素的频率是您在选择 1 或 2 时可以考虑的因素。

标签: c linked-list


【解决方案1】:

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

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

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

1) 创建一个方法void addToTail(Node* head, int value); 遍历列表并将元素添加到列表的尾部而不是头部。旁注:此操作很耗时,因为它需要O(N) 时间复杂度。关于复杂性,read more here。还有this StackOverflow 的问题。

2)您提到了“链表”一词。根据您的说法,您没有指定它是单链接还是双链接。而且由于您可以访问节点实现,我建议您添加一个指向指向前一个元素的每个节点的指针,从而将您的单链表转换为双链表。

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

当然,你需要在你的列表的操作中分别更新这个节点——否则它不会起作用——我让这个给你。

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

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

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

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

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

【讨论】:

  • 我认为将单链表转换为双链表既不需要,也超出了问题的范围。此外,如果这是您假设的练习的一部分,则列表更有可能需要单独链接。
  • 我同意你的看法,因为你可能是对的 - 然而,我的目的是通过“提示”向 OP 提供可用选项 - 而不是实际实施,因此 1. 他/她知道替代方案,并且 2. 考虑是否确实需要,以便他/她继续这样做。
  • 如果您想以这种方式帮助 OP,我建议您解释添加到尾部或反转列表,恕我直言更有意义。
  • 好点,我会分别更新问题,谢谢@MarcoBonelli!
【解决方案2】:

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

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

【讨论】:

  • 现在这很聪明。喜欢!
猜你喜欢
  • 2023-02-25
  • 2013-05-10
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2022-11-15
  • 2018-11-15
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多