题目:
算法思想:每次从单链表的待排序部分中找到最小的元素所在的节点,再和与头节点直接相连的单链表的已排序部分的下一个结点通过调整指针的方式交换位置,重复多次即可。
代码实现:
#include<iostream>
using namespace std;
#define ElemType int
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_H(LinkList &L)//尾插法创建单链表
{
int a;
LNode *p,*r;
L=new LNode;
L->next=NULL;
r=L;
cin>>a;
while(a!=9999)
{
p=new LNode;
p->data=a;
p->next=NULL;
r->next=p;
r=p;
cin>>a;
}
}
//本题解答.............................
void ShowList(LinkList &L,int i)//打印出每趟排序之后的单链表
{
LNode *k=L->next;
printf("\n第%d趟排序结果:\n",i);
while(k){
printf(" %d ",k->data);
k=k->next;
}
printf("\n");
}
void SelectSort(LinkList &L)
{
int i=0;
LNode *p,*q,*k,*p1;//k指向可能被交换的结点,q指向最后一个已被排序的结点,p用于遍历单链表,p1是为了便于交换结点而设的
for(q=L;q->next;q=q->next)
{
i++;
k=q->next;
for(p=q->next;p;p=p->next)
if(p->data<=k->data)k=p;
for(p1=L;p1->next!=k;p1=p1->next);
if(k!=q->next)//通过调整指针的方式交换结点
{
p1->next=k->next;
k->next=q->next;
q->next=k;
}
ShowList(L,i);//打印出每趟排序之后的单链表
}
}
//.....................................
void DestroyList(LinkList &L)//销毁单链表
{
LNode *P=L;
while(L)
{
L=L->next;
printf("\n成功删除%d\n",P->data);
delete P;
P=L;
}
}
int main()
{
LinkList L;
cout<<"\n创建单链表L:"<<endl;
CreateList_H(L);
printf("\n显示排序状况:\n");
SelectSort(L);//单链表的简单选择排序
DestroyList(L);
}
运行效果:
和严蔚敏的书上的实例略有不同,不过还算符合选择排序的思路