在双链表中标记当前位置


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

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

你希望currentNode不是一个副本,而是一个指针等于函数开始的pt

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

也不检查最后一个元素

currentNode = *pt;

if(pt == &currentNode)
在第一个例子中,你用初始化了currentNode,即指针pt 指向的内容。在第二种情况下,您正在检查currentNode地址是否与列表中某些成员(由pt指向)的地址相同。应该很清楚为什么这永远不可能是真的。

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

tape *currentNodePointer = pt;

if(pt == currentNodePointer)

(您的代码可以组织得更好,以避免总是"倒带"到列表的头部,但这可能是另一天。)

相关内容

  • 没有找到相关文章

最新更新