我正在尝试制作链表。我可以一个接一个地添加节点,但我无法根据需要打印链表。如何从上到下打印链表节点
#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);
}