Отметить текущую позицию в двусвязном списке
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;
}
2 ответа
Когда вы проверяете pt == ¤tNode
Вы проверяете, если pt
указывает на currentNode
, Этого никогда не происходит, так как currentNode
даже нет в списке (ни один элемент в списке не указывает на это).
Ты хочешь currentNode
не быть копией, а указателем, равным pt
в начале функции.
tape *currentNode;
currentNode = pt;
...
if(pt == currentNode)
Вы также не проверяете последний элемент.
Обратите внимание на связь между
currentNode = *pt;
а также
if(pt == ¤tNode)
Во первых, вы инициализировали currentNode
с содержанием того, что указатель pt
указывает на. Во втором вы проверяете, если адрес currentNode
такой же, как у какого-либо члена списка (на который указывает pt
). Должно быть понятно, почему это никогда не может быть правдой.
Что вам нужно сделать, это сохранить адрес, то есть указатель, а не его содержимое
tape *currentNodePointer = pt;
и позже
if(pt == currentNodePointer)
(Ваш код мог бы быть организован лучше, чтобы избежать необходимости всегда "перематывать" заголовок списка, но, возможно, на другой день.)