单链表的排序

#include<iostream>
using namespace std;

typedef struct node
{
      int data;
      struct node *next;
}Node,*List;

List createList()
{
      Node *head,*p1,*p2;
      p1=p2=head=new Node;

      int num;
      cin>>num;
      while(-1!=num)
      {
           p1=new Node;
           p1->data=num;
           p2->next=p1;
           p2=p1;
           cin>>num;
      }
      p2->next=NULL;
      return head;
}


int getLength(List q)
{
       int length=0;
       while(NULL!=q->next)
       {
             length++;
             q=q->next;
        }      
       return length;
}

void swap(int &x,int &y)
{
       int tmp;
       tmp=x;
       x=y;
       y=tmp;
}

void listSort1(List q)//冒泡排序
{
      Node *p;
      int n,i,j;
      n=getLength(q);      
      if(NULL==q||NULL==q->next)
      {
            cout<<"eroor"<<endl;
            exit(0);
      }
      for(j=1;j<n;j++)
      {
            p=q->next;
            for(i=0;i<n-j;i++)
            {
                   if(p->data>p->next->data)
                         swap(p->data,p->next->data);
                   p=p->next;
            }
      }
}

void listSort2(List q)//选择排序
{
       int i,j;
       Node *p1,*p2,*p3;
       int n=getLength(q);
       //此处省略了判断,判断见冒泡
       for(i=0;i<n-1;i++)
       {
            p1=p2=p3=q->next;//p2保存最小值地址,p1用来循环,p3用来保存q->next
            for(j=i+1;j<n;j++)
            {
                  if(p1->next->data<p1->data)
                          p2=p1->next;
                   p1=p1->next;
            }
            swap(p3->data,p2->data);
        }
}

void printList(List q)
{
       while(NULL!=q->next)
       {
             cout<<q->next->data<<endl;
             q=q->next;
       }
}


int main()
{
       List q=createList();
       printList(q);
 
       listSort1(q);
     
       //listSort2(q);
       return 0;
}

说明:部分代码来自<<程序员面试宝典>>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值