在双向链表中标记当前位置

时间:2013-01-12 17:14:42

标签: c linked-list doubly-linked-list

typedef struct tape
{
    char symbol;
    struct tape *next;
    struct tape *prev;
}tape;

tape *pt;

void ShowCurrentCombination()
{
    tape currentNode;


    currentNode = *pt;
    while(pt->prev != NULL)
            pt=pt->prev;

    while(pt->next != NULL)
        {
            if(pt == &currentNode) //this is never true :( 
            putc("[q]",stdout); 

            putc(pt->symbol,stdout);
                pt=pt->next;
        }
    putc(pt->symbol,stdout);
}

此函数应在左侧显示标记当前元素的列表内容“[q]”。不幸的是,只显示了普通数据。为什么?

为了完整起见,让我介绍一下初始化列表的功能:

void GenerateInputTape(int n)
{
    int i;

    pt=(tape*)malloc(sizeof(tape));

    pt->symbol='B';

    pt->prev=NULL;
    pt->next=(tape*)malloc(sizeof(tape));
    pt->next->prev = pt;
    pt=pt->next;

    for(i=0;i<2*n+1;i++)
    {   
        if(i < (2*n/2))
            pt->symbol='0';
        else
            pt->symbol='1';


        pt->next=(tape*)malloc(sizeof(tape));
        pt->next->prev = pt;
        pt=pt->next;
    }

    pt->symbol='B';
    pt->next=NULL;
}

2 个答案:

答案 0 :(得分:2)

当您检查pt == &currentNode时,检查pt是否指向currentNode。这种情况从未发生过,因为currentNode甚至不在列表中(列表中没有元素指向它)。

您希望currentNode不是副本,但指针在函数开头等于pt

tape *currentNode;
currentNode = pt;
...
if(pt == currentNode)

您也不检查最后一个元素。

答案 1 :(得分:0)

注意

之间的关系
currentNode = *pt;

if(pt == &currentNode)

首先,您已使用指针currentNode 指向的内容初始化pt。在第二步中,您要检查currentNode地址是否与列表中某些成员的地址相同(由pt指向)。应该清楚为什么这永远不会成真。

您需要做的是保存地址,即指针,而不是其内容

tape *currentNodePointer = pt;

以后

if(pt == currentNodePointer)

(你的代码可以更好地组织,以避免总是“倒回”到列表的头部,但也许是另一天。)