这是按照链表插入一个最小元素发展而来的排序,练练手。
#include<iostream>
using namespace std;
struct node{
int data;
node*next;
};
node*create(int n){
node*head,*tail,*p;
head=tail=new node;
head->data=9999999;//安排一个很大的数
//可用浪费一小段空间的方法节省时间。
while(n--){
p=new node;
cin>>p->data;
p->next=NULL;
tail->next=p;
tail=p;
}
return head;
}
void insertMin(node*head,node*p){
//pp为链表的前节点,qq为链表的后节点
node*pp,*qq;
qq=head;
pp=head->next;
while(pp){
if(pp->data>p->data)break;
qq=pp;//后面的节点向前移动
pp=pp->next;//前面的节点向前移动
}
//连线插入节点
p->next=pp;
qq->next=p;
}
void insertSort(node*head){
node*p,*q;
p=head->next;
head->next=NULL;
while(p){
q=p->next;
p->next=NULL;
insertMin(head,p);
p=q;
}
}
int main() {
//测试数据:12 3 3 66 7 7 0 8 9 88
int n=10;
node*p,*head;
head=p=create(10);
p=p->next;//跳过表头指针
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
insertSort(head);
//对链表进行直接插入排序:
cout<<"排序后:" <<endl;
head=head->next;
while(head){
cout<<head->data<<" ";
head=head->next;
}
return 0;
}