如何打印出双向循环链表?
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);
}
所以我用 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);
}