我正在尝试创建一个循环的双向链表,因此最后一个链接连接到第一个链接。 但是,我无法弄清楚我在反向链接上做错了什么,因为我可以打印我的列表向前但不向后打印。 任何提示/帮助将非常感激。
这是我的结构定义:
struct NODE {
union {
int nodeCounter;
void *dataitem;
} item;
struct NODE *link;
struct NODE *backlink;
};
//function to create a list
struct NODE *InitList() {
struct NODE *temp = (struct NODE*)malloc(sizeof NODE);
temp->item.nodeCounter = 0;
temp->link = NULL;
temp->backlink = NULL;
return temp;
}
这是我的插入功能:
void Add2List(struct NODE *start, struct NODE *NewNode) {
struct NODE *current = start;
while (current->link != NULL && current->link != start) {
current = current->link;
}
current->link = NewNode;
NewNode->link = start;
NewNode->backlink = current;
start->backlink = NewNode;
start->item.nodeCounter++;
}
这是我的打印后退功能:
void PrintBackwards(struct NODE *start) {
struct NODE * current = start;
while(current->backlink != start) {
DisplayNode((struct inventory*)current->item.dataitem);
current = current->backlink; //go one node back
}
}
答案 0 :(得分:3)
其余功能看起来合理,但PrintBackwards
功能中至少有两个错误。
如果您打算从最后开始打印,则应该从start->backlink
开始,而不是start
。
您不应该在while循环中检查NULL
因为您的列表是循环的,所以不应该NULL
。
下面的代码修复了这两个错误,但我不确定是否还有其他错误。
void PrintBackwards(struct NODE *start)
{
if(start == NULL || start->backlink == NULL)
return;
struct NODE * current = start->backlink;
while(current->backlink != start)
{
DisplayNode((struct inventory*)current->item.dataitem);
current = current->backlink; //go one node back
}
}
答案 1 :(得分:1)
...也许
while(current->backlink != start)
{
DisplayNode((struct inventory*)current->item.dataitem); //dangerous
current = current->backlink; //go one node back
}