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 == ¤tNode) //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;
}
答案 0 :(得分:2)
当您检查pt == ¤tNode
时,检查pt
是否指向currentNode
。这种情况从未发生过,因为currentNode
甚至不在列表中(列表中没有元素指向它)。
您希望currentNode
不是副本,但指针在函数开头等于pt
。
tape *currentNode;
currentNode = pt;
...
if(pt == currentNode)
您也不检查最后一个元素。
答案 1 :(得分:0)
注意
之间的关系currentNode = *pt;
和
if(pt == ¤tNode)
首先,您已使用指针currentNode
指向的内容初始化pt
。在第二步中,您要检查currentNode
的地址是否与列表中某些成员的地址相同(由pt
指向)。应该清楚为什么这永远不会成真。
您需要做的是保存地址,即指针,而不是其内容
tape *currentNodePointer = pt;
以后
if(pt == currentNodePointer)
(你的代码可以更好地组织,以避免总是“倒回”到列表的头部,但也许是另一天。)