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

2 回答 2

2

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

你不想currentNode成为一个副本,而是指针等于pt函数的开头。

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

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

于 2013-01-12T17:21:00.687 回答
0

注意之间的关系

currentNode = *pt;

if(pt == &currentNode)

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

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

tape *currentNodePointer = pt;

然后

if(pt == currentNodePointer)

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

于 2013-01-12T17:49:49.110 回答