所以我在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;
}
}
答案 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);
}