• 链表的排序


    题目:创建两个学生链表,分别根据学生成绩对链表排序,并把这两个链表连接在一起。连接的时候,按照从小到大的顺序连接

    解析:先创建两个学生链表,输入成绩,然后进行排序(我用的是冒泡排序),先链接,然后再全部排序。(一个一个插入麻烦,我就wa了)

    代码实现

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct Link//建立链表
    {
        int data;
        struct Link *next;
    }link;
    link *head1,*head2,*tail1,*tail2;//head1,tail1刚开始都是第一组学生的链头,head2,tail2为第二组学生的链头
    void input1(int stu)//输入第一组学生成绩
    {
        int num;
        link *p;//存放下一个节点的地址
        head1=(link *)malloc(sizeof(link));//分配内存
        tail1=head1;
        for(int i=1;i<=stu;i++)
        {
            if(i!=stu)
            {
                p = head1;
                printf("请输入第%d个学生成绩:",i);
                scanf("%d",&num);
                p->data=num;
                head1=(link *)malloc(sizeof(link));
                p->next=head1;
            }
            else//最后一个不用再分配下一节点内存
            {
                printf("请输入第%d个学生成绩:",i);
                scanf("%d",&num);
                head1->data=num;
                head1->next=NULL;
            }
        }
    }
    void input2(int stu)//输入第二组学生成绩
    {
        int num;
        link *p;
        head2=(link *)malloc(sizeof(link));
        tail2=head2;
        for(int i=1;i<=stu;i++)
        {
            if(i!=stu)
            {
                p = head2;
                printf("请输入第%d个学生成绩:",i);
                scanf("%d",&num);
                p->data=num;
                head2=(link *)malloc(sizeof(link));
                p->next=head2;
            }
            else//最后一个节点
            {
                printf("请输入第%d个学生成绩:",i);
                scanf("%d",&num);
                head2->data=num;
                head2->next=NULL;
            }
        }
    }
    void add()//将两个链表合成一条链
    {
        head1->next = tail2;
    }
    void output()//输出链表
    {
        printf("所有成绩从小到大排序:");
        while(tail1!=NULL)
        {
            printf("%d ",tail1->data);
            tail1 = tail1->next;
        }
        printf("\n");
    }
    void output1(int stu1)
    {
        int i,j;
        link *p,*q;
        for(i=1;i<stu1;i++)//对链表进行冒泡排序
        {
            p=tail1;
            q=p->next;
            for(j=1;j<=stu1-i;j++)
            {
                if(p->data > q->data)
                {
                    int temp;//用于转换
                    temp = p->data;
                    p->data = q->data;
                    q->data = temp;
                }
                p = p->next;
                q = q->next;
            }
        }
        p=tail1;
        printf("第一组学生成绩从小到大排序:");
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    void output2(int stu2)
    {
        int i,j;
        link *p,*q;
        for(i=1;i<stu2;i++)//对链表进行冒泡排序
        {
            p=tail2;
            q=p->next;
            for(j=1;j<=stu2-i;j++)
            {
                if(p->data > q->data)
                {
                    int temp;//用于转换
                    temp = p->data;
                    p->data = q->data;
                    q->data = temp;
                }
                p = p->next;
                q = q->next;
            }
        }
        printf("第二组学生成绩从小到大排序:");
        p=tail2;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
    
        }
        printf("\n");
    }
    int main(void)
    {
        int stu1,stu2,i,j;//stu1为第一组学生人数,stu2为第二组学生人数
        link *p,*q;//排序的时候可以用
        printf("请输入第一组的学生人数:");
        scanf("%d",&stu1);
        input1(stu1);
        output1(stu1);
        printf("请输入第二组的学生人数:");
        scanf("%d",&stu2);
        input2(stu2);
        output2(stu2);
        add();
        for(i=1;i<stu1+stu2;i++)//对链表进行冒泡排序
        {
            p=tail1;
            q=p->next;
            for(j=1;j<=stu1+stu2-i;j++)
            {
                if(p->data > q->data)
                {
                    int temp;//用于转换
                    temp = p->data;
                    p->data = q->data;
                    q->data = temp;
                }
                p = p->next;
                q = q->next;
            }
        }
        output();
    }

     

  • 相关阅读:
    LeetCode 560 和为 K 的子数组
    idea使用技巧汇总
    【Kafka核心技术与实战】导读
    如何永久关闭 Mybase8 登录弹窗(license提醒)
    分析Edk2启动流程
    OEE计算
    线段树分治学习笔记
    linux 安装PostgreSql 12[转]
    Linux中redis数据备份和迁移【转】
    DataGrid控件自动显示行号
  • 原文地址:https://www.cnblogs.com/zhaohongjie/p/12461279.html
Copyright © 2020-2023  润新知