Если я правильно прочитал ваш первый список кодов, здесь нужно подумать хотя бы об одной важной вещи.Похоже, у вас есть связанный список, и вы перебираете этот список, используя ptr = ptr->next
.Это означает, что вам нужно знать, когда остановиться.Один из распространенных способов настройки связанного списка состоит в том, что последний элемент в списке имеет значение next
, равное NULL
.Затем обрабатывайте узлы по одному, и как только вы закончите работу с одним узлом, вы проверяете, является ли значение next
NULL
: если это не так, вы можете перейти на этот следующий узел, если это NULL
вы останавливаетесь.
Здесь вы не проводите подобные проверки, поэтому вам нужен другой способ убедиться, что вы знаете, когда остановиться.Похоже, что вы делаете, берете значение q->size
и используете его, чтобы сообщить вам, сколько элементов есть в связанном списке.Итак, первое, о чем нужно подумать, это насколько вы уверены, что это значение верно.Например, если код, строящий список, помещает в список только два элемента, ставка устанавливает size
на три, в конечном итоге вы выпадаете из конца списка, и ошибка сегментации весьма вероятна.
Но есть нечто даже более важное, чем это.Даже если вы получаете правильное количество элементов в списке от q->size
, вы сравниваете переменную цикла i
с size
следующим образом:
int i = 0;
while (i <= size) {
⋮
}
Это будет циклс i
, имеющим значения [0, 1,… size
], что на самом деле size
+ 1 раз.Если вы хотите выполнить цикл ровно size
раз, вам нужен тест, подобный i < size
, а не i <= size
.Это распространенная ошибка, часто называемая ошибкой off-by-one .
К сожалению, ваш второй список усложняет, а не делает их лучше.Вернитесь к первому и посмотрите, сможете ли вы починить вещи, о которых я здесь упоминал.