26.png

    1. /*
    2. 有一个带头结点的单链表L,设计一个算法使其递增有序
    3. 分析:
    4. 我们可以采用冒泡排序对其操作,使其递增有序,时间复杂度为O(n^2)。
    5. */
    6. struct Link {
    7. int data;
    8. struct Link *next;
    9. };
    10. #define _CRT_SECURE_NO_WARNINGS
    11. #include <stdio.h>
    12. #include <stdlib.h>
    13. void bubbleSort(Link *h) {//冒泡排序
    14. int flag = 0;//排序标志,产生过变动就置为1
    15. int count = 0;//记录链表长度
    16. struct Link *pre=h, *p = h->next,*r;
    17. while (p) {
    18. count++;
    19. p = p->next;
    20. }
    21. p = h->next;
    22. for (int i = 0; i < count;i++) {
    23. flag = 0;
    24. while (p->next) {//开始第i+1轮冒泡
    25. if (p->data > p->next->data) {//前者大于后者,则需要交换
    26. r = p->next->next;//r指向下一个节点,防止断链
    27. pre->next = p->next;
    28. p->next->next = p;
    29. pre = p->next;
    30. p->next = r;
    31. flag = 1;//有改动,flag置为1
    32. }
    33. else {
    34. pre = p;
    35. p = p->next;
    36. }
    37. }
    38. if (!flag) break;//若某一轮链表未作变换,则认定已经排好序,退出循环
    39. pre = h;//重新从头开始遍历
    40. p = h->next;
    41. }
    42. }
    43. int main() {
    44. Link* createLink(int);
    45. struct Link *head;
    46. head = createLink(0);
    47. bubbleSort(head);
    48. printf("排序后链表值为:");
    49. while (head->next) {
    50. printf("%d ", head->next->data);
    51. head = head->next;
    52. }
    53. return 0;
    54. }