Member 12887991 Ответов: 1

Круговой единый связанный список, это правильный способ сделать это?


struct records t_head=0;

struct records *find_id(Rect a)
{

        struct records *tmp;
        struct records *prev;

	// Add first node
        if(t_head==NULL) {
        tmp=new records;
        tmp->b=a;
        tmp->id=trecord_count+1;
        tmp->tally.resize(labelsInfo.size());
        tmp->frames=0;
        t_head=tmp;
        t_head->next=NULL;
        trecord_count++;
        }

 	else {
	// Check if there is any node that has delete_flag set first
        tmp=t_head;
        while(tmp) {

        if(delete_flag) { 
      
        // Delete here
        if(tmp==t_head) {
        t_head=tmp->next;
        delete(tmp);
        trecord_count--;
	}
        else { 
        prev->next=tmp->next;
        delete(tmp);
        trecord_count--;
        }
       
        }

        prev=tmp;
        tmp=tmp->next;
        }

	
        tmp=new records
        tmp->b=a;
        tmp->id=trecord_count+1;
        tmp->tally.resize(labelsInfo.size());
        tmp->frames=0;
        tmp->next=t_head;
        t_head=tmp;
        trecord_count++;
        }

        return tmp;
}


Что я уже пробовал:

Я реализовал это на основе какой-то статьи где-то, но в конце концов она выходит из строя.
Есть ли что-то изначально неправильное в этом коде ?

Спасибо, что посмотрели,

CHill60

"в конце концов он терпит крах" ... это не очень полезное утверждение. Попробуйте отладить его. Что это за ошибка, о которой сообщается? Какие условия делают его аварийным?

Member 12887991

Извиняюсь. Он либо говорит, что я освобождаю указатель, который ранее не был выделен, либо выходит из строя при разыменовании указателя tmp.

1 Ответов

Рейтинг:
2

Patrice T

Во-первых: ваш код больше похож на C++, чем на C.
Во-вторых: используйте правильный отступ, это поможет читать код.
Третье: этот код не является автономным, мы не можем скомпилировать его, чтобы увидеть, что он делает.

вам трудно понять, что делает код и почему он выходит из строя.
Используйте отладчик t(he), он позволит вам видеть запущенный код и видеть изменение переменных. Для каждого шага посмотрите на изменения переменных и спросите себя, соответствует ли это вашим ожиданиям.
-----
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.