如何打印出双向循环链表?

How to print out two way circular linked list?

所以我用 C 编写了双向循环链表(无序)的代码,但我 运行 遇到了问题。我有这个打印元素的代码(从头开始):

void ShowListFromHead(List& l){
    if(l.head==l.tail){
        printf("%d", l.head->value);
        return;
    }
    Element* p;
    p=l.head;
    while(p->next!= l.head){
        printf("%d,", p->value);
        p=p->next;}
}

除了尾部,它工作正常,因为 while 循环一直工作到它到达尾部(直到 p->next 是头部)。所以,这是我的问题:有没有办法在不排除任何元素的情况下显示整个列表?似乎无论我如何制定循环,总有一个元素被遗漏。使用 do/while 循环也不起作用。我尝试在最后一个元素的循环之后添加一个 printf,但它弄乱了代码中其他函数的功能。我试图解决这个问题几天,但仍然不知道如何解决,所以非常感谢您的帮助!

编辑我正在添加 deleteHead 函数,看来问题可能并不完全出在 show 函数中。

bool deleteHead(List& l, int &oldHead){
        if(l.head!=NULL){
            oldHead= l.head->value;
            Element *p=l.head;
            if(l.head->next!=NULL){
                l.head=l.head->next;
                l.head->prev=l.tail;
                l.tail->next=l.head;
                delete p;
                return true;
            }}
        else if(l.head==NULL){
            return false;
    }
}

原代码修改:

void ShowListFromHead(List& l){
    if(l.head == 0)
        return;
    Element* p = l.head;
    do{
        printf("%d,", p->value);
        p=p->next;
    }while (p != l.head);
}

void ShowListFromHead(List& l){
    if(l.head == 0)
        return;
    Element* p = l.head;
    do{
        std::cout << p->value << ", " ;
        p=p->next;
    }while (p != l.head);
}

您在循环后使用 print 语句时遇到问题的原因是您的删除代码:

bool deleteHead(List& l, int &oldHead){
    if(l.head!=NULL){
        oldHead= l.head->value;
        Element *p=l.head;
        if(l.head->next!=NULL){
            l.head=l.head->next;
            l.head->prev=l.tail;
            l.tail->next=l.head;
        } // this is where you should close your if statement
            delete p;
            return true;
        //} you don't account for the case where there is one element left
    }
    else if(l.head==NULL){
        return false;
    }
}

然后您可以添加 print 语句以在循环后打印尾部。或者您可以实施@rcgldr 的解决方案。我喜欢这个:

void ShowListFromHead(List& l){
    if(l.head == 0)
        return;
    Element* p = l.head;
    do{
        printf("%d,", p->value);
        p=p->next;
    }while (p != l.head);
}