打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
链表排序

/*********插入排序**********/
#include<iostream>
using namespace std;
/***Writed by Yecon***/

const int MaxNum = 999999;
const int DefaultSize = 10;
class staticlinklist;   //静态链表类的前视说明
class Element     //链表结点元素
{
 int key;
 int link;
public:
 int getKey(){return key;}
 void setKey(int k){key = k;}
 int getLink(){return link;}
 void setLink(const int l){link = l;}
};
class staticlinklist
{
 int MaxSize,CurrentSize;
public:
 Element *Vector;       //存储待排序元素的向量
 staticlinklist(int Msz = DefaultSize):MaxSize(Msz),CurrentSize(0)
 {
  Vector = new Element[MaxSize];
 }
 bool IsFull()
 {
  return CurrentSize == MaxSize -1;
 }
 int getCurrentSize()
 {
  return CurrentSize;
 }
 void InsertElem(int k)
 {
  if(CurrentSize < MaxSize)
  {
   Vector[CurrentSize].setKey(k);
   Vector[CurrentSize].setLink(0);
   CurrentSize++;
  }
 }
 void InsertElem(int k,int index,int pos)
 {
  if(index <= CurrentSize && CurrentSize != MaxSize)
  {
   for(int i = CurrentSize - 1;i >= index;i--)
   {
    Vector[i+1].setKey(Vector[i].getKey());
    Vector[i+1].setLink(Vector[i].getLink());
   }
   Vector[index].setKey(k);
   Vector[index].setLink(pos);
   CurrentSize++;
  }
 }
 void DispAll()
 {
  for(int i = 0;i < CurrentSize;i++)
  {
   cout << Vector[i].getKey() << "(" << Vector[i].getLink() << ")" << " ";
  }
  cout << endl;
 }
};
/**********END数据表类*********/


/**********静态链表排序算法********/
void LinkInsertSort(staticlinklist &list)
{
 //对元素list.Vector[1],...,list.Vector[i]按其关键码key排序,这是一个静态链表
 //每个对象中有一个链域link。list.Vector[currentSize]作为排序后各对象所构成的有序循环链表的表头结点使用。
 //初始化时结点的关键码给最大值MaxNum。n是表中当前结点个数。

//Init:
 list.InsertElem(MaxNum,0,1);      //创头结点
 list.Vector[1].setLink(0);       //指向头结点,形成只有头结点的循环链表
 for(int i = 2;i <= list.getCurrentSize();i++)
 {
  int current = list.Vector[0].getLink();   //current是链表的检测指针
  int pre = 0;         //pre是指向current的前驱
  while(list.Vector[current].getKey() <= list.Vector[i].getKey())
  {
   //寻找插入位置
   pre = current;
   current = list.Vector[current].getLink();
  }
  list.Vector[i].setLink(current);list.Vector[pre].setLink(i); //结点i链入current与pre之间
 }
//END init
}
/*********END静态链表排序算法*********/


/*************测试函数***********/
int testLISort()//main()
{
 staticlinklist L(7);
 L.InsertElem(21);
 L.InsertElem(25);
 L.InsertElem(49);
 L.InsertElem(25);
 L.InsertElem(16);
 L.InsertElem(8);
 L.DispAll();
 LinkInsertSort(L);
 L.DispAll();

 getchar();
 return 0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【数据结构与算法08】 堆
数据结构项目——循环队列与链队列
常用算法五(分支限界法)
堆的基本操作
15种排序算法的复杂度、稳定性、java实现总结
剑指offer 26 二叉搜索树与双向链表
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服