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

C 如何从上到下打印链表节点,c,linked-list,C,Linked List,我正在尝试制作链表。我可以一个接一个地添加节点,但我无法按照我的要求打印链接列表。如何自上而下打印链表节点 #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));

我正在尝试制作链表。我可以一个接一个地添加节点,但我无法按照我的要求打印链接列表。如何自上而下打印链表节点

#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;
}
#包括
#包括
结构节点{
int N;
结构节点*下一步;
};
结构节点*新节点(整数,结构节点*下一个){
结构节点*new=malloc(sizeof(*new));
新建->N=编号;
新建->下一步=下一步;
归还新的;
}
无效显示(结构节点*头部){
结构节点*c;
c=头部;
while(c!=NULL){
printf(“%d\n”,c->n);
c=c->next;
}
}
内部主(空){
结构节点*head=NULL;
头部=新节点(10,头部);
头部=新节点(20,头部);
头部=新节点(30,头部);
头部=新节点(40,头部);
秀(头);;
返回0;
}
输出 40 30 20 十,

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

十, 20 30 四十


如何获得以上输出?

因为我知道这可能是练习的一部分,所以我将尝试以帮助的方式回答它,同时给出一个全面的答案

<>我把你把你的元素插入到脑子里的事实放在一边——我不确定它是你想做的,我把这个问题看成是“一旦我正确地输入了元素,它是如何向后打印的?” 我们必须研究这方面可能的解决办法:

1) 创建一个方法
void addToTail(节点*head,int值)。旁注:此操作的时间开销很大,因为它需要
O(N)
时间复杂性。关于复杂性。Se还提出了一个问题

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

struct node{
  int N;
  struct node *next;
  struct node *prev;
};
当然,您需要在列表的操作中分别更新此节点-否则它将不起作用-我将把它告诉您

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

3) 您可以实现一个函数
Node*reverseList(Node*head)通过迭代“反转”列表,然后使用它打印反转的列表。
再一次,我让你实现。当然,您需要在每一次考虑列表状态,如果您需要将列表反转,或者返回指向一个新的反向列表的指针(如上面所示的函数契约)。
你现在需要做的是重新阅读你的练习大纲,停下来想一想:“我真的需要这些解决方案吗?这是我要求的吗?”

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


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

递归方法在这里非常有效:

void显示(结构节点*c){
如果(c==NULL)
回来
显示(c->next);
printf(“%d\n”,c->n);
}

< /代码>这不是有效的C++。请不要标记不相关的语言(
new
是C++中的一个关键字)。您正在正确地从头到尾打印列表。但是,每次都在头部添加元素,将其视为堆栈。你可以将新元素添加到尾部而不是在头上,或者将列表从后部(尾部)打印到前端(头)。你会考虑更改当前的列表结构吗?您可以切换到双链接列表,然后向尾部添加新元素或从尾部开始迭代。您将在列表的开头插入新节点。如果您在末尾插入,那么您将获得预期的结果。将结构修改为双链表;这里有上一个(IOU)链接和下一个链接,所以你可以从末尾开始,然后向后工作。2.把清单写下来,直到找到结尾,然后打印出来;跟踪结尾之前的一个,并打印出来,可能使用递归调用。你想向后打印列表的次数与添加或删除元素的频率是选择1或2时可以考虑的因素。我认为将单链表转换成双链接列表是不必要的,而且超出了问题的范围。此外,如果这是一个练习的一部分,比如你假设列表更可能需要单独链接。我同意你的观点,因为你可能是对的——然而,我的目的是给OP一个“提示”——而不是实际的实现,因此1。他/她知道备选方案和2。思考是否确实需要,以便他/她继续进行。如果您想以这种方式帮助OP,我建议您解释添加到尾部或反转列表,这更有意义,IMHO。非常好,我将分别更新问题,谢谢@MarcoBonelli!这很聪明。喜欢!