扩展CList类加入排序功能

这里实现了两种排序:链表内部排序和链表外部排序:

链表外部排序不会真实改变数据顺序:

//在链表外部进行排序,不会直接影响到链表内的数据排序;实现方法是 申请一段对空间数组,用来存放指针,这些指针,指向

//链表内的数据,排序的时候根据链表内数据的大小只要交换指针的位置就可以;比如链表内数据为 55 22 33 11 44;那么申请

//一段堆空间数组 p[] 数组里面存放指针 p[0]指向55 p[1]指向22, p[2]指向33,p[3]指向11,p[4]指向44,采用选择排序进行排序

//第一轮找到最小的11,那么就把p[0] 与 p[3]相互对调,p[0]指向11,p[3]指向55,所以链表内部数据并没有变化,

ListEx.h

#pragma once

#include<afxtempl.h>
template<typename TYPE,typename TYPE_ARG>
class CListEx:public CList<TYPE,TYPE_ARG>
{
public:
	CListEx(void){}
	~CListEx(void){}

public:
	typedef bool (*SORT_FUNC)(const TYPE& t1,const TYPE& t2);//声明函数指针

	//在链表内部进行排序,直接影响链表数据的排序
	void SortInList(SORT_FUNC byFunc)
	{
		CNode* p = m_pNodeHead,*q,*pMin;
		while (p)
		{
			q  = pMin = p;
			q = q->pNext;
			while (q)
			{
				if (byFunc(q->data,pMin->data))
				{
					pMin = q;
				}
				q = q->pNext;
			}
			if (pMin!=p)
			{
				TYPE t = pMin->data;
				pMin->data = p->data;
				p->data = t;
			}
			p = p->pNext;
		}
	}
	//在链表外部进行排序,不会直接影响到链表内的数据排序;实现方法是  申请一段对空间数组,用来存放指针,这些指针,指向
	//链表内的数据,排序的时候根据链表内数据的大小只要交换指针的位置就可以;比如链表内数据为 55 22 33 11 44;那么申请
	//一段堆空间数组 p[] 数组里面存放指针 p[0]指向55 p[1]指向22, p[2]指向33,p[3]指向11,p[4]指向44,采用选择排序进行排序
	//第一轮找到最小的11,那么就把p[0] 与 p[3]相互对调,p[0]指向11,p[3]指向55,所以链表内部数据并没有变化,
	POSITION* SortOutList(SORT_FUNC byFunc)
	{
		int n = m_nCount;
		CNode* * ps = new CNode*[n+1];//二级指针,存放的是指针
		CNode* p = m_pNodeHead;
		ps[n] = NULL;
		int i = 0;
		while (i < n)
		{
			ps[i] = p;
			p = p->pNext;
			++i;
		}
		i = 0;
		int j = 0,nMin = 0;
		while (i < n)
		{
			nMin = i;
			j = i + 1;
			while (j<n)
			{
				if (byFunc(ps[j]->data,ps[nMin]->data))
				{
					nMin = j;
				}
				++j;
			}
			if (nMin!= i)
			{
				CNode* t = ps[nMin];
				ps[nMin] = ps[i];
				ps[i] = t;

			}
			++i;
		}

		return (POSITION*)ps;
	}
};

main.cpp

// CListEx.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ListEx.h"
#include <iostream>
using namespace std;
bool Comp(const int& i, const int& j)
{
	return i<j;
}

int _tmain(int argc, _TCHAR* argv[])
{

	CListEx<int,int> m_list;
	int a[] = {2,5,1,4,7,0};
	int i = 0;
	while (a[i])
	{
		m_list.AddTail(a[i++]);
	}
	POSITION pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}
	/*
	//采用在链表内部排序
	m_list.SortInList(Comp);
	cout<<"在链表类内部排序:"<<endl;
	pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}
	*/

	//采用在链表外部进行排序,不真实影响链表内部的数据排序
	POSITION* ps = m_list.SortOutList(Comp);
	cout<<"类外部的排序:"<<endl;
	i = 0;
	while (ps[i])
	{
		cout<<m_list.GetAt(ps[i])<<endl;
		++i;
	}
	delete[]ps;

	cout<<"输出排序后链表内的数据:"<<endl;
	pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}

	getchar();
	return 0;
}

// CListEx.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ListEx.h"
#include <iostream>
using namespace std;
bool Comp(const int& i, const int& j)
{
	return i<j;
}

int _tmain(int argc, _TCHAR* argv[])
{

	CListEx<int,int> m_list;
	int a[] = {2,5,1,4,7,0};
	int i = 0;
	while (a[i])
	{
		m_list.AddTail(a[i++]);
	}
	POSITION pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}
	/*
	//采用在链表内部排序
	m_list.SortInList(Comp);
	cout<<"在链表类内部排序:"<<endl;
	pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}
	*/

	//采用在链表外部进行排序,不真实影响链表内部的数据排序
	POSITION* ps = m_list.SortOutList(Comp);
	cout<<"类外部的排序:"<<endl;
	i = 0;
	while (ps[i])
	{
		cout<<m_list.GetAt(ps[i])<<endl;
		++i;
	}
	delete[]ps;

	cout<<"输出排序后链表内的数据:"<<endl;
	pos = m_list.GetHeadPosition();
	while (pos)
	{
		cout<<m_list.GetNext(pos)<<endl;
	}

	getchar();
	return 0;
}

采用链表内部排序后再打印一次链表内的数据;发现数据顺序已经发生了改变

采用链表外部排序后再打印依次链表内的数据;发现数据顺序没有发生改变!

时间: 2024-10-07 19:55:05

扩展CList类加入排序功能的相关文章

MapReduce实现排序功能

期间遇到了无法转value的值为int型,我采用try catch解决 str2 2 str1 1 str3 3 str1 4 str4 7 str2 5 str3 9 用的\t隔开,得到结果 str1 1,4 str2 2,5 str3 3,9 str4 7 我这里map,reduce都是单独出来的类,用了自定义的key package com.kane.mr; import java.io.DataInput; import java.io.DataOutput; import java.i

用户使用双屏扩展桌面类软件时,所遇到的疑难问题目录汇编

在使用行易软件双屏类软件时,在软件启动之前,往往需要进行一下前期设置工作.这些设置工作做正确了,软件启动后,其相应的展示功能才能真正的运行实施. 双屏软件包括:活动现场双屏管理系统-多线程抽奖版,婚庆现场管理系统-双屏版,PPT图片双屏抽奖系统,评委计分系统-双屏版,比赛打分展示双屏管理系统,知识竞赛现场管理系统-双屏PPT版等. 软件使用过程中,有时也会遇到一些问题.我们把这些常见的疑难问题,汇总成目录,供大家学习: 1. 双屏前期设置方法[又名:系统扩展桌面设置方法-双屏双显扩展桌面技术前期

Java中Collections类的排序sort函数两种用法 (转http://viver120.blog.163.com/blog/static/60072482013010111228695/)

java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1.  自然排序(natural ordering). 函数原型:sort(List<T> list)说明:参数是要参与排序列表的List对象                                                               实例说明:参与排序的列表的元素Student必须实现Comparable接口的public int compareTo(

Java千百问_06数据结构(019)_Arrays类有什么功能

点击进入_更多_Java千百问 1.Arrays类有什么功能 java.util.Arrays中的类包含了很多静态方法,用于排序数组.搜索数组.比较数组和填充数组元素等功能. 了解一维数组看这里:java中的数组是什么 常见方法如下: public static int binarySearch(Object[] a, Object key) 使用二分法搜索数组中指定值的位置(下标).如果数组类型非基本数据类型,则需要类实现Comparable接口中的compareTo方法. public st

Java实现中文字符串的排序功能

1 package test; 2 3 /** 4 * 5 * @Title 书的信息类 6 * @author LR 7 * @version 1.0 8 * @since 2016-04-21 9 */ 10 11 public class Book { 12 13 private String book_id; 14 15 private String book_name; 16 17 private String publishing_house; 18 19 public Book(S

Yii 2.0排序功能的使用

在Yii2.0项目的实际开发中,经常会遇到使用Yii2.0自带的排序功能.下面是排序功能的具体使用方法. 一.设置排序规则 注意引入Sort类,如:use yii\data\Sort; // 设置排序字段 $sortObject = new Sort([ 'sort' => $sort, 'defaultOrder' => ['id' => SORT_DESC], 'attributes' => [ 'id' => [ 'asc' => ['id' => SORT

Django DRF:过滤&amp;搜索&amp;排序功能

过滤功能利用的是第三方包 django_filters,搜索我排序利用的是 Django DRF 提供的 filters 示例代码如下: from rest_framework import filters # 搜索和排序功能 # 注意:这两个是 DRF 提供的功能 from django_filters.rest_framework import DjangoFilterBackend # DjangoFilterBackend 是精确(查找)过滤,即 字段值必须要完全一样才能匹配成功 imp

[转] 扩展微信小程序框架功能

通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.112200)后, 移除了开发者工具对 ES6 中Promise 特性原生的支持, 需要引入第三方的 Promise 库. 扩展微信小程序框架功能(2)——Generator Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同. 扩展微信小程序框架功能(3)——函数功能增强

java11-3 String类的获取功能

package cn_String2;/* String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引. 为什么这里是int类型,而不是char类型? 原因是:'a'和97其实都可以代表'a' int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引. int indexOf(int ch,int