一.废话不多说,直接上代码。如果想看双向循环链表的朋友,可以在我的博客里找。
你好
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }node; //生成一个节点 node *initList(void) { node *new = malloc(sizeof(node)); if(!new) { printf("malloc fail!\n"); return NULL; } new->data = 0; new->next = NULL; return new; } //头插法 void head_insert(node *head, node *new) { new->next = head->next; head->next = new; } //遍历 node *traverse(node *head) { for(node *p = head->next; p; p = p->next) { printf("%d ", p->data); } printf("\n"); } //冒泡排序,最优版本 void bubble_sort(node *head) { int flag; node *p, *prev, *tail; tail = NULL; //tail以及tail后面的是排好序的元素,第一次还没有排好,所以为NULL while(1) { flag = 1; //flag用来标志是否已经排好序 //每次从head->next开始遍历,直到tail结束, prev是p的前驱节点 for(prev = head, p = head->next; p && p->next != tail; prev = prev->next) { //交换后,p已经移动到后面,不需要再遍历下一个 if(p->data > p->next->data) { flag = 0; //修改flag=0,标志本轮循环交换过 prev->next = p->next; //弹出p节点 p->next = p->next->next; //插入p节点 prev->next->next = p; //原来的p->next已经修改,需要用prev->next代替 } else //没有交换就继续遍历下一个 { p = p->next; } } printf("本轮排序移动出的最大值:%d\n", p->data); traverse(head); ////显示每一轮排序结果 if(flag) //如果内层循环中都没有交换过,则所有节点都已经是排好序的 { printf("冒泡排序结束!\n"); break; } tail = p; //tail向前移一个,tail以及tail后面的是排好序的元素 } } //选择排序,初级版本 void choose_sort1(node *head) { node *p, *q, *max, *prior; p = malloc(sizeof(node)); //生成一个p节点 p->next = head->next; //p取代head head->next = NULL; //head是空链表 while(p->next) { prior = p; max = prior->next;

本文详细介绍了单链表的四种排序方法:选择排序、冒泡排序、插入排序和快速排序。每种方法均附带代码实现及分析,帮助读者深入理解单链表排序的原理与技巧。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



