我有一个像这样的函数,它应该按PID编号按升序将给定节点插入到链表中。
如果PID数字是数组中最低的,那么它自然会将新元素作为列表中的第一个。
问题在于它没有按预期工作。我使用if()
语句检查计数是否为0,因为如果是,那么我的新元素的PID不大于索引为0的元素。因此,必须在索引0处插入新元素。
现在我在if中的代码没有正确地添加元素,有时当我尝试不同的代码时,我得到了分段错误。
注意: 我无法更改任何功能参数,必须使用我为结构提供的功能。
struct PCB
{
struct PCB *Next_PCB ;
int PID ;
};
void insert_ordered (struct PCB *Head, struct PCB *Add)
{
struct PCB *tmp1 = Head;
if (Head->PID == 0) {
Head->PID = Add->PID;
} else {
if (Head->Next_PCB == NULL) {
Head->Next_PCB = Add;
} else {
int count = 0;
while (Head != NULL) {
if (Add->PID > Head->PID) {
if (Head->Next_PCB != NULL) {
Head = Head->Next_PCB;
count++;
} else {
Head->Next_PCB = Add;
break;
}
} else if (Add->PID == Head->PID) {
Add->Next_PCB = Head->Next_PCB;
Head->Next_PCB = Add;
break;
} else if (Add->PID < Head->PID) {
if (Add->PID == 1 || Add->PID == 2) {
printf("found 1 or 2");
printf("count: %d", count);
}
int ct = 0;
while (tmp != NULL) {
if (ct == 0) {
/* ERROR!!!!!!!!*/
Add->Next_PCB = (*tmp1);
(*tmp1) = Add;
break;
}
if (ct == (count - 1)) {
Add->Next_PCB = Head;
tmp->Next_PCB = Add;
break;
}
tmp = tmp->Next_PCB;
ct++;
}
break;
}
}
}
}
printf("pid : %d\n", Add->PID);
}
提前致谢!