【链表冒泡排序】--创建链表存储学生的信息,并用冒泡法进行排序输出

该程序创建了一个动态链表来存储学生的信息,包括姓名、年龄、学号和分数。用户输入学生数量后,程序会逐个获取学生数据并进行存储。接着,程序使用冒泡排序算法对链表中的学生按成绩从高到低进行排序,并输出排序后的完整链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建链表存储学生信息,一个结点存储一个学生的信息,包括姓名、年龄、学号、分数。要求手动输入创建链表的长度,然后创建动态链表,并从键盘给每一个结点赋值。根据学生的成绩从高到低对链表结点进行排序,最后输出排序后的整个链表

#include<stdio.h>
#include<stdlib.h>

struct STUDENT
{
    char name[20] ;
    int age ;
    float score ;
    char num[20] ;
};

struct NODE
{
    struct STUDENT data ;
    
    struct NODE * next ;
};

struct NODE * CreateLink(void);
void IntputLink(struct NODE * );
void BubbleSort(struct NODE * );
void OutputLink(struct NODE * );

int main ()
{
    struct NODE * head = CreateLink();
    IntputLink( head ) ;
    BubbleSort( head);
    
    printf("排序后的结果如下:\n");
    OutputLink(head);
    
    return 0 ;
}

struct NODE * CreateLink()
{
    int i = 0 ;
    int cnt = 0 ;
    
    struct NODE * head = malloc ( sizeof * head );
    struct NODE * move = head ;
    move->next = NULL ;
    
    printf("请输入学生的数量:");
    scanf("%d",&cnt);
    getchar();
    
    for ( i = 0 ; i < cnt ; i ++ )
    {
        struct NODE * fresh = malloc ( sizeof * fresh );
        
        move->next = fresh ;
        fresh->next = NULL ;
        move = fresh ;
    }
    
    return head ;
}

void IntputLink( struct NODE * head )
{
    int i = 1 ;
    struct NODE * move = head->next ;
    
    while ( NULL != move )
    {
        printf("请输入第%d个学生的姓名、年龄、成绩、学号:",i);
        scanf("%s %d %f %s",move->data.name , &move->data.age , &move->data.score , move->data.num );
        getchar();
        
        move = move->next ;
        i ++ ;
    }
    return ;
}

void BubbleSort( struct NODE * head )
{
    struct NODE * move = head->next ;
    struct NODE * turn = head->next ;
    struct STUDENT buf ;
    
    if ( NULL == move )
    {
        printf("链表为空!\n");
        exit(0);
    }
    
    while ( NULL != turn->next )
    {
        while ( NULL != move->next )
        {
            if ( move->data.score < move->next->data.score )
            {
                buf = move->data ;
                move->data = move->next->data ;
                move->next->data = buf ;
            }
            move = move->next ;
        }
        move = head->next ;
        turn = turn->next ;
    }
    return ;
}

void OutputLink( struct NODE * head )
{
    struct NODE * move = head->next ;
    while ( NULL != move )
    {
        printf("【姓名:%s、年龄:%d、成绩:%.2f、学号:%s】\n",move->data.name , move->data.age , move->data.score , move->data.num );
        
        move = move->next ;
    }
    return ;
}

请输入学生的数量:5
请输入第1个学生的姓名、年龄、成绩、学号:欧阳丽 24 83 z1207038
请输入第2个学生的姓名、年龄、成绩、学号:冯小莉 20 80 z1207025
请输入第3个学生的姓名、年龄、成绩、学号:陈商清 23 85 z1207024
请输入第4个学生的姓名、年龄、成绩、学号:陈迎接 26 84 Z1207043
请输入第5个学生的姓名、年龄、成绩、学号:周琴琴 25 91 Z1207041
排序后的结果如下:
【姓名:周琴琴、年龄:25、成绩:91.00、学号:Z1207041】
【姓名:陈商清、年龄:23、成绩:85.00、学号:z1207024】
【姓名:陈迎接、年龄:26、成绩:84.00、学号:Z1207043】
【姓名:欧阳丽、年龄:24、成绩:83.00、学号:z1207038】
【姓名:冯小莉、年龄:20、成绩:80.00、学号:z1207025】
Program ended with exit code: 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值