2015年数据结构第四题(带头结点单链表的简单选择排序)(C/C++)

题目:
在这里插入图片描述

算法思想:每次从单链表的待排序部分中找到最小的元素所在的节点,再和与头节点直接相连的单链表的已排序部分的下一个结点通过调整指针的方式交换位置,重复多次即可。

代码实现:

#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);
}

运行效果:
在这里插入图片描述
和严蔚敏的书上的实例略有不同,不过还算符合选择排序的思路

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值