C Insérer un élément au début de la liste chaînée

J’ai écrit un programme en C conçu pour insérer des structures dans un ordre croissant dans une liste chaînée.

Le problème est qu’il n’insère pas mes deux valeurs les plus basses (1 et 2). Cela est dû au fait que je n’ai actuellement aucun gestionnaire en état de vérifier si la première valeur de la liste liée est déjà supérieure à la donnée.

Voici ma fonction:

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); } 

Voici ma sortie après avoir imprimé la liste:

 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 

La sortie DEVRAIT avoir un 1 et un 2 avant les deux six. Quelqu’un peut-il m’aider? Merci.

void insert_ordered (struct PCB *Head, struct PCB *Add) : Il n’est pas possible de remplacer la tête des éléments dans cette interface. Donc, vous avez besoin du premier élément des éléments factices (nœud d’ancrage qui n’est pas le contenu prévu de la conservation).
Voici un exemple spécifique:

 #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; } 

Ou vous devez échanger le contenu comme une sorte.