gpt4 book ai didi

c - 重申链表(银行家算法)

转载 作者:行者123 更新时间:2023-11-30 17:14:01 25 4
gpt4 key购买 nike

我正在制作一个简单的银行家算法模拟器。当我将需求与可用资源进行比较时,它在 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");
}

我对所有提示(组织等)持开放态度,即使我因在谷歌上找不到的可能简单的解决方案而被否决。

最佳答案

好吧,当 while 循环到达链表末尾(temp != NULL)或当前进程处于运行状态时,需要终止 while 循环。完成(温度 -> 完成 = 1)。

问题是如果链表中有一个进程已经结束了怎么办?

我可以建议两种解决方案:

  1. 从当前链接列表中删除任务:如果您不这样做如果需要该任务,可以将其从链接列表中删除。但这可能会变得相当复杂。
  2. 使用不同的标志变量:标志变量告诉在 while 循环的当前迭代中,特定进程(任何进程)是否完成。

这是我们所遇到的情况的演示代码:

当前状况:

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:这是我关于堆栈溢出的第一个答案。欢迎反馈。

关于c - 重申链表(银行家算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30502681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com