c - 只有最后一个元素在 C 中正确打印双向链表
问题描述
我想编写一个带有双向链表的程序并打印它,但只有最后一个元素打印正确。在其他情况下,它在下一个中打印下一个,在当前中打印当前,但它也在上一个中打印当前。
listw* add(listw* head, int number)
{
listw* before=head;
if(head)
while(before->next)
{
before->previous=before;
before=before->next;
}
listw* new=calloc(1, sizeof(listw));
new->number=number;
new->next=NULL;
if (before)
{
before->next=new;
new->previous=before;
}
return head ? head : new;
}
int main(){
listw* head=add(NULL,7);
head=add(head,12);
head=add(head,18);
head=add(head,20);
for (int i=0; (head->next); i++)
{
if(i==0)
{
printf ("previous: none, now: %d, next: %d\n", head->number, head->next->number);
head=head->next;
continue;
}
printf("previous: %d, now: %d, next: %d\n", head->previous->number, head->number, head->next->number);
head=head->next;
}
}
解决方案
我了解您的add
函数旨在将新元素附加到列表的末尾,并且此循环:
if(head)
while(before->next)
{
before->previous=before;
before=before->next;
}
旨在找到您要插入的最后一个元素。
在这种情况下,您有一个不必要的错误修改before->previous
,从而使您的所有previous
指针(除了最后一个)指向它们自己的节点。您可以简单地将其替换为:
if(before)
while(before->next)
before=before->next;
此外,在您的打印循环中,您不会打印最后一个元素。你的情况
for (int i=0; (head->next); i++)
head
当指向尾部时将终止循环- 因此head->next
将为 NULL。一种更惯用的迭代方式是:
while(head)
{
if(head->previous)
printf("previous: %d, ", head->previous->number);
else
printf("previous: none, ");
printf("now: %d, ", head->number);
if(head->next)
printf("next: %d\n", head->next->number);
else
printf("next: none\n");
head = head->next;
}
你不是很清楚你面临什么问题,所以我不确定它是否能解决你的问题。但是,这些是我可以在您的代码中发现的唯一问题。
推荐阅读
- clojure - 是否可以定义一个宏:在函数上调度其他任何东西?
- python - aiohttp中的自定义访问日志
- scala - 错误:未找到:值 SparkSession
- maven - JHipster Spring Boot 模块化拆分包
- haskell - Haskell 列出错误
- javascript - 绑定数组中不同元素的值 (JavaScript)
- r - Y 和 M 模型中样本量不均匀的 R 多级中介
- sql - 如何为我的 Reporting Services 目录中的所有报表添加内容管理员权限?
- java - 使用循环访问 Freemarker 根对象
- dart - 如何使用 Flutter 创建考试准备?