| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 831 人关注过本帖
标题:单链表通过移动 节点 实现数据的升序排序 大家给指出哪里错了
只看楼主 加入收藏
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:9 
单链表通过移动 节点 实现数据的升序排序 大家给指出哪里错了
// 单链表通过移动 节点 实现数据的升序排序 大家给指出哪里错了,怎么改进下.. 假设数据类型为整型。
void sort(Linklist head)
{
    ListLnode *p,*rear,*r,*k;
         
        int min;
        rear=head;
                   p=head;   // 想法这样的 始终 保持 r 为 p 的前驱
        r=p;
        k=head->next; // k 指向第一个节点
        while(k)
        {  
            min=k->data;
            for(r=p,p=p->next;(r&&p);r=p,p=p->next)
            {
                if(min>p->data)
                   min=p->data;
            }
            if(min==k->data)   //j假如第一个节点经过遍历是最小的
            {   
                p=k;
                r=p;
                k=k->next;   // k向后移动 r和p 始终保持前驱和后继的关系

            }
            else
            {
                r->next=p->next;  // 取出最小的节点
                p->next=rear->next; // 插入到第一个节点的前面
                rear->next=p;
                rear=p;   // 这一步想着 rear 能够指向当前的最小值节点
                r=p;
                k=p->next; // k 继续向后移动 实现下一步遍历
            }

        }
   
}
搜索更多相关主题的帖子: 移动 
2011-06-12 22:18
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
链表类_C语言.rar (1.71 KB)
我这里有个单链表排序

                                         
===========深入<----------------->浅出============
2011-06-12 22:25
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
我没看出,这是个排序算法。太复杂了。

[ 本帖最后由 cosdos 于 2011-6-12 22:39 编辑 ]

—>〉Sun〈<—
2011-06-12 22:37
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
收藏
得分:0 
回复 2楼 laoyang103
我想知道 怎么错的,我想在自己的程序上改下.。。
2011-06-12 22:44
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
失误了

[ 本帖最后由 cosdos 于 2011-6-12 22:48 编辑 ]

—>〉Sun〈<—
2011-06-12 22:45
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
收藏
得分:0 
回复 3楼 cosdos
我的基本思想 是 遍历出最小的数据 节点插到最前面,然后继续遍历找到最小的 依次插到后面.....就是这样想的...你有好的算法?
2011-06-12 23:08
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
失误啊

[ 本帖最后由 cosdos 于 2011-6-13 00:16 编辑 ]

—>〉Sun〈<—
2011-06-12 23:17
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:20 
程序代码:
void sort(QueueNode *head)
{
    QueueNode *i, *j, *min, *min_prev, *j_prev;
    if (head == NULL)
        return;
    i = head->next;
    head->next = NULL;
    for (i; i != NULL; )
    {
        min = min_prev = j_prev = i;
        for (j=i->next; j!=NULL; j=j->next)
        {
            if (min->data > j->data)
            {
                min = j;
                min_prev = j_prev;
            }
            j_prev = j;
        }
        if (min == i)
            i = i->next;
        min_prev->next = min->next;     // 移出链表
        min->next = NULL;               // 
        head->next = min;
        head = head->next;
    }
}


[ 本帖最后由 cosdos 于 2011-6-13 00:30 编辑 ]

—>〉Sun〈<—
2011-06-12 23:30
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
通过测试

------------------------------------------------

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

typedef struct QueueNode {
    int data;
    struct QueueNode *next;
} QueueNode;

void sort(QueueNode *head)
{
    QueueNode *i, *j, *min, *min_prev, *j_prev;
    if (head == NULL)
        return;
    i = head->next;
    head->next = NULL;
    for (i; i != NULL; )
    {
        min = min_prev = j_prev = i;
        for (j=i->next; j!=NULL; j=j->next)
        {
            if (min->data > j->data)
            {
                min = j;
                min_prev = j_prev;
            }
            j_prev = j;
        }
        if (min == i)
            i = i->next;
        min_prev->next = min->next;     // 移出链表
        min->next = NULL;               // 
        head->next = min;
        head = head->next;
    }
}

int main(void)
{
    int d;
    QueueNode QueueRoot, *p, *newnode;
    QueueRoot.next = NULL;
    p = &QueueRoot;
    
    while (scanf("%d", &d) == 1)
    {
        newnode = (QueueNode*)malloc(sizeof(QueueNode));
        newnode->data = d;
        newnode->next = NULL;
        p->next = newnode;
        p = p->next;
    }
    sort(&QueueRoot);
    
    for (p=QueueRoot.next; p != NULL; p=p->next)
    {
        printf("%d  ", p->data);
    }
    system("pause");
    return 0;
}


[ 本帖最后由 cosdos 于 2011-6-13 00:31 编辑 ]

—>〉Sun〈<—
2011-06-13 00:23
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
收藏
得分:0 
回复 9楼 cosdos
很感谢,我好像知道,自己错到哪里了,我去修改下我写的....
2011-06-13 15:35
快速回复:单链表通过移动 节点 实现数据的升序排序 大家给指出哪里错了
数据加载中...
 
   



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

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