且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C 在链表的开头插入元素

更新时间:2022-06-16 02:18:31

void insert_ordered (struct PCB *Head, struct PCB *Add) : 无法替换元素的头部这个界面.所以,你需要把第一个元素中的dummy元素(Anchor node即不是预期的内容持有).
下面是一个具体的例子:

void insert_ordered (struct PCB *Head, struct PCB *Add) : It is not possible to replace the head of the elements in this interface. So, you need to the first element in the dummy elements(Anchor node that is not intended contents of the holding).
The following is a specific example:

#include <stdio.h>
#include <stdlib.h>

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
", 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;
}

或者你需要像排序一样交换内容.

Or you need to swap the contents like a sort.