链表的排序

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

解析:先创建两个学生链表,输入成绩,然后进行排序(我用的是冒泡排序),先链接,然后再全部排序。(一个一个插入麻烦,我就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();
}

#include <stdio.h>

#include <stdlib.h>

typedef struct Link//建立链表

{

    int data;

    struct Link *next;

}link;

扫描二维码关注公众号,回复: 9752400 查看本文章

link *head1,*head2,*tail1,*tail2;//head1tail1刚开始都是第一组学生的链头,head2tail2为第二组学生的链头

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();

}

猜你喜欢

转载自www.cnblogs.com/zhaohongjie/p/12461279.html