栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

题目:

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

代码实现:

#include
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成功删除%dn",P->data);
  delete P;
  P=L;
 }
}

int main()
{
 linkList L;
 cout<<"n创建单链表L:"< 

运行效果:

和严蔚敏的书上的实例略有不同,不过还算符合选择排序的思路

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649150.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号