c链表打印向后

时间:2014-05-21 04:53:48

标签: c printing

我正在尝试创建一个循环的双向链表,因此最后一个链接连接到第一个链接。 但是,我无法弄清楚我在反向链接上做错了什么,因为我可以打印我的列表向前但不向后打印。 任何提示/帮助将非常感激。

这是我的结构定义:

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

2 个答案:

答案 0 :(得分:3)

其余功能看起来合理,但PrintBackwards功能中至少有两个错误。

  1. 如果您打算从最后开始打印,则应该从start->backlink开始,而不是start

  2. 您不应该在while循环中检查NULL因为您的列表是循环的,所以不应该NULL

  3. 下面的代码修复了这两个错误,但我不确定是否还有其他错误。

    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
}