#c #linked-list
#c #связанный список
Вопрос:
Во-первых, я новичок в C и попал в программу, в которой я должен использовать C. Теперь я считаю, что моя проблема как-то связана с указателем, но когда я пытаюсь распечатать список (чтобы убедиться, что я сохранил его в правильном порядке, моя программа вылетает после второговремя прохождения цикла.
Это моя функция вставки, которая вставляется с наименьшим необходимым временем, и я считаю, что это правильно, но не смог протестировать ее, так как мой сбой печати
void insertProcess(Processamp; process, Process* amp;head, Process* curr, Process* prev){
curr = head;
if(head == NULL){
head = amp;process;
}
else{
prev = head;
while(process.timeNeeded > curr->timeNeeded){
prev = curr;
curr = curr->next;
}
prev->next = amp;process;
process.next = curr;
}
}
Вот мой простой цикл, который должен распечатать список. Это будет выполняться несколько раз, прежде чем указать «местоположение чтения с нарушением доступа»
while(curr->next != NULL){
printf("%s %i %i %in", process.processName, process.arrivalTime, process.timeNeeded, process.priority);
curr = curr->next;
}
Я почти уверен, что ошибка будет в одном из этих сегментов кода, я был бы признателен за любую помощь.
РЕДАКТИРОВАТЬ: ХОРОШО, с помощью первого плаката я исправил исходную проблему, но теперь у меня бесконечный цикл при печати. Я почти уверен, что это было бы потому, что я вставляю по порядку и никогда не устанавливаю нулевой указатель после последнего элемента. Кажется ли это правильным, и если да, есть ли какой-либо способ это исправить? Еще раз спасибо
Комментарии:
1.
Process *amp;head
не является законным c. Вы не можете передавать по ссылке.2. Вы компилируете это с помощью компилятора c ?
3. На самом деле я, это то, с чем я был знаком и что делал мой класс, поскольку у нас не было ни знаний о C, ни времени на его изучение. Настоящая причина, по которой мы использовали C, заключалась в том, чтобы мы не использовали объектно-ориентированные свойства c . И я знал, что это казалось неправильным, когда я это делал, но head сбрасывался каждый раз, когда я вызывал insert, если есть другой способ сделать это, я с радостью это исправлю.
4. В c вы бы передали head как
Process **head
. Затем вы могли бы использовать(*head)->field
, и*head = newhead
. Таким образом, компилятор c примет его.
Ответ №1:
В вашей функции вы передаете Process
значение by, и это означает, что функция будет работать с локальной копией Process
объекта, которая будет уничтожена при завершении функции.
Однако ваш код связывается в этой локальной копии, и поэтому, как только вы выходите из функции, ваш связанный список теперь использует Process
объект, который уже был уничтожен.
Другая проблема заключается в том, что при циклическом поиске точки вставки вы не учитываете случай, когда вставленный процесс может быть последним и в этом случае curr
станет нулевым в цикле.
Комментарии:
1. Спасибо, что исправлена одна проблема, которую я должен был увидеть. Теперь я получаю бесконечный цикл, печатающий только последний элемент, который я вставил, но, возможно, я смогу найти проблему с ним.
Ответ №2:
Вы должны научиться использовать отладчик. В Linux вы должны скомпилировать оба -g
(чтобы получить отладочную информацию, созданную компилятором) и -Wall
(чтобы получить все предупреждения), переданные в gcc
или g
. Затем вы можете использовать gdb
отладчик для своего исполняемого файла.