链表的冒泡排序。

  1. /**编写一个程序,根据test_data[]数组中给定的整数序列建立一个单链表,
  2. 然后对该单链表进行排序(元素数值从大到小排列),最后显示排序后的结果
  3. **/

  4. /**算法思路
  5.  本程序由两个函数组成,create()函数用于根据数组的元素建立一个单链表;sort()函数对该链表进行排序,其原理是:
  6.  用p指针遍历所有结点,其前是已排序好的结点,其后是待排序的结点,从该链表中找出一个data值最小的结点并删除之,
  7.  将删除结点插入到p所指结点的后面。 采用两重循环完成排序工作,外层while判定是否还有待排序的结点,没有则退出循环,
  8.  排序工作完成,有待排序结点时,则执行循环体一次,进行排序。实现本题功能的程序如下:
  9. **/

  10. #include <stdio.h>
  11. #include <stdlib.h> 
  12. typedef struct linknode
  13. {
  14.    int data;
  15.    struct linknode *next;
  16. }node;

  17. node *create(int a[],int n)
  18. {
  19.         node *h,*q;
  20.         for(h=NULL;n;n--)
  21.         {
  22.              q=(node*)malloc(sizeof(node));
  23.              q->data=a[n-1];
  24.              q->next=h;
  25.              h=q;
  26.         }
  27.         return h;
  28. }

  29. void sort(node **h)
  30. {
  31.    node *p,*q,*r,*s,*h1;
  32.    h1=p=(node*)malloc(sizeof(node));
  33.    p->next=*h;
  34.    while(p->next!=NULL)
  35.    { 
  36.      q=p->next;
  37.      r=p;
  38.      while(q->next!=NULL)
  39.      {
  40.      if(q->next->data<r->next->data)
  41.          r=q;
  42.      q=q->next;
  43.      }
  44.        if(r!=p)
  45.      { 
  46.          s=r->next;
  47.          r->next=s->next;
  48.          s->next=p->next;
  49.          p->next=s;
  50.      }
  51.         p=p->next;
  52.    }
  53. *h1->next;
  54. free(h1);
  55. }

  56. int test_data[]={5,9,3,1,2,7,8,6,4};

  57. main()
  58. {
  59.    node *h,*p;
  60.    h=create(test_data,sizeof(test_data)/sizeof(int));

  61.     printf("排序前:\n");
  62.     for(p=h;p;p=p->next)
  63.       printf("%2d",p->data);
  64.     printf("\n");
  65.     sort(&h);
  66.     printf("排序后:\n");
  67.     for(p=h;p;p=p->next)
  68.          printf("%2d",p->data);
  69.      printf("\n");
  70.      return 0;
  71. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值