| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2536 人关注过本帖
标题:单链表排序问题
只看楼主 加入收藏
海风27
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
单链表排序问题
struct node
{
    int ID;
    char name[10];
    int mark;
    struct node *next;
};
struct node *paixu()
{
    struct node *first,*max,*p,*p_max,*tail;
    if(head->next==NULL||head->next->next==NULL)
    {
        printf("无须排序!");
        getch();
        return head;
    }
    else
    {
        first=(struct node *)malloc(sizeof(node));
        first->next=NULL;
        max=head->next;
        p=head->next;
        while(head->next!=NULL)
        {
            for(max=head->next,p=head->next->next,p_max=head;p->next!=NULL;p=p->next)
            {
                if(p->next->mark>max->mark)
                {
                    p_max=p;
                    max=p->next;
                }
            }
            if(first->next==NULL)
            {
                first->next=max;
                tail=max;
            }
            else
            {
            tail->next=max;
            tail=max;
            }
            if(p->next!=NULL)
            {
                p_max->next=p->next;
            }
        }
        tail->next=NULL;
        head=first;
        return head;
    }
}
这是一个用来单链表排序的函数,能运行,但是进入死循环,不知道有什么问题,高手帮忙看下!

[ 本帖最后由 海风27 于 2011-8-17 11:03 编辑 ]
搜索更多相关主题的帖子: return 
2011-08-17 01:20
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
自己先调试一下 我去给你找我写过的代码

                                         
===========深入<----------------->浅出============
2011-08-17 09:09
leaf_yyl
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:19
专家分:104
注 册:2011-8-13
收藏
得分:0 
自己一个

[ 本帖最后由 leaf_yyl 于 2011-8-17 12:39 编辑 ]
2011-08-17 12:26
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
晕掉晕掉了你那么多指针乱七八糟的;看的头都晕了~~~~~~~~~ 无语有必要定义那么多指针嘛 不就是一个单循环的链表嘛~ 有的地方不知道写个注释吗?? 这样别人看的懂你的程序????
程序代码:
struct node
{
    int ID;
    char name[10];
    int mark; //依据mark的值进行排序
    struct node *next;
};

struct node *paixu()  //paixu函数 返回头指针head;
    {
        struct node *first,*max,*p,*p_max,*tail;//囧囧囧囧囧你定义了5个指针啊,5个啊5 个啊天呐5个呢;就为了排序 晕了苍天呐~大地呐~罪过啊;;
        if(head->next==NULL||head->next->next==NULL)// 如果只有1个元素 或者只有2个元素就直接返回头指针没必要排序;
        {
            printf("无须排序!");
            getch();
            return head;
        }
        else //运行到这里那证明有2个以上的结点元素了;
        {
            first=(struct node *)malloc(sizeof(node));// first到这里开始有意义了~现在它指向一个新的结点;大小等于node的大小;
            first->next=NULL;// 进一步给first完善;它下一个结点是0;证明现在它现在就是光棍;
            max=head->next;// max也有意义了他指向第2个元素;
            p=head->next;// p也有意义了 好了现在有3个指针有意义了 不容易啊;可是为什么不定义成下面那个一样的呢?p=head->next->next不解~~~疑惑~~
            while(head->next!=NULL)//差不多定义了这么多指针开始实战了,下面进入循环;循环的功能是当head指向最后一个结点时退出循环;
            { // 看清楚死循环从这里开始 ;
                for(max=head->next,p=head->next->next,p_max=head;p->next!=NULL;p=p->next)
                {// 这里又出现了一个指针;p_max 他现在指向头指针;好现在开始乱七八糟的开始;
                    
                    if(p->next->mark>max->mark)// 这儿 这个 看清楚了么 这里:::这里的意义是将p的后一个结点与max相比;那么max就是最大的
                    {// 这里我还想说的就是很怀疑这个判断真正的是正确的吗??仔细推敲下如果第二个结点的数值是最大的,那么就会出现逻辑错误;
                        p_max=p;   //p_max 有什么用?????
                        max=p->next;
                    }
                }

                if(first->next==NULL){first->next=max;tail=max;}else{tail->next=max;tail=max;}

                if(p->next!=NULL) //想请楼主回答一下这个判断有什么用 ;p_max 指针有什么用??
                {
                    p_max->next=p->next;
                }
                head=head->next;// 你设置head的下一个结点不为空为循环条件;head不变循环怎么停止呢?
            }
        tail->next=NULL;
        head=first;
        return head;
    }
}


在for循环做完后p 总是指向最后一个结点 我就不清楚 if(p->next!=NULL){p_max->next=p->next; }这个判断有意义吗?p_max 这个指针有意义吗 求教 楼主请帮解释下这个究竟做什么用的!

[ 本帖最后由 jcw08120110 于 2011-8-17 14:53 编辑 ]

君生我未生 我生君以老
2011-08-17 13:36
海风27
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-17
收藏
得分:0 
回复 4楼 jcw08120110
这个函数是用选择排序法对单链表排序,主要有三个步骤:1,找出原链表最大的节点max;2,把max列入有序链表中(first);3,让max离开原链表(head);
p_max指的是max的前一个节点,在让max离开原链表时要用到。
    可能用的方法是有点复杂,还请各位大侠多多指教。
2011-08-17 14:55
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
p_max=p; 根本不是max的原先结点 ~ 这个里面漏洞太多了p_max按你定义一开始指向头指针 然后指向p ,却不是指向max的;
而你说的让max离开原链表的真正指针是if(first->next==NULL){first->next=max;tail=max;}else{tail->next=max;tail=max里面的tail!   至于你说的死循环 就是少了一句 head=head->next;

君生我未生 我生君以老
2011-08-17 15:00
我有一个梦
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-8-13
收藏
得分:0 
看的我晕
2011-08-17 15:41
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:5 
链表类.rar (1.9 KB)

抱歉 来晚了  没找到C的 给你个以前写的C++的吧 里面是模板

当时技术有限写的不好  如果要求改动请联系我

                                         
===========深入<----------------->浅出============
2011-08-17 16:09
海风27
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-17
收藏
得分:0 
回复 8楼 laoyang103
谢了,
2011-08-17 20:04
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:10 
修改及示范如下,不懂请问。
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int ID;
    char name[10];
    int mark;
    struct node *next;
};
/*这个函数是用选择排序法对单链表排序,主要有三个步骤:1,找出原链表最大的节点max;2,把max列入有序链表中(first);3,让max离开原链表(head);
p_max指的是max的前一个节点,在让max离开原链表时要用到。*/
struct node *paixu(struct node *head)
{
    struct node *first,*max,*p,*p_max,*tail;
    if(head->next==NULL||head->next->next==NULL)//只有一个结点或为空链表
    {
        printf("无须排序!");
        return head;
    }
    else
    {
        first=(struct node *)malloc(sizeof(node));//建立新的有序链表
        first->next=NULL;
        while(head->next->next!=NULL)
        {
            for(max=head->next,p=head->next,p_max=head;p->next!=NULL;p=p->next)//找出最高分
            {
                if(p->next->mark>max->mark)
                {
                    p_max=p;
                    max=p->next;
                }
            }
            if(first->next==NULL)//加入到有序链表first中
            {
                first->next=max;
                tail=max;
            }
            else
            {
                tail->next=max;
                tail=max;
            }
            p_max->next=p_max->next->next;//删除max结点
        }
        tail->next=p;//把最后一个结点(最低分)插入first链表
        tail=p;
        tail->next=NULL;
        head=first;
        return head;
    }
}
int main()
{
    struct node *head,*p;
    int i;
    head=(struct node *)malloc(sizeof(node));
    head->next=NULL;
    printf("输入5个学生的ID,姓名,分数:\n");
    for(i=0;i<5;i++)
    {
        p=(struct node *)malloc(sizeof(node));
        
        scanf("%d%s%d",&p->ID,p->name,&p->mark);
        p->next=head->next;
        head->next=p;
    }
    head=paixu(head);
    p=head->next;
    for(i=0;i<5;i++)
    {
        printf("%-5d %-10s %d\n",p->ID,p->name,p->mark);
        p=p->next;
    }
    return 0;
}

A real warrior never quits.
2011-08-17 20:08
快速回复:单链表排序问题
数据加载中...
 
   



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

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