冒泡排序~链表

#include

typedef struct node
{
    int data;
    struct node *next;
} linknode,*link;

link creatLink(link head)          //创建链表
{
    link p,r;
    int x;
    r=head;
    scanf("%d",&x);
    while(x!=-1)
    {
        p=(link)malloc(sizeof(linknode));
        p->data=x;
        r->next=p;
        r=p;
        scanf("%d",&x);
    }
    r->next=NULL;
    return head;
}

void printLink(link head)            //打印链表
{
    link p;
    p=head->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

link bubSort(link head)            //冒泡排序         
{
    link p,x,y,max=NULL;
    while(max!=head->next->next)
   {
       for(p=head;p->next->next != max;p=p->next)
    {
       if(p->next->data > p->next->next->data)
       {
           x=p->next;
           y=p->next->next;
           p->next=y;
           x->next=y->next;
           y->next=x;                    //指针换向
       }
    }
    /*
       * max始终指向此趟排序所确定的最大值
       * max在每趟排序结束后都向前移动一个结点,直到和头结点相差一个节点后停止排序。
       * 比较的次数总是链表个数-1。
       * 利用max指针排序则不需要知道链表元素的个数,并且每趟排序的次数越来越少。
    */
    max=p->next;
   }
   return head;

}

int main()
{
    link head;
    link creatLink(link head);      //创建链表
    void printLink(link head);      //打印链表
    link bubSort(link head);        //冒泡排序
    
    head=(link)malloc(sizeof(linknode));   //创建头结点
    head->next=NULL;
    
    head=creatLink(head);
    printLink(head);
    head=bubSort(head);

    printLink(head);

    return 0;

}

你可能感兴趣的:(数据结构与算法)