单链表排序

小咪咪 2022-05-08 07:00 350阅读 0赞

算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后一次扫描剩下的结点p(直至p==NULL为止),在有序表中通过比较查找插入p的前驱结点pre,然后将p插入到*pre之后
核心代码

  1. void Sort(LinkList *L){
  2. LinkList *p,*r,*pre;
  3. p=L->next;
  4. r = p->next; //保持r是p的后继结点,以保证不断链
  5. p->next = NULL; //构造一个只有一个数据结点的有序表 就是让一个有序表的长度为1
  6. p=r;
  7. while(p){
  8. r=p->next; //保存p的后继结点指针
  9. pre = L;
  10. while(pre->next!=NULL && pre->next->data < p->data)
  11. pre = pre->next;
  12. p->next = pre->next;
  13. pre->next = p;
  14. p = r; //扫描剩下的结点
  15. }
  16. display(L);
  17. }

运行代码

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. struct LinkList{
  6. int data;
  7. struct LinkList *next;
  8. };
  9. void display(LinkList *L){
  10. if (L->next)
  11. {
  12. printf("%d ",L->next->data);
  13. display(L->next);
  14. }else{
  15. printf("\n");
  16. }
  17. }
  18. void Sort(LinkList *L){
  19. LinkList *p,*r,*pre;
  20. p=L->next;
  21. r = p->next; //保持r是p的后继结点,以保证不断链
  22. p->next = NULL; //构造一个只有一个数据结点的有序表 就是让一个有序表的长度为1
  23. p=r;
  24. while(p){
  25. r=p->next; //保存p的后继结点指针
  26. pre = L;
  27. while(pre->next!=NULL && pre->next->data < p->data)
  28. pre = pre->next;
  29. p->next = pre->next;
  30. pre->next = p;
  31. p = r; //扫描剩下的结点
  32. }
  33. display(L);
  34. }
  35. int main(){
  36. LinkList *L = (struct LinkList *)malloc(sizeof(struct LinkList));
  37. int a[] = {1,5,2,7,4,7,8,54,8,34,8,3,8,3};
  38. int n = sizeof(a)/(sizeof(int));
  39. int h = 0;
  40. L->next = NULL;
  41. LinkList *p;
  42. for (int i=0;i<n;i++)
  43. {
  44. p = (struct LinkList *)malloc(sizeof(struct LinkList));
  45. p->data =a[h++];
  46. p->next = L->next;
  47. L->next = p;
  48. }
  49. Sort(L);
  50. return 0;
  51. }

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目。单链表排序的关键是[交换][Link 1]算法,需要额外考虑。选择排序是比较直观的排序算法之

    相关 排序方法

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目。单链表排序的关键是[交换][Link 1]算法,需要额外考虑。选择排序是比较直观的排序算法之一,这里就

    相关 12.排序

    思路1: 将链表中的数据存入数组中,使用数组进行排序,排好后再存入链表中。 当然这并不是这题所要考察的。但是在实际应用中却相当有价值。因为链表中的排序算法都比

    相关 排序

    算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后一次扫描剩下的结点p(直至p==NULL为止),在有序表中通过比较查找插入p的前驱结点pre,然后