C在链接列表的开头插入元素

我用C编写了一个程序,用于按升序将结构插入到链表中。

问题是没有插入我的两个最低值(1和2)。 这是因为我目前没有工作处理程序来检查链表的第一个值是否已大于给定值。

这是我的function:

struct PCB { struct PCB *Next_PCB ; int PID ; }; void insert_ordered (struct PCB *Head, struct PCB *Add) { tmp = 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 PID) { if (Add->PID == 1 || Add->PID == 2) { printf("found 1 or 2"); printf("count: %d", count); } int ct = 0; while (tmp != NULL) { if (count == 0) { printf("made it, %d", ct); Add->Next_PCB = tmp; break; } else 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); } 

这是打印出列表后的输出:

 pid : 6 pid : 17 pid : 15 pid : 13 pid : 15 pid : 6 pid : 12 pid : 9 found 1 or 2count: 0made it, 0pid : 1 found 1 or 2count: 0made it, 0pid : 2 pid : 7 pid : 10 pid : 19 ------------------- PID: 6 PID: 6 PID: 7 PID: 9 PID: 10 PID: 12 PID: 13 PID: 15 PID: 15 PID: 17 PID: 19 

输出应该在两个六个之前有1和2。 有人可以帮帮我吗? 谢谢。

void insert_ordered (struct PCB *Head, struct PCB *Add) :无法替换此接口中元素的头部。 因此,您需要虚拟元素中的第一个元素(Anchor节点不是保留的内容)。
以下是一个具体的例子:

 #include  #include  struct PCB{ struct PCB *Next_PCB ; int PID ; }; struct PCB *new_PCB(int PID){ struct PCB *pcb = malloc(sizeof(*pcb)); if(pcb != NULL){ pcb->Next_PCB = NULL; pcb->PID = PID; } return pcb; } void insert_ordered (struct PCB *Head, struct PCB *Add){ if(Head == NULL) return ;//can't struct PCB *prev = Head, *curr = Head->Next_PCB; /* this is reduced to following while-loop if(Head->Next_PCB == NULL){//empty list Head->Next_PCB = Add; return ; } if(Add->PID <= curr-> PID){//Add node <= Top node prev->Next_PCB = Add; Add->Next_PCB = curr; return ; } */ while(curr != NULL && curr->PID < Add->PID){ prev = curr; curr = curr->Next_PCB; } prev->Next_PCB = Add; Add->Next_PCB = curr; } void print(struct PCB *Head){ if(Head == NULL) return ; else Head = Head->Next_PCB; while(Head != NULL){ printf("PID: %d\n", Head->PID); Head = Head->Next_PCB; } } //alias #define Make_list() new_PCB(-1) int main(void){ struct PCB *head = Make_list(); //struct PCB *head = new_PCB(-1);//dummy node, This is intended to holds a list. insert_ordered (head, new_PCB( 6)); insert_ordered (head, new_PCB(17)); insert_ordered (head, new_PCB(15)); insert_ordered (head, new_PCB(13)); insert_ordered (head, new_PCB(15)); insert_ordered (head, new_PCB( 6)); insert_ordered (head, new_PCB(12)); insert_ordered (head, new_PCB( 9)); insert_ordered (head, new_PCB( 1)); insert_ordered (head, new_PCB( 2)); insert_ordered (head, new_PCB( 7)); insert_ordered (head, new_PCB(10)); insert_ordered (head, new_PCB(19)); print(head); //release list return 0; } 

或者您需要像排序一样交换内容。