【发布时间】:2015-04-20 18:30:01
【问题描述】:
您好,我正在尝试将我创建的结构按 PID 编号按升序插入到列表中。这是我的代码:
#include <stdlib.h> //for malloc and rand
#include <stdio.h>
struct PCB
{
struct PCB *Next_PCB ;
int PID ;
}*head;
struct PCB *ptr, *tmp, *tmp1;
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)
{
if (Head->Next_PCB == Head) {
Head = Add;
}
}
void print_list(struct PCB *Head)
{
while (Head != NULL) {
if (Head->Next_PCB != NULL) {
printf("PID: %d\n", Head->PID);
Head = Head->Next_PCB;
} else {
printf("PID: %d\n", Head->PID);
break;
}
}
}
尽管insert_ordered() 似乎应该在添加元素之前打印一次,但它不会显示输出:
PID:0
另外,我将如何正确地将元素插入到 LinkedList 中?我目前有:
while (Head != NULL) {
if (Head->Next_PCB != NULL) {
if (Add->PID > Head->PID) {
Head = Head->Next_PCB;
printf("pid bigger: %d than current pid: %d\n", Add->PID, Head->PID);
} else if (Add->PID == Head->PID) {
//Head->Next_PCB = Add;
printf("adding pid equal: %d to current pid: %d\n", Add->PID, Head->PID);
} else if (Add->PID < Head->PID) {
//Head->Next_PCB = Add;
printf("adding pid smaller: %d than current pid: %d\n", Add->PID, Head->PID);
}
} else {
Head->Next_PCB = Add;
}
}
这不能正常工作。这可能是我最初的 if 语句没有正确捕获的结果,但无论哪种方式我都很难过。
提前致谢,SOF。
【问题讨论】:
-
Head = Addininsert_ordered并不像你认为的那样。它将Add中保存的地址分配给Head指针。为Head(ptr在main())传递的调用者的指针是按值传递的,因此是不变的。此外,ptr引用的已分配节点的Next_PCB成员从未初始化,并调用 未定义行为 进行评估。 -
还是想不通:/