Повторение связанного списка (Алгоритм Банкиров)
Я делаю простой симулятор алгоритма банкиров. Когда я сравниваю потребность с доступными ресурсами, она отлично работает для 1 цикла. Однако я не могу заставить его повторить связанный список снова. (В алгоритме банкиров вы можете запускать только последний в связанном списке. В этом случае вам придется снова просмотреть связанный список, чтобы узнать, сможет ли он еще работать [это та часть, которая не работает]) Я думаю, это как-то связано с указателями, но я не уверен что.
struct LL //linked list structure(pcb)
{
LL_pid pid;
int alloc[15];
int max[15];
int need[15];
int finish;//flag to show if finished
PCB *next; //points to next pcb in linked list
};
Вот где я в тупике. Я добавил несколько тестовых printfs и понял, что он не повторяет цикл (возможно, так как указатель pcb_head теперь нулевой)?
void makeBANK(PCB *pcb_head, int avail[15]){
PCB *temp=pcb_head;
int availnew[15];
int x=0;
for(x=0;x<processCount;x++){//get all the available resources
availnew[x]=avail[x];
}
int alldone=0;//check if all processes could run
int possible=0;//check if its possible if a process can run with current available resources
int y=0;
int i=0;
int z=0;
for(y=0;y<processCount;y++){//trying to iterate the linked list at least the amount of processes there are(worst case)
temp=pcb_head;
while((temp!=NULL)&&(temp->finish!=1)){//search all nodes
for(i=0;i<resourceCount;i++){//compare avail and need
if(availnew[i]>=temp->need[i]){//if possible keep 1 ,loop all
possible=1;
}
else{
possible=0;
printf("oops");
break;
}//if not possible break
}
if(possible==1){//if the possible still 1 then print
printf("%d running",temp->pid);
temp->finish=1;
alldone++;
for(z=0;z<resourceCount;z++){//add the allocated to the available
availnew[z]=availnew[z]+temp->alloc[z];
printf("avil: %d",availnew[z]);
}
}
temp=temp->next;//and go to next node(also needed for else)
}
}
if(alldone!=processCount)
printf("not safe");
else
printf("safe");
}
Я открыт для всех советов (организация... и т. Д.), Даже если мне проголосуют за возможно простое решение, которое я не смог найти в Google.
1 ответ
Хорошо, цикл while должен завершиться, когда он достигнет конца связанного списка (temp!= NULL) или когда текущий процесс завершен (temp -> finish = 1).
Проблема в том, что если в связанном списке есть процесс, который уже завершен?
Я могу предложить два решения:
- удалить задачу из текущего связанного списка: если вам не нужна задача, ее можно удалить из связанного списка. Но это может стать довольно сложным.
- используйте другую переменную-флаг: переменную- флаг, которая сообщает, завершается ли в текущей итерации цикла конкретный процесс (любой процесс) или нет.
это демонстрационный код для ситуации, которую мы имеем:
Нынешнее состояние:
for(i = 0; i < numberOfNodes; i++) {
temp = listHead;
while(temp != NULL && temp -> finish != 1) {
//check resource availability here
if(executionPossible = 1) { // Process can be executed
//print process id here
temp -> finish = 1;
//update number of available resources
}
temp = temp -> next;
}
}
Мое решение (второе):
for(i = 0; i < numberOfNodes; i++) {
int currentFinished = 0;
temp = listHead;
while(temp != NULL && currentFinished != 1) {
//check resource availability here
if(executionPossible = 1) { // Process can be executed
//print process id here and mark/set process as finished
temp -> finish = 1;
currentFinished = 1;
//update number of available resources
}
temp = temp -> next;
}
}
PS: Это мой первый ответ на переполнение стека. Отзывы приветствуются.