| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3523 人关注过本帖, 1 人收藏
标题:链表的快排
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
结帖率:94.74%
收藏(1)
已结贴  问题点数:100 回复次数:20 
链表的快排
    前一段时间有位朋友要求用链表找出中位数,闲来无事写了个链表的快排.但我想我这应该不算是真正意义上的快排,因为多了一个检查指针位置的函数,时间复杂度上应该是超了.

    另外,如果用这个思路写中位数,应该再多一个从链表头查找第 K 位数的函数,时间复杂度上也应该是超了.

    总之,程序贴出来,请大家多多指教,请高手们不吝指教,本菜多多学习才是,谢谢大家了.

程序代码:
#include <stdio.h>
#include<stdlib.h>

typedef struct tmp
{
    int num;
}tmp;

typedef struct st
{
    tmp *q;
    struct st *ago;
    struct st *after;
}st;

st *make_line();   //  建立链表
st *len_line(st *head);  // 查找链表的尾部
void line_sort(st *head,st *p,st *r);  //  排序
void wap(st *head,st *a,st *b);  // 交换链表的数据
void print(st *head);    // 输出
void del_line(st *head);  // 销毁链表
int check(st *p,st *r);  // 检查指针的位置

int main(void)
{
    st *head,*len;

    head=make_line();
    len=len_line(head);
    line_sort(head,head->after,len);
    print(head->after);
    del_line(head);

    return 0;
}

st *make_line()
{
    st *head,*p,*t;
    tmp *l;
    int n,i=0;

    p=t=NULL;
    while((head=(st *)malloc(sizeof(st)))==NULL);
    head->ago=head->after=NULL;
    while((scanf("%d",&n))==1)
    {
        while((p=(st *)malloc(sizeof(st)))==NULL);
        while((l=(tmp *)malloc(sizeof(tmp)))==NULL);
        l->num=n;
        p->q=l;
        if(!i)
        {
            head->after=p;
            p->ago=head;
            t=p;
            i=1;
        }
        else
        {
            t->after=p;
            p->ago=t;
            t=p;
        }
    }
    p->after=NULL;

    return head;
}

st *len_line(st *head)
{
    st *p=head;

    while(p->after)
    {
        p=p->after;
    }

    return p;
}

void line_sort(st *head,st *p,st *r)
{
    st *i,*j,*d;
    int x;

    if(check(p,r))
    {
        i=p->ago;
        x=r->q->num;
        d=p;
        for(j=p;j!=r;j=j->after)
        {
            if(j->q->num<=x)
            {
                i=i->after;
                if(i!=j)
                {
                    wap(head,i,j);
                }
            }
        }
        i=i->after;
        if(i!=r)
        {
            wap(head,i,r);
        }
        line_sort(head,p,i->ago);
        line_sort(head,i->after,r);
    }
}

void wap(st *head,st *a,st *b)
{
    tmp *t;

    t=a->q;
    a->q=b->q;
    b->q=t;
}

void print(st *head)
{
    while(head)
    {
        printf("%d ",head->q->num);
        head=head->after;
    }
    puts("");
}

int check(st *p,st *r)
{
    while(p)
    {
        if(p->after==r)
        {
            return 1;
        }
        p=p->after;
    }

    return 0;
}

void del_line(st *head)
{
    st *t=NULL;

    while(head)
    {
        t=head;
        head=head->after;
        free(t);
    }
    free(t);
}


   
搜索更多相关主题的帖子: 链表 
2010-03-15 01:04
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
占个座,小聚一会。

努力—前进—变老—退休—入土
2010-03-15 08:54
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
占位慢慢看
2010-03-15 09:06
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
不知道有没有时间捣腾了
先占个楼再说

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2010-03-15 09:18
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:10 
诶。。。

没太大的长进。。
2010-03-15 09:26
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
不推荐用递归!

★★★★★为人民服务★★★★★
2010-03-15 09:41
ouyangouyang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:579
注 册:2009-10-8
收藏
得分:0 
看不懂,占个位

多少恨, 昨夜梦魂中。 还似旧时游上苑, 车如流水马如龙; 花月正春风!
2010-03-15 09:45
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
以下是引用cnfarer在2010-3-15 09:41:38的发言:

不推荐用递归!

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-03-15 10:28
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:10 
struct a{
    unsigned int **ary; //地址表
    int cnt;//记录元素个数
};

_________________________________________________________________________________________
|   ary[0]  |   ary[1]   |            |            |            |........|   ary[cnt-1] |
------------------------------------------------------
      |            |            |           |            |                      |
  ____V___     ____V____    ____V____    ___V____     ___V___               ____V____
  |       | <- |        |<- |        |<- |       |<-  |      |            <-|        |
  |  st   |    |  st    |   |   st   |   |  st   |    |  st  |     ...      |  st    |
  |       |    |        |   |        |   |       |    |      |              |        |
  |       | -> |        |-> |        |-> |       |->  |      |->            |        |-> NULL
  ---------    ----------   ----------   ---------    --------              ----------
用数组的方式排列各元素,第K个元素: st *p = (st *)ary[k],利用cnt可以找到中位数

不知这样做能不能满足老大的要求。。。囧。。。
还有你的函数del_line的最后一个free应该去掉吧。。。


2010-03-15 11:17
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
struct a{
    unsigned int **ary; //地址表
    int cnt;//记录元素个数
    st *head;//头   ---》忘记加上这个了
};
2010-03-15 11:19
快速回复:链表的快排
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014518 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved