解题思路:
1)首先先给链表取长度

2)给两个链表的各个节点赋值

3)查找a链表中与b链表学号相同的节点进行释放节点

4)遍历a链表中的所有数据
注意事项:

1)再给链表释放的过程中注意利用临时变量保存好链表的下一个节点的地址,以免发生不必要的错误

2)链表释放过程中要考虑各种边界条件(比如:链表头)。
参考代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct Student {
	int id;   //学号
	int score;  //成绩
	struct s_a *Next;
} sa, sb;



int main() {
	int id, score, n, m, i;
	sa *heada = NULL;
	sb *headb = NULL;

	scanf("%d%d", &n, &m);                                           //两个链表的长度
/************************************************************/		//链表a赋值
	for( i=1; i<=n; i++) {
		sa *pa = (sa*)malloc(sizeof(sa));
		scanf("%d%d", &id, &score);
		pa->id = id;
		pa->score = score;
		pa->Next = NULL;
		sa *lasta = heada;
		if(lasta) {
			while(lasta->Next) {
				lasta = lasta->Next ;
			}
			lasta->Next = pa;
		} else {
			heada = pa;
		}
	}
/************************************************************/		//链表b赋值
	for( i=1; i<=m; i++) {
		sb *pb = (sb*)malloc(sizeof(sb));
		scanf("%d%d", &id, &score);
		pb->id = id;
		pb->score = score;
		pb->Next = NULL;
		sb *lastb = headb;
		if(lastb) {
			while(lastb->Next ) {
				lastb = lastb->Next ;
			}
			lastb->Next = pb;
		} else {
			headb = pb;
		}
	}
/************************************************************/		//查找相同学号并释放链表
	sa *ta = heada;
	sb *tb = headb;
	for( tb; tb; tb=tb->Next ){
		ta = heada;
		sa *qa; //临时变量
		for( ta, qa=NULL; ta; qa=ta, ta=ta->Next ){
			if(ta->id == tb->id ){
				if(qa){
					qa->Next = ta->Next ;
				} else {
					heada = ta->Next ;
				}
				free(ta);
				n--;
				break;
			}
		}
	}
	
/************************************************************/		//遍历显示
	ta = heada;
	printf("%d\n", n);
	for( ta; ta; ta=ta->Next ) {
		printf("%d %d\n", ta->id ,ta->score  );
	}

	return 0;
}


点赞(1)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论