游客 Signup | Login
中文 | En

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;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题