解题思路:,先定义结构体,循环开辟节点,动态录入学生数据,连接a,b链表,只需要a链表的尾节点指向b链表的第一个数据节点,连接以后使用冒泡排序(嵌套循环),两种方法,1,交换节点数据,不改变链表结构,2,直接交换节点

注意事项:

参考代码:

#include <stdio.h>

#include <stdlib.h>

//#include <Windows.h>

#define N m+n  //a,b链表合并后链表数据节点的个数

struct students

{

   int num;//学号

   int score;//成绩

   struct students * next;//结构指针

};


struct students1

{

   int num;//学号

   int score;//成绩

   struct students1 * next;//结构指针

};



int main()

{

int temp2,temp3;

int m,n,i,j;//m为a链表元素数量,n为b链表元素的数量

struct students * h = NULL,*temp = NULL,*t = NULL,*p = NULL,*p1p,*p3p;

struct students1 * h1 = NULL,*temp1 = NULL,*t1 = NULL,*p1 = NULL;

struct students * a = NULL;

h = (struct students *)malloc(sizeof(struct students));

h1 = (struct students *)malloc(sizeof(struct students));

t = h;

t1 = h1;

//printf("请输入a,b链表元素的数量:\n");

scanf("%d %d",&m,&n);

//printf("a\n");

for(i = 0;i < m;i++)//动态录入链表a的数据域

{

temp = (struct students *)malloc(sizeof(struct students));

scanf("%d %d",&temp->num,&temp->score);

t->next = temp;

t = temp;

   

}

t->next = NULL;

//printf("b\n");

for(i = 0;i < n;i++)//动态录入链表b的数据域

{

temp1 = (struct students *)malloc(sizeof(struct students));

scanf("%d %d",&temp1->num,&temp1->score);

t1->next = temp1;

t1 = temp1;

   

}

t1->next = NULL;

//可以先插入链表最后按学号升序排列

//把b链表插入a链表中-直接把b链表的第一个数据节点插入即可

a = h1->next;//现在a是待插入的节点

//while(a != NULL)

//{

t = h->next;//节点将要插入的链表

    while(t != NULL)

    {

    if(t->next == NULL)//找到了尾节点

    {

    t->next = a;//原来的尾节点指向待插入的节点

    //a->next = NULL;//新插入的节点指向为空

break;

    }

   t = t->next;//循环变量的更新

    }

//a = a->next;

//}

//两个链表已合并,按学号排序a链表


for(i = 0;i < N - 1;i++)

{

        a = h->next;

for(j = 0;j < N - i - 1;j++)

{

if(a->num > a->next->num)

{

for(p = h;p !=NULL;p = p->next)

{

if(p->next == a)

p1p = p;

if(p->next == a->next)

p3p = p;

}

//直接交换节点

p = a->next->next;//储存尾节点

p1p->next = a->next;

a->next->next = a;

a->next = p;

/*

temp2 = a->num;//交换链表数据域的内容

temp3 = a->score;

a->num = a->next->num;

a->score = a->next->score;

a->next->num = temp2;

a->next->score = temp3;

*/

}

else

{

    a = a->next;

}

}

}



//输出链表

//printf("输出链表\n");

    p = h->next;

    if(p == NULL)printf("空表");

    else

    {

        while(p != NULL)

        {

            printf("%d %d\n",p->num,p->score);

            p = p->next;

        }



    }


return 0;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论