void MySort(StudentNode** s){ StudentNode* p = *s;StudentNode* temp; int lenth = 0; // 判断特殊情况 长度为1 if((p -> next == NULL)) { printf("长度为1,无需排序!\n"); return; } // 判断特殊情况 长度为2 if((p -> next -> next == NULL)) { if(p->ID < p->next->ID){ temp = p; // 保存头节点 *s = (*s)->next; // 头节点换为下一个节点 (*s)->next = temp; (*s)->next->next = NULL; } printf("排序完成! \n"); return; } // 获取长度 while(1) { lenth++; if(p->next == NULL){ // 退出 break; } p = p->next; } printf("长度为%d !\n", lenth); // 冒泡排序 StudentNode* head = *s; StudentNode* pre = *s; // 当前 StudentNode* cur = (*s)->next; // 当前 +1 StudentNode* next = (*s)->next->next; // 当前 + 2 StudentNode* end = NULL; for (int i = lenth; i >= 0; i--) { pre = head; cur = pre->next; next = cur->next; while(next != NULL) { if (cur->ID > next->ID) { cur->next = next->next; pre->next = next; next->next = cur; next = cur->next; pre = pre->next; } else { pre = pre->next; cur = cur->next; next = next->next; } } } // 头结点 排序 head = *s; cur = *s; // 当前 // cur到尾巴 while(cur->next != NULL){ // 大于上一个,小于下一个 if(head->ID > cur->ID && head->ID < cur->next->ID ){ // 头节点换为下一个节点 *s = (*s)->next; // 插入 head temp = cur->next; cur->next = head; head->next = temp; printf("头排序完成!\n"); printf("排序完成!\n"); return; } cur = cur->next; // 往下走 } // 单独比较尾巴 if(head->ID > cur->ID){ // 头节点换为下一个节点 *s = (*s)->next; cur->next = head; head->next = NULL; printf("头排序完成!\n"); } printf("排序完成!\n"); }
时间: 2024-03-22 10:40:51 浏览: 51
java选择排序等排序算法资源:java排序算法源代码(包括冒泡排序,选择排序,插入排序)
这是一个使用冒泡排序算法对链表中的学生节点按照ID从小到大进行排序的函数。该函数接受一个指向指针的指针,表示链表的头部指针的地址。
该函数首先判断特殊情况,如果链表长度为1或2,则无需排序,直接返回。然后通过遍历链表计算链表长度,并输出长度信息。接着使用冒泡排序算法对链表中的学生节点进行排序,直到链表中所有节点都按照ID从小到大排列。
最后,考虑头结点和尾节点的特殊情况。如果头节点比第二个节点小,则头节点不需要移动;否则,将头节点换为下一个节点。如果头节点比尾节点大,则将头节点移动到尾部。
注意:该函数中的printf语句只是为了输出调试信息,实际使用时可以删除。
阅读全文