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

    另外,如果用这个思路写中位数,应该再多一个从链表头查找第 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
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 15楼 Devil_W
劳烦您亲自写一下吧,也好让偶菜们好好学习学习.
2010-03-15 20:06
快速回复:链表的快排
数据加载中...
 
   



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

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