for(int i=0;i<num;i++){ shortest=MAX; for(int j=0;j<num;j++){ //比较得出最近的磁道 if(visit[j]){ if(fabs(su-s[j])<shortest){ shortest=fabs(su-s[j]); k=j; } } }
时间: 2024-03-03 20:52:35 浏览: 16
补充一下,这段代码实现的是SCAN算法中的扫描过程,即从当前磁头位置su开始,向磁道序列的两端扫描,并找到最近的未访问磁道。具体实现过程如下:
1. 初始化shortest为一个较大的值,以保证第一次循环能够找到最近的未访问磁道。
2. 循环遍历所有的磁道,查找最近的未访问磁道。
3. 如果当前磁道已经被访问过,则跳过该磁道。
4. 如果当前磁道未被访问过,计算当前磁头到该磁道的距离,并与shortest进行比较,如果该距离更短,则更新shortest和k的值。
5. 循环结束后,k保存的就是最近的未访问磁道的下标。
需要注意的是,在SCAN算法中,磁头的移动方向是从当前位置开始,向磁道序列的两端移动,直到到达最边缘,然后再掉头继续移动,直到访问完所有的磁道。因此,在实际的算法实现中,需要先确定磁头的移动方向,然后再根据方向进行磁道的扫描。
相关问题
memset(visit,1,sizeof(visit));//数组初始化为1 ,表示所有磁道都未被访问 su=kai; sum=0; for(int i=0;i<num;i++){ shortest=MAX; for(int j=0;j<num;j++){ //比较得出最近的磁道 if(visit[j]){ if(fabs(su-s[j])<shortest){ shortest=fabs(su-s[j]); k=j; } } }
根据你给出的代码,我猜测你想要问的是这段代码的作用是什么,对吗?
这段代码的作用是寻找离当前磁道位置(变量su)最近的未被访问过的磁道(数组s中的元素),并将其下标赋值给变量k。具体来说,它遍历了数组s中的所有元素,如果该元素对应的磁道未被访问过(visit[j]为真),则计算该磁道与当前磁道位置的距离,并将其与之前计算的最短距离(变量shortest)进行比较,如果该距离更短,则更新shortest和k的值。最终,变量k对应的磁道就是离当前磁道位置最近的未被访问过的磁道。
void ShortestPath_DIJ(MGraph G,int v0,int(*P)[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int(*D)[MAX_VERTEX_NUM]) { int v,w,i,min,j; int final[MAX_VERTEX_NUM]; for (v=0;v<G.vexnum;++v) { final[v]=FALSE; D[v]=G.arcs[v0][v].adj; for (w=0;w<G.vexnum;++w)//设空路径 { P[v][w]=FALSE; } if (D[v]<INFINITY) { P[v][v0]=TRUE; P[v][v]=TRUE; } } D[v0]=0; final[v0]=TRUE;//初始化,v0顶点属于S集 //开始主循环,每次求得v0到某个顶点的最短路径 for (i=1;i<G.vexnum;++i)//其余顶点 { min=INFINITY; for(w=0;w<G.vexnum;++w) { if (final[w]!=TRUE)//w顶点在V-S中 if (D[w]<min)//找离V0最近的点 { v=w; min=D[w]; } } final[v]=TRUE; for (w=0;w<G.vexnum;++w)//更新当前最短路径及距离 if (final[w]!=TRUE&&(min+G.arcs[v][w].adj<D[w])) { D[w]=min+G.arcs[v][w].adj; for (j=0;j<G.vexnum;++j) { P[w][j]=P[v][j]; } P[w][w]=TRUE;//p[w]=p[v]+[w]更换路径 } } }修改为c语言代码
好的,这是修改后的C语言代码:
```c
void ShortestPath_DIJ(MGraph G, int v0, int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM], int D[MAX_VERTEX_NUM]) {
int v, w, i, min, j;
int final[MAX_VERTEX_NUM];
for (v = 0; v < G.vexnum; ++v) {
final[v] = FALSE;
D[v] = G.arcs[v0][v].adj;
for (w = 0; w < G.vexnum; ++w) {
P[v][w] = FALSE;
}
if (D[v] < INFINITY) {
P[v][v0] = TRUE;
P[v][v] = TRUE;
}
}
D[v0] = 0;
final[v0] = TRUE;
for (i = 1; i < G.vexnum; ++i) {
min = INFINITY;
for (w = 0; w < G.vexnum; ++w) {
if (final[w] != TRUE) {
if (D[w] < min) {
v = w;
min = D[w];
}
}
}
final[v] = TRUE;
for (w = 0; w < G.vexnum; ++w) {
if (final[w] != TRUE && (min + G.arcs[v][w].adj < D[w])) {
D[w] = min + G.arcs[v][w].adj;
for (j = 0; j < G.vexnum; ++j) {
P[w][j] = P[v][j];
}
P[w][w] = TRUE;
}
}
}
}
```
其中,MAX_VERTEX_NUM是顶点的最大个数,INFINITY表示无穷大。注意,这里的P数组存储的是布尔型值,表示是否经过了该顶点;而D数组存储的是最短路径的长度。