Я работаю над связанным списком, который у меня в основном работает, но мне нужно расширить то, что у меня есть сейчас, но у меня возникла проблема.Поиск структуры, подлежащей перезаписыванию в связанном списке
У меня есть структура, которая хранит исходящие звонки от телефонных звонков. Я храню эти вызовы в виде связанного списка, который определяется следующим образом:
typedef struct CallLogSearchOutboundStruct
{
char * target;
float duration;
char * cleardownCause;
BOOL allowOverwrite;
struct CallLogSearchOutboundStruct * nextLeg;
} callLogSearchOutboundStruct;
У меня есть основной код работает, что я могу успешно добавить новый исходящий вызов на конец связанного списка, используя код ниже:
void insertOutboundLegToList(callLogSearchOutboundStruct * outboundLeg, char * target, float duration, int cleardown, BOOL overwriteFirstOutboundLegs)
{
f (outboundLeg->target == NULL)
{
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->allowOverwrite = FALSE;
outboundLeg->nextLeg = NULL;
}
else
{
if (overwriteFirstOutboundLegs == FALSE)
{
while (outboundLeg->nextLeg != NULL)
{
outboundLeg = outboundLeg->nextLeg;
}
}
if (outboundLeg->nextLeg == NULL)
{
outboundLeg->nextLeg = (callLogSearchOutboundStruct*)malloc(sizeof(callLogSearchOutboundStruct));
outboundLeg = outboundLeg->nextLeg;
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->nextLeg = NULL;
}
else
{
outboundLeg->target = NULL;
outboundLeg->duration = 0;
outboundLeg->cleardownCause = NULL;
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
}
}
}
Этот код работает, однако мне нужно изменить его так, что если флаг allowOverwrite установлен он будет сначала первый исходящее нога в связанном списке, перепишите его и установите перезапись для первого этапа к ложным, но все остальные ножки в списке настроены на возможность перезаписи.
Поэтому, когда необходимо установить новый исходящий вызов, если для первого нота перезаписывания установлено значение false, тогда программе необходимо будет пройти через каждую исходящую ногу и проверить, разрешено ли разрешить перезаписывать для этой ноги значение true и если это так переписать эту ногу, а затем установить флаг перезаписи на false, а затем снова на следующей исходящей ноге, продолжайте цикл до тех пор, пока он не увидит, чтобы разрешить переписывать true, переписать и установить значение false, это должно продолжаться до тех пор, пока следующий ног не будет равен NULL, затем просто вставляет исходящую ногу на конец, как обычно.
Я думаю, что у меня есть базовая логика, однако я, кажется, продолжаю NULL'ий на первом ноге, когда я выхожу из петли, поэтому у меня нет исходящих ног.
Ниже приведено, как я изменил код, чтобы попытаться достичь того, что мне нужно.
if (overwriteFirstOutboundLegs == TRUE)
{
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->allowOverwrite = FALSE;
//Loop through existing outbound legs and set overwrite flag to TRUE
while (outboundLeg->nextLeg != NULL)
{
outboundLeg = outboundLeg->nextLeg;
outboundLeg->allowOverwrite = TRUE;
}
outboundLeg->nextLeg = NULL;
}
else
{
if (outboundLeg->target == NULL)
{
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->allowOverwrite = FALSE;
outboundLeg->nextLeg = NULL;
}
else
{
if (outboundLeg->nextLeg == NULL)
{
outboundLeg->nextLeg = (callLogSearchOutboundStruct*)malloc(sizeof(callLogSearchOutboundStruct));
outboundLeg = outboundLeg->nextLeg;
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->allowOverwrite = FALSE;
outboundLeg->nextLeg = NULL;
}
else
{
while (outboundLeg->nextLeg != NULL)
{
outboundLeg = outboundLeg->nextLeg;
if (outboundLeg->allowOverwrite == TRUE)
{
break;
}
}
outboundLeg->target = strdup(target);
outboundLeg->duration = duration;
outboundLeg->cleardownCause = strdup(setCallResult(cleardown));
outboundLeg->allowOverwrite = FALSE;
outboundLeg->nextLeg = NULL;
}
}
}
Я вызываю функцию, используя следующий код:
insertOutboundLegToList(outboundCallLegStartPtr, targetBuffer, durationBuffer, atoi(rowReport[cleardownColIndex]), overwriteFirstOutboundLegs);
Прикрепленного ниже, также диаграмма, показывающая поток, что мне нужно для вставки новой ноги.
Спасибо за любую помощь вы можете предоставить.
Вы прошли через код в отладчике? Это должно показать вам, что происходит не так. –
Да, я думаю, что это связано с циклом, все устанавливает все в true, я перезаписываю то, что на самом деле хранится. – Boardy