链表的排序

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

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

 

 

posted @ 2020-03-11 11:35  头巨铁  阅读(368)  评论(0编辑  收藏  举报