#includestruct student { //建立结构体变量struct student long num; float score; struct student *next }; int n; struct student *insert(struct student *head, struct student *stud) //函数的参数是head和stud,head是为了指向表头, //stud目的是将待插入结点的地址从实参传给stud { struct student *p1; struct student *p2; struct student *p0; //定义三个结构体变量,其中p0为带插入点的地址 p1 = head; p0 = stud; if(head==NULL){ //原链表为空,即原来无结点,只需让head直接等于p0 head = p0; //并且让p0的next指向空地址,即只含一个结点 p0->next = NULL; } else { //若链表不为空,则分为两种情况 while ((p0->num > p1->num) && p1->next != NULL) //其中一种情况是插入的结点既不在第一个,也不在最后一个,即插入的点在中间 { //让p2等于p1,且让p1指向下一个结点 p2 = p1; //一直找到p0小于等于p1为止,即p0需在p1的前面 p1 = p1->next; } if (p0->num <= p1->num) { //当结点p1前面的情况 if(p1==head) { //判断p1是否是表头,即判断p0是否要插在第一个表头的位置 head == p0; //若是,直接让head=p0 p0->next = p1; } else { //p1不是表头,则一定做了while循环,就会有p2的值 p2->next = p0; //则让p0插在p2和p1之间 p0->next = p1; } } else { //插入的结点在表尾的情况 p1->next = p0; //则让p1的next指向p0,p0后面没有结点了,即next指向空地址 p0->next = NULL; } n = n + 1; //结点数加1 return(head); } }



