我想知道以下代码中p2的定义while (head->next != tail) { p1 = head; p2 = p1->next; while (p2 != tail) { if (p1->total < p2->total) { // swap nodes struct student *tmp = p1->next; p1->next = p2; p2 =
时间: 2023-04-08 10:03:31 浏览: 113
p2->next = tmp;
p1->next = tmp->next;
tmp->next = p2;
swapped = 1;
}
p1 = p2;
p2 = p2->next;
}
tail = p1;
if (!swapped) {
break;
}
head = head->next;
}
p2是一个指向结构体student的指针变量,它的定义在while循环的外部,它的作用是在while循环中用来交换节点。
相关问题
创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的学生学号和成绩打印输出。下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。改错时不能改变程序原有的意图。 注意:将修改后的完整的源程序写在答题区内。 #include <stdio.h> #define SIZE sizeof(struct node) struct node { long num; float score; struct node *next; } int main() { int n = 0; struct node *head = NULL, *p1, *p2; p1 = p2 = (struct node*)malloc(SIZE); printf("Input %d node data:\n", n + 1); scanf("%d%f", &p1->num, &p1->score); while (p1->num != 0) {
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
int num;
int grade;
struct student *next;
}STU;
int main(){
STU *head, *tail, *p;
head = (STU*)malloc(sizeof(STU));
head->next = NULL;
printf("please input the score (num grade):");
tail = head;
while(1){
p = (STU*)malloc(sizeof(STU));
scanf("%d", &p->num);
if(p->num == 0){
break;
}
scanf("%d", &p->grade);
tail->next = p; // 错误:没有将 p 链接到尾节点上,导致只有第一个节点被链接
tail = p;
}
printf("\nnum\tgrade\n");
p = head->next; // 错误:没有将 p 指向链表的第一个节点
while(p != NULL){
printf("%d\t%d\n", p->num, p->grade);
p = p->next;
}
return 0;
}
```
public class FCFS { public static void main(String[] args) { Process head = null, tail = null; // 链表头和尾 head = tail = new Process("P1", 10, 0); tail.next = new Process("P2", 5, 1); tail = tail.next; tail.next = new Process("P3", 8, 2); tail = tail.next; tail.next = new Process("P4", 3, 3); tail = tail.next; int time = 0; // 当前时间 int finished = 0; // 已完成的进程数 double sumTurnaroundTime = 0; // 总周转时间 double sumWaitTime = 0; // 总等待时间 // 执行进程 while (finished < 4) { // 找到未执行的进程中到达时间最早的进程 Process p = null, prev = null, q = head; while (q != null) { if (q.state == 0 && (p == null || q.arriveTime < p.arriveTime)) { p = q; prev = prev == null ? head : prev.next; } q = q.next; } // 如果当前时间小于进程的到达时间,等待进程到达 if (time < p.arriveTime) { time = p.arriveTime; } // 执行进程 p.state = 1; time += p.runTime; p.state = 2; finished++; // 计算周转时间和等待时间 double turnaroundTime = time - p.arriveTime; sumTurnaroundTime += turnaroundTime; double waitTime = turnaroundTime - p.runTime; sumWaitTime += waitTime; // 从链表中删除已完成的进程 if (prev == null) { head = p.next; } else { prev.next = p.next; } } // 计算平均周转时间和平均等待时间 double avgTurnaroundTime = sumTurnaroundTime / 4; double avgWaitTime = sumWaitTime / 4; // 输出结果 System.out.println("进程名\t状态\t运行时间\t到达时间"); Process p = head; while (p != null) { System.out.println(p.name + "\t" + p.state + "\t" + p.runTime + "\t\t" + p.arriveTime); p = p.next; } System.out.println("平均周转时间:" + avgTurnaroundTime); System.out.println("平均等待时间:" + avgWaitTime); } }为什么结果只有进程1的状态
根据你提供的代码,我们可以看到在输出每个进程的状态时,只输出了进程名、状态、运行时间、到达时间四个字段,没有输出其他字段,比如进程的状态转换信息等。因此,在输出结果时只能看到每个进程的最终状态,而无法看到每个进程的状态转换过程。
另外,可能的原因是在程序执行过程中,其他进程的状态没有被正确更新,导致只有进程1的状态被正确输出。你可以加入调试信息,打印出每个进程在程序执行过程中的状态,以便更好地排查问题。
阅读全文