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かどうかをチェックします。リストに含まれていないため、これは発生しません(リスト内の要素がそれを指していません)。ptcurrentNodecurrentNode

あなたcurrentNodeはコピーではなくpt、関数の始めに等しいポインタになりたいです。

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

また、最後の要素をチェックしません。

于 2013-01-12T17:21:00.687 に答える
0

間の関係に注意してください

currentNode = *pt;

if(pt == &currentNode)

最初に、ポインターが指す内容で初期currentNodeしました。2 番目の例では、 のアドレスがリスト内の一部のメンバーのアドレスと同じかどうかを確認しています ( が指す)。なぜこれが決して真実ではないのかは明らかです。 pt currentNodept

あなたがする必要があるのは、その内容ではなく、アドレス、つまりポインターを保存することです

tape *currentNodePointer = pt;

以降

if(pt == currentNodePointer)

(リストの先頭に常に「巻き戻す」必要がないようにコードを整理することもできますが、それはおそらく別の日にします。)

于 2013-01-12T17:49:49.110 に答える