1276 - C语言11.12
有两个链表a和b,设节点中包含学号、姓名。从a链表中删去b链表中有相同学号的那些节点。
Input
第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。
之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。
Output
首先输出a链表最终剩下的节点个数k。
在接下来的k行,每行输出两个用空格隔开的整数,分别表示一个学生的学号和成绩。
请注意行尾输出换行。
Examples
Input
3 3 106 90 104 80 101 85 104 95 106 88 105 87
Output
1 101 85
Solution C
#include <stdio.h> main() { int n, m, i, s=0,a[111][2],b[111][2],t=0,j; scanf("%d%d",&m,&n); for(i=0;i<m;i++) { scanf("%d%d",&a[i][0],&a[i][1]); } for(i=0;i<n;i++) { scanf("%d%d",&b[i][0],&b[i][1]); } for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(a[i][0]==b[j][0]) { t++; a[i][0]=-1; continue; } } } printf("%d\n",m-t); for(i=0;i<m;i++) { if(a[i][0]!=-1) printf("%d %d\n",a[i][0],a[i][1]); } return 0; }
Solution C++
#include <stdio.h> #include <stdlib.h> struct node { int num, score; struct node * next; }; int main() { struct node *heada, *taila, *headb, *tailb, *pa, *pb, *p; heada = taila = headb = tailb = NULL; int n, m, i; scanf("%d %d", &n, &m); /* 读入a链表中的n个学生信息 */ for (i = 0;i < n;i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d %d", &p->num, &p->score); if (heada == NULL) { heada = taila = p; } else { taila->next = p; taila = p; } } taila->next = NULL; /* 读入b链表中的m个学生信息 */ for (i = 0;i < m;i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d %d", &p->num, &p->score); if (headb == NULL) { headb = tailb = p; } else { tailb->next = p; tailb = p; } } tailb->next = NULL; /* 遍历a链表的每一个节点,判断b链表中是否有相同学号的节点 */ pa = p = heada; while (pa != NULL) { pb = headb; while (pb != NULL) { if (pa->num == pb->num) break; pb = pb->next; } /* b链表中有相同学号的节点,需要删除pa指向的节点 */ if (pb != NULL) { if (pa == heada) { heada = pa->next; free(pa); pa = p = heada; } else { p->next = pa->next; free(pa); pa = p->next; } n--; } else { /* b链表中没有相同学号的节点,直接处理下一个节点 */ p = pa; pa = pa->next; } } /* 将合并后的链表进行输出 */ printf("%d\n", n); p = heada; while (p != NULL) { printf("%d %d\n", p->num, p->score); p = p->next; } return 0; }