回 帖 发 新 帖 刷新版面

主题:[原创]急求!请问大侠排序部分错在哪里?

标题: 学生信息管理 
时 限: 1000 ms 
内存限制: 20000 K 
总时限: 3000 ms 
描述: 用链式存储结构实现对一个班级学生信息管理。设计程序求出每个人的平均成绩并按平均成绩由高到底排序后输出学生记录。
 
输入: 人数n
人员记录1 (格式为: 学号 姓名 成绩1  成绩2  成绩3)
人员记录2 
输出: 人员记录x                                                        1
人员记录y                                                        2
  …
人员记录z                                                        n 
输入样例: 3
1 孙俪莉  76  78  89  
2 章子怡  72  56  67  
3 刘德华  56  84  90
 
输出样例: 1 孙俪莉  76 78  89  81.00  1
3 刘德华 56  84  90  76.67  2
2 章子怡 72  56  67  65.00  3
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int num;
    char name[20];
    double mark[3];
    double avr;
    int rank;
    struct LNode*next;
}Node;
int main()
{
    int icount,jcount,sum=0,size;
    /*-------------创建链表----------------------*/
    Node*head,*p,*q,*s,*rear;
    scanf("%d",&size);//输入链表尺寸;
    p=(Node*)malloc(sizeof(Node));
    p->next=NULL;
    head=p;
    for(icount=0;icount<size;icount++)
    {
        q=(Node*)malloc(sizeof(Node));
        q->num=(icount+1);
        sum=0;
        scanf("%d%s",&q->rank,q->name);
        for(jcount=0;jcount<3;jcount++)
        {
            scanf("%lf",&q->mark[jcount]);
            sum=sum+q->mark[jcount];
        }
        q->avr=sum/3.00;
        q->next=NULL;
        p->next=q;
        p=q;
    }
    /*------------链表建成-----------------*/
    /*----------------排序----------------*/
    rear=q->next=head->next;
    sum=size;
    p=q=rear->next;
    for(icount=0;icount<size;icount++)
    {
        for(jcount=1;jcount<=sum;jcount++,p=p->next)
        {
            if(p->next->avr>q->avr){q=p;}
        }
        s=q->next;q->next=s->next;--sum;
        printf("%s %lf\n",s->name,s->avr);
        s->next=head->next;
        head->next=s;q=p;
    }


    p=head->next;//output
    for(icount=1;icount<=size;icount++)
    {
        printf("%d %s",p->rank,p->name);
        for(jcount=0;jcount<3;jcount++)
        {
            printf(" %.2lf",p->mark[jcount]);
        }
        printf(" %.2lf",p->avr);
        printf(" %d\n",icount);p=p->next;
    }
    return 0;
}

回复列表 (共5个回复)

沙发

个人估测,lz为了验证排序是否正确,在排序的时候加了句printf("%s %lf\n",s->name,s->avr);结果按这个输出的确实是正确的,但为什么output中刚好反过来了呢?!
这是lz应该很自然想到output之前  p=head->next这里。这个肯定是有问题的。
lz在每次得到s后,都用到
s->next=head->next;
head->next=s;
这里每次插元素都是从head->next后直接插得,这就解释为什么倒过来了、、lz觉得呢、、
(还有lz能将逻辑简化下么,这样看的头大啊!)

板凳

sorry sorry 我没有说清楚 在排序部分如果要倒序把>改小于就可以 但是节点顺序只在三个数据时成立,当测试数据变成
10
2009011375 刘芳羽 32.33 5.56 26.27
2009011376 杨莹 97.13 16.40 14.46
2009011381 窦蓉蓉 33.09 14.03 46.53
2009011386 李顺华 29.06 74.33 47.16
2009011387 李志鹏 39.64 80.38 40.85
2009011389 黄光清 45.82 82.85 79.72
2009011390 林宇华 54.51 84.36 12.49
2009011391 李光朕 50.14 46.65 21.70
2009011392 高健 25.30 18.77 11.16
2009011396 雪海峰 34.00 68.89 23.53

标准排序应该是
2009011389黄光清45.82 82.85 79.72 69.46 1
2009011387李志鹏39.64 80.38 40.85 53.62 2
2009011390林宇华54.51 84.36 12.49 50.45 3
2009011386李顺华29.06 74.33 47.16 50.18 4
2009011376杨莹97.13 16.40 14.46 42.66 5
2009011396雪海峰34.00 68.89 23.53 42.14 6
2009011391李光朕50.14 46.65 21.70 39.50 7
2009011381窦蓉蓉33.09 14.03 46.53 31.22 8
2009011375刘芳羽32.3 35.56 26.27 21.39 9
2009011392高健25.30 18.77 11.16 18.41 10
但是逆序后的顺序也是错误的
我的想法是将一个头结点为空的链表的尾指针指到第一个排序数构成一个环
在每次pq查找到q指向最大结点前驱,然后删除头插接到head上

3 楼

lz附上执行结果吧,代码意思已经明白了、、

4 楼

黄光清 68.666667
李志鹏 53.000000
林宇华 50.000000
李光朕 39.000000
杨莹 42.333333
黄光清 68.666667
雪海峰 41.666667
杨莹 42.333333
李志鹏 53.000000
杨莹 42.333333
2009011376 杨莹 97.13 16.40 14.46 42.33 1
2009011387 李志鹏 39.64 80.38 40.85 53.00 2
2009011396 雪海峰 34.00 68.89 23.53 41.67 3
2009011389 黄光清 45.82 82.85 79.72 68.67 4
2009011391 李光朕 50.14 46.65 21.70 39.00 5
2009011390 林宇华 54.51 84.36 12.49 50.00 6
2009011375 刘芳羽 32.33 5.56 26.27 21.00 7
2009011381 窦蓉蓉 33.09 14.03 46.53 31.00 8
2009011386 李顺华 29.06 74.33 47.16 50.00 9
2009011392 高健 25.30 18.77 11.16 18.00 10

5 楼

[url=http://www.worldgodshop.com/]Supra Shoes[/url]   [url=http://www.worldgodshop.com/]Radii shoes[/url]  [url=http://www.worldgodshop.com/]Prada Shoes[/url]   [url=http://www.worldgodshop.com/]Jordan shoes[/url]  [url=http://www.worldgodshop.com/]Christian Louboutin shoes[/url] 
http://www.worldgodshop.com/

我来回复

您尚未登录,请登录后再回复。点此登录或注册