我正在寻找创建一种方法来按PID的升序插入结构。
我一直在检查其他线程,并且我已经像其他人提到的那样写了一些东西,但是在编译Next_PCB
并输入冲突时我遇到了错误。
struct PCB
{
struct PCB *Next_PCB;
int PID;
};
struct PCB *ptr, *tmp;
void insert_ordered (struct PCB *, struct PCB *);
void print_list(struct PCB *);
main()
{
int num_structs, i;
ptr = (struct PCB *) malloc (sizeof (struct PCB));
num_structs = 10 + (rand() % 10);
for ( i = 0; i < num_structs; i++)
{
tmp = (struct PCB *) malloc (sizeof(struct PCB));
tmp->PID = rand() % 20;
tmp->Next_PCB = NULL;
insert_ordered(ptr, tmp);
}
print_list(ptr);
}
void insert_ordered (struct PCB *Head, struct PCB *Add)
{
struct PCB* new;
if(*Head == NULL || *Head->PID >= Add->PID)
{
Add->Next_PCB = *Head;
*Head = Add;
}
else
{
new = *Head;
while (new ->Next_PCB!=NULL && new->Next_PCB->PID < Add -> PID)
{
new = new->Next_PCB;
}
Add->Next_PCB = new->Next_PCB;
new->Next_PCB = Add;
}
}
函数insert_ordered
是问题发生的地方,我处理结构的方式是导致问题的原因所以我很好奇我对方法本身的错误以及结构。
答案 0 :(得分:0)
您在问为什么编译器不喜欢insert_ordered()中的代码。
当我将代码提交给GCC时,它有5个函数问题,所有这些都是因为当*Head
是[{1}}的实例时,你将struct PCB
视为指针。
*Head
不是指针,使其成为函数原型应具有struct PCB **Head
的指针。然后Head
是指向指针的指针:它指向调用者拥有的变量,而该调用者又是指向列表头部的指针。
所以,代码是:
void insert_ordered (struct PCB **Head, struct PCB *Add)
{
struct PCB* new;
if ((*Head == NULL) || ((*Head)->PID >= Add->PID))
{
Add->Next_PCB = *Head;
*Head = Add;
}
else
{
new = *Head;
while ((new->Next_PCB != NULL) && (new->Next_PCB->PID < Add->PID))
{
new = new->Next_PCB;
}
Add->Next_PCB = new->Next_PCB;
new->Next_PCB = Add;
}
}
当然,insert_ordered()的调用必须更改为insert_ordered(&ptr, tmp) ;
这是有效的,但正如Benjy所说,这不是一个很好的算法。我认为这是一个学习练习,在下一课中你将看到一个二叉树。
顺便说一句,在if ((*Head == NULL) || ((*Head)->PID >= Add->PID))
中我添加了一些不必要的括号。这是因为,尽管没有括号的代码对编译器来说是明确的,但它让我的一些同事感到困惑。额外的括号使它更具可读性......除非你得到太多。但需要(*Head)->PID
中的括号。
答案 1 :(得分:0)
至少有一些我可能没有找到的问题,但这就是我所看到的: