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

时间:2015-04-06 21:37:26

标签: c++ doubly-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;
    }
}

2 个答案:

答案 0 :(得分:1)

对原始代码的修改:

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);
}

答案 1 :(得分:1)

循环后使用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);
}