Определение, является ли узел в связанном списке пустым - PullRequest
0 голосов
/ 30 марта 2020

Мне трудно определить, пуст ли узел в связанном списке или нет. Я получаю поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x34) ошибка, но она не соответствует. Есть моменты, когда он определяет, что узел пуст, но иногда при тестировании он показывает, что у него есть адрес. Я приложил изображение после попытки отладки и поставил условия, чтобы увидеть, пуст ли узел

enter image description here

Я пытался несколько вещей, чтобы избежать это плохой доступ, но не знаю, что делать. Возможно, это не лучшая кодировка, но любая помощь поможет

struct InstructionNode *node = new InstructionNode;

if(temp_head == NULL){
    temp_head = node;
    temp_tail = node;
    temp = node;
    node = NULL;
}
else{
    temp_tail->next = node;
    temp_tail = node;
}

condition_flag = 1;

Token t  = lexer.GetToken();

if(t.token_type != IF)
    syntax_error();
else{
    node_tail->type = CJMP;
    condition();
    condition_flag = 0;
    body();
}

if(temp!= NULL){
    if(temp->next != NULL){
        node_tail->next = temp; //Bad access
        node_tail = temp;
        temp = temp->next;
    }
    else{
        free(temp_head);
    }
}
else{
    free(temp_head);
}

}

демо моего класса

class demo{
public:
demo(){
    head = NULL;
    tail = NULL;

    node_head = NULL;
    node_tail = NULL;

    temp_head = NULL;
    temp_tail = NULL;

    temp = NULL;
}

void syntax_error();
variables *head, *tail;
struct InstructionNode *node_tail, *temp_head,*temp_tail, *temp;

Как мне решить эту проблему. Спасибо

1 Ответ

2 голосов
/ 30 марта 2020

Если я вас правильно понимаю (строка node_tail->next = temp; выдает ошибку неверного доступа), возможно, это потому, что вы проверяете, не равен ли temp NULL, но не равен ли node_tail NULL прежде чем пытаться разыменовать его. Если по какой-то причине node_tail равно NULL (как, может быть, при первом запуске кода), это вызовет sh.

. Чтобы это исправить, вам необходимо проверить и убедиться, что node_tail isn 't NULL, прежде чем вы разыграете его, а не просто temp.

...