注册 登录
编程论坛 C++教室

[求助][急]链表排序..

aipb2007 发布于 2007-08-10 22:57, 1474 次点击

假设有个链表,没个结点存放了若干数据。
现在我要按结点中的关键字(数据)进行排序。

问题出来了,假设我同时需要对数据A,和数据B,分别排序,那么我就得写两个函数,因为其中
p->A 和 p->B 不能一致。

还没说清楚的话举个例子

struct p{
double height;
double weight;
p *next;
}
我如果要按“身高”和“体重”给分别链表排序,只用一个函数整合,该怎么做?

注:不是主次之分,就是把两个代码类似的函数合并为一个函数的问题。

[此贴子已经被作者于2007-8-11 1:59:37编辑过]

21 回复
#2
野比2007-08-11 00:45

你打算怎样同时用A和B条件进行排序?
条件表达式给出来..
是 A升序且B降序 这样么?
排序通常只有一个条件...

#3
leeco2007-08-11 00:46
你是说一个主序一个次序?
还是先按照height排一次,再按照weight排一次,而你又不想写两段相似的代码?

#4
野比2007-08-11 00:50

应该是主次序的构想...

#5
aipb20072007-08-11 00:55
还是先按照height排一次,再按照weight排一次,而你又不想写两段相似的代码?

汗,就是这个意思,原谅我没说清楚!
#6
野比2007-08-11 00:59
还是先按照height排一次,再按照weight排一次,而你又不想写两段相似的代码?


...你排出来是个什么顺序?...
#7
aipb20072007-08-11 01:01
就是
sort_h();
没有主次之分,单纯的排序而已
sort_w();

两个函数除了比较那里代入的值不一样,其他都一样。
有没有方法把他们合并成一个函数调用!


不是你楼下那个意思

[此贴子已经被作者于2007-8-11 1:04:02编辑过]

#8
野比2007-08-11 01:02

假如..
1 2
3 1
2 3
5 1
1 7

按height排
1 2
1 7
2 3
3 1
5 1
再按weight排...
3 1
5 1
1 2
2 3
1 7

这是啥玩意儿?

#9
leeco2007-08-11 01:04
使用函数指针作为排序函数参数,qsort和sort都是这样的
#10
野比2007-08-11 01:04
你必须在第二次排序时加入维持主序的功能..
这样两次排序才有意义..
#11
aipb20072007-08-11 01:06
以下是引用leeco在2007-8-11 1:04:11的发言:
使用函数指针作为排序函数参数,qsort和sort都是这样的

你意思是加一个谓次函数作为参数?我想下,说具体点,怎么定义那个谓词函数?

#12
野比2007-08-11 01:11
用不着..
用临时变量维护主序.. 传递节点数给排序函数...就可以重用了...
#13
aipb20072007-08-11 01:15
以下是引用野比在2007-8-11 1:11:09的发言:
用不着..
用临时变量维护主序.. 传递节点数给排序函数...就可以重用了...

啥米意思?

那个用谓词,我估计行不通,因为我要重用,是因为p->height,和p->weight,这两个就是字面表达不一样啊?不存在比较的方式,或者类型!
麻了!

#14
野比2007-08-11 01:19

节点之间有比较...

还有应该这么排...
象8楼我写的
1 2
3 2
2 3
3 1
1 1
按height排
1 2
1 1
2 3
3 2
3 1
再按weight排...维护主序
1 1
1 2
2 3
3 1
3 2

#15
野比2007-08-11 01:23

不行了..太累了..睡了
明天加班的时候找机会写一个看看..

#16
aipb20072007-08-11 01:27
野比,你说那个我还没涉及过。

我的问题不是要派两次,我就排一次,有可能按w排,有可能按h排,我不想写两个类似的函数而已。
弄到一起不知道有啥办法没!

这个意思。



我要睡觉了,你们怎么都这么晚?熬夜么?辛苦啊!我是睡不着!
#17
aipb20072007-08-11 01:28
以下是引用野比在2007-8-11 1:23:23的发言:

不行了..太累了..睡了
明天加班的时候找机会写一个看看..

呵呵,好的,晚安!

#18
terisevend2007-08-11 01:37

用多关键字排序法来排序不就可以了吗? aipb2007的意思是否有点类似以下这种题的意思?
例: 对一组随机排列的字符串进行以大小为主,长度为次的排序并输出...

#19
leeco2007-08-11 23:05
_CRTIMP void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
(const void *, const void *));

这是标准库函数啊。楼主不知道?
#20
aipb20072007-08-11 23:12
以下是引用leeco在2007-8-11 23:05:38的发言:
_CRTIMP void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
(const void *, const void *));

这是标准库函数啊。楼主不知道?

我知道啊,就是用一个函数指针做参数,当谓词在函数做调用。
但是我的问题不能用这种方式解决,13楼里我说明了。也可能是我没考虑深入,你知道请指教下。
光给我个原形!


[此贴子已经被作者于2007-8-11 23:14:07编辑过]

#21
leeco2007-08-11 23:18

程序代码:

#include <iostream>
#include <functional>
#include <algorithm>
using namespace std;


struct Node{
    double h;
    double w;
    Node(){}
    Node(double hh,double ww){h=hh;w=ww;}
};


ostream& operator << (ostream& out,const Node& t)
{
    return out<<t.h<<\"\t\"<<t.w;
}


struct less_h:binary_function<Node,Node,bool>{
    bool operator () (const Node& a,const Node& b){
        return a.h<b.h;
    }
};


struct less_w:binary_function<Node,Node,bool>{
    bool operator () (const Node& a,const Node& b){
        return a.w<b.w;
    }
};


template <class T>
void out(T* arr,size_t n)
{
    for(int i=0;i<n;i++){
        cout<<arr[i]<<endl;
    }
    cout<<endl;
}


int main()
{
    Node arr[3]={Node(180.5,55),Node(172,74),Node(160,65)};


    cout<<\"Before sort\"<<endl;
    out(arr,3);


    cout<<\"Sort by height\"<<endl;
    sort(arr,arr+3,less_h());
    out(arr,3);


    cout<<\"Sort by weight\"<<endl;
    sort(arr,arr+3,less_w());
    out(arr,3);
}

#22
aipb20072007-08-11 23:23
回复:(leeco)[code]#include #inc...
thx.
仔细研究中,问题我早上解决了,不过不是用的这种方法。
无论如何,谢谢你!
1