首页 > 解决方案 > 只有最后一个元素在 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;
    }
}

标签: c

解决方案


我了解您的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;
}

你不是很清楚你面临什么问题,所以我不确定它是否能解决你的问题。但是,这些是我可以在您的代码中发现的唯一问题。


推荐阅读