Отметить текущую позицию в двусвязном списке

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 ответа

Решение

Когда вы проверяете 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)

(Ваш код мог бы быть организован лучше, чтобы избежать необходимости всегда "перематывать" заголовок списка, но, возможно, на другой день.)

Другие вопросы по тегам