(初来乍到,请多关照)有关C语言链表的建立,排序问题

/************************************************/
/* */
/* */
/* 本程序可以由用户自己输入学生的个数, */
/* 并且本程序可以自动计算出改学学生的 */
/* 平均分和总分,且可以将学生的成绩自行 */
/* 排序,并且可以删除和添加学生信息与成绩, */
/* 都由链表完成。 */
/* */
/* 2014年12月7日19:49:25 */
/* */
/************************************************/

# include "stdio.h"
# include "stdlib.h"
# define M sizeof( struct student )
# define N 3

struct student * shu ( void );//建立一个链表
void ji( struct student * q1 );//用来计算学生的平均分和总分
void out ( struct student * p );//用来输出链表中的信息
struct student * pai( struct student * head );//用来将链表排序
void you( struct student * head );//用来给学生成绩按总分划分等级
void xuan( struct student * head );//用来判断是否需要对学生进行等级划分
struct student * sanchu ( struct student * head );//用来删除一个链表的节点
struct student * tian ( struct student * head );//用来添加一个链表的节点

int n = 0, i = 0, k = 0;//定义全局变量,一下的变量就不用重复定义,直接引用即可

struct fen//定义结构体
{
    float math;
    float chinese;
    float english;
};

struct lei//定义结构体
{
    long num;
    char name[20];
    float pin;
    float zong;
    struct fen score;   
};

struct student//定义结构体
{
    struct lei he;
    struct student * next;
};
////////////////////////////////////////////////////////
int main ( void )//主函数C语言编译的入口
{
    struct student * p;//定义结构体变量* p
    p = shu();//函数调用,以下均为函数调用
    ji( p );
    p = pai(p);
    out( p );
    xuan( p );
    p = sanchu( p );
    out ( p );
    p = tian( p );
    ji ( p );
    p = pai ( p );
    out ( p );
    return 0;
}
////////////////////////////////////////////////////////
struct student * shu ( void )//建立一个链表,完成了对数据的输入;
{
    struct student * head;
    struct student * p1, * p2;

    printf ("请输入学生的个数:");
    scanf ("%d", &n );
    printf ("请输入学生的信息与成绩:\n");
    printf ("学号\t姓名\t数学\t语文\t英语\n"); 
    p1 = p2 = ( struct student * )malloc( M );
    scanf ("%ld %s %f %f %f", &p1->he.num, p1->he.name, &p1->he.score.math, &p1->he.score.chinese, &p1->he.score.english);
    head = NULL;
    for ( i=0; i<n; i++ )
    {
        if ( i == 0 )
            head = p1;
        else 
            p2->next = p1;
        p2 = p1;
        p1 = ( struct student * )malloc( M );
        scanf ("%ld %s %f %f %f", &p1->he.num, p1->he.name, &p1->he.score.math, &p1->he.score.chinese, &p1->he.score.english);
    }
    p2->next = NULL;
    return head;
}
///////////////////////////////////////////////////////
void ji( struct student * head )//计算总分和平均分
{
    struct student * q1;
    q1 = head;

    if ( head != NULL )
    do
    {
            q1->he.zong = q1->he.score.chinese + q1->he.score.math + q1->he.score.english;
            q1->he.pin = ( q1->he.zong ) / N;
            q1 = q1->next;
    }
    while (q1 != NULL );
}//计算总分和平均分
//////////////////////////////////////////////////////
struct student * pai( struct student * head )//对链表进行排序
{
    struct student * first;
    struct student * tail;
    struct student * p_min;
    struct student * min;
    struct student * p;

    first = NULL;
    while ( head != NULL )
    {
        for ( p=head ,min=head; p->next != NULL ; p=p->next )
        {
            if ( p->next->he.zong > min->he.zong )
            {
                p_min = p;
                min = p->next;
            }
        }
        if ( first == NULL )
        {
            first = min;
            tail = min;
        }
        else
        {
            tail->next = min;
            tail = min;
        }

        if ( min == head )
        {
            head = head->next;
        }
        else
        {
            p_min->next = min->next;
        }

    }
    if ( first != NULL )
    {
        tail->next = NULL;
    }
    head = first;
    return head;
}
///////////////////////////////////////////////////
void out ( struct student * head )//对数据的输出
{
    int i = 0;
    struct student * p;
    printf ("学号\t姓名\t数学\t语文\t英语\t平均分\t总分\t名次\n");
    p = head;
    if ( head != NULL )
    do
    {
        i = i+1;
        printf ("%ld\t%s\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t%d\n", p->he.num, p->he.name, p->he.score.math, p->he.score.chinese, p->he.score.english, p->he.pin, p->he.zong, i );
        p = p->next;
    }
    while( p != NULL );
}
///////////////////////////////////////////////////////////
void xuan( struct student * head )//选择是否划分等级
{
    char a[5];
    char b[5]={"是"}, c[5]={"否"};
    printf ("是否要将学生按总分分类?\n请输入是或否\n");
    scanf ("%s", a);
    if ( strcmp(a, b) == 0 )
        you( head );
    if ( strcmp(a, c) == 0 )
        printf ("请继续下面的操作。\n");
}
/////////////////////////////////////////////////////////
void you( struct student * head )//等级划分
{
    struct student * p;
    float a[6] = {0};
    printf ("请输入分数范围:\n优等\t良等\t差等\n");
    for ( i=0; i<6; i++)
        scanf ("%f", &a[i]);

    p = head;
    printf ("学号\t姓名\t数学\t语文\t英语\t平均分\t总分\t等级\n");
    while ( p != NULL )
    {
        for ( p=head; p!=NULL; p=p->next )
        {
            if ( p->he.zong <= a[0] && p->he.zong > a[1] )
                printf ("%ld\t%s\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t优等\n", p->he.num, p->he.name, p->he.score.math, p->he.score.chinese, p->he.score.english, p->he.pin, p->he.zong );
            if ( p->he.zong <= a[2] && p->he.zong > a[3] )
                printf ("%ld\t%s\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t良等\n", p->he.num, p->he.name, p->he.score.math, p->he.score.chinese, p->he.score.english, p->he.pin, p->he.zong );
            if ( p->he.zong <= a[4] && p->he.zong > a[5] )
                printf ("%ld\t%s\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t%1.2f\t差等\n", p->he.num, p->he.name, p->he.score.math, p->he.score.chinese, p->he.score.english, p->he.pin, p->he.zong );
        }

    }

}
///////////////////////////////////////////////////////////////////
struct student * sanchu ( struct student * head )//删除一个节点
{
    struct student * p;
    struct student * pr;

    char a[10];
    printf ("请输入你要删除的人名:");
    scanf ("%s", a);

    if ( head == NULL )
    {
        printf ("这个链表为空!\n");
        return head;
    }
    if ( strcmp (a, head->he.name) == 0 )
    {
        p = head;
        head = head->next;
        free(p);
    }
    else
    {
        pr = head;
        p = head->next;
        while( p != NULL && strcmp (a, p->he.name) != 0)
        {
            pr = p;
            p = p->next;
        }
        if ( pr != NULL )
        {
            pr->next = p->next;
            free( p );
        }
        else
        {
            printf ("没有找到要删除的东西。\n");
        }
    } 
    return head;
}
////////////////////////////////////////////////////
struct student * tian ( struct student * head )//创建并添加一个节点
{
    struct student * p;
    printf ("请输入要添加的学生的信息与成绩:\n");
    printf ("学号\t姓名\t数学\t语文\t英语\n"); 
    p = ( struct student * )malloc( M );
    scanf ("%ld %s %f %f %f", &p->he.num, p->he.name, &p->he.score.math, &p->he.score.chinese, &p->he.score.english);

    p->next = head;
    head = p;
    return head;
}

以下是对程序的运行结果和测试:
//程序运行结果
/*
请输入学生的个数:5
请输入学生的信息与成绩:
学号 姓名 数学 语文 英语
1001 张一 86 87 81
1002 张二 86 84 76
1003 张三 85 94 88
1004 张四 88 91 76
1005 张五 75 81 77
0 0 0 0 0
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1004 张四 88.00 91.00 76.00 85.00 255.00 2
1001 张一 86.00 87.00 81.00 84.67 254.00 3
1002 张二 86.00 84.00 76.00 82.00 246.00 4
1005 张五 75.00 81.00 77.00 77.67 233.00 5
是否要将学生按总分分类?
请输入是或否

请输入分数范围:
优等 良等 差等
300 200 200 100 100 0
学号 姓名 数学 语文 英语 平均分 总分 等级
1003 张三 85.00 94.00 88.00 89.00 267.00 优等
1004 张四 88.00 91.00 76.00 85.00 255.00 优等
1001 张一 86.00 87.00 81.00 84.67 254.00 优等
1002 张二 86.00 84.00 76.00 82.00 246.00 优等
1005 张五 75.00 81.00 77.00 77.67 233.00 优等
请输入你要删除的人名:张四
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1001 张一 86.00 87.00 81.00 84.67 254.00 2
1002 张二 86.00 84.00 76.00 82.00 246.00 3
1005 张五 75.00 81.00 77.00 77.67 233.00 4
请输入要添加的学生的信息与成绩:
学号 姓名 数学 语文 英语
1006 张六 86 85 85
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1006 张六 86.00 85.00 85.00 85.33 256.00 2
1001 张一 86.00 87.00 81.00 84.67 254.00 3
1002 张二 86.00 84.00 76.00 82.00 246.00 4
1005 张五 75.00 81.00 77.00 77.67 233.00 5
Press any key to continue
*/

另一次的运行结果:
请注意进行选择的地方的变动。
/*
请输入学生的个数:5
请输入学生的信息与成绩:
学号 姓名 数学 语文 英语
1001 张一 86 87 81
1002 张二 86 84 76
1003 张三 85 94 88
1004 张四 88 91 76
1005 张五 75 81 77
0 0 0 0 0
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1004 张四 88.00 91.00 76.00 85.00 255.00 2
1001 张一 86.00 87.00 81.00 84.67 254.00 3
1002 张二 86.00 84.00 76.00 82.00 246.00 4
1005 张五 75.00 81.00 77.00 77.67 233.00 5
是否要将学生按总分分类?
请输入是或否

请继续下面的操作。
请输入你要删除的人名:张四
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1001 张一 86.00 87.00 81.00 84.67 254.00 2
1002 张二 86.00 84.00 76.00 82.00 246.00 3
1005 张五 75.00 81.00 77.00 77.67 233.00 4
请输入要添加的学生的信息与成绩:
学号 姓名 数学 语文 英语
1006 张六 86 85 85
学号 姓名 数学 语文 英语 平均分 总分 名次
1003 张三 85.00 94.00 88.00 89.00 267.00 1
1006 张六 86.00 85.00 85.00 85.33 256.00 2
1001 张一 86.00 87.00 81.00 84.67 254.00 3
1002 张二 86.00 84.00 76.00 82.00 246.00 4
1005 张五 75.00 81.00 77.00 77.67 233.00 5
Press any key to continue
*/

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深林无光No.1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值