1276 - C语言11.12

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

有两个链表a和b,设节点中包含学号、姓名。从a链表中删去b链表中有相同学号的那些节点。

题目输入

第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。

之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。

题目输出

首先输出a链表最终剩下的节点个数k。

在接下来的k行,每行输出两个用空格隔开的整数,分别表示一个学生的学号和成绩。
请注意行尾输出换行。

输入/输出样例

输入格式

3 3
106 90
104 80
101 85
104 95
106 88
105 87

输出格式

1
101 85

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;

}

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;
}

Java解答



import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{
   private static Scanner s = new Scanner(System.in) ;
   
   public static void main(String[] args) {
	    int a = s.nextInt() ;
	    int b = s.nextInt() ;
	    if(a>=0&&a<=100&&b>=0&&b<=100){
	    List<Student> A = new ArrayList<Student>() ;
	    List<Student> temp = new ArrayList<Student>() ;
	    List<Student> B = new ArrayList<Student>() ;
	    
	    
	    
	    for (int i = 0; i < a; i++) {
	    	Student stu = new Student() ;
			int n = s.nextInt() ;
			int m = s.nextInt() ;
			
				stu.num = n ;
				stu.score = m ;
				A.add(stu) ;
			}
	    
        for (int i = 0; i < b; i++) {
        	Student stu = new Student() ;
			int n = s.nextInt() ;
			int m = s.nextInt() ;
				stu.num = n ;
				stu.score = m ;
				B.add(stu) ;
			}
        for (Student student : A) {
			temp.add(student) ;
		}
        for (Student student : temp) {
			for (Student student2 : B) {
				if(student2.num==student.num){
					A.remove(student) ;
				}
			}
		}
        System.out.println(A.size());
        for (Student student : A) {
			System.out.println(student.num+" "+student.score);
		}
}
}}

class Student{
	int num ;
	int score ;
}