解题思路:

参考了最赞,不过大部分按照自己理解重新写了答案

1、新建链表节点结构体;

2、定义创建链表函数;

3、定义合并链表函数;

4、定义链表按学号升序函数;

5、定义输出链表数据函数;

6、主函数:输入两张链表的长度,创建两张链表,合并两张链表,排序链表,最后输出链表。

注意事项:

新手,虽然运行没有报错,结果也是正确的,但是可能代码有语句上的错误,仅供参考。

参考代码:

#include <stdio.h>

#include <malloc.h>


typedef struct student

{

    int sid;

    int score;

    struct student *next;

}*node;    //链表节点结构体


node creat(int n)    //创建链表函数

{

    int i;

    node h;    //创建头节点

    h=(node)malloc(sizeof(node));    //给头结点分配内存

    h->next=NULL;    //此时头结点也是尾结点,下一节点指向NULL

    node q=h;    //指针q指向尾结点,此时尾结点是头结点

    node p;    //该节点是用于新建节点

    for(i=0;i<n;i++)    //函数输入的n为带数据节点的数量

    {

        p=(node)malloc(sizeof(node));    //给新节点分配内存

        scanf("%d %d",&(p->sid),&(p->score));    //输入数据

        p->next=NULL;    //此时新建的结点是尾结点,下一节点指向NULL

        q->next=p;    //q指向之前的尾结点,之前的尾结点的下一节点指向新节点

        q=p;    //此时尾结点是新建的结点

    }

    return h;    //返回头结点

}


node combine(node l1,node l2)    //合并链表函数

{

    node q;

    q=l1;    //指针指向表a的头结点l1

    while(q->next!=NULL) q=q->next;    //通过一次次下移,指针指向表a尾结点

    q->next=l2->next;    //表a的尾结点的下一节点指向表b的第一个有数据的节点

    return l1;    //返回头结点

}


node order(node l)    //排序函数

{

    int t0,t1;

    node q,p;

    q=l->next;    //q指向表的第一行数据

    while(q->next!=NULL)    //q一直到倒数第二行数据

    {

        p=q->next;    //p指向q的下一行数据

        while(p!=NULL)    //p和q一直比较到之后以后数据

        {

            if(q->sid>p->sid)    //如何q的sid比p大就交换两行数据

            {

                t0=q->sid;

                t1=q->score;

                q->sid=p->sid;

                q->score=p->score;

                p->sid=t0;

                p->score=t1;

            }

            p=p->next;    //p指向p的下一行

        }

        q=q->next;    //q指向q的下一行

    }

    return l;    //返回头结点

}


void output( node l )      //输出链表函数

{

    l = l->next;    //下移一个节点

    node q; //用于释放每个结点

    while ( l != NULL )    //直到到最后一行数据

    {

        printf( "%d %d\n", l->sid, l->score );    //输出该行数据

        q=l;    //q指向该节点

        l = l->next;    //下移一个节点

        free(q);  //释放结点

    }

}



int main()

{

    int m,n;

    node l1,l2;

    scanf("%d %d",&m,&n);  //输入的第一行两个数字为两个表长度

    l1=creat(m);  //新建表a

    l2=creat(n);  //新建表b

    combine(l1,l2);  //合并表a、b成新表a

    order(l1);  //按sid排序表a

    output(l1);  //输出表a

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论