本帖最后由 dt3tc 于 2019-8-31 21:42 编辑
题目描述
第一行输入两个整数n,m(0<n,m<=1000),分别代表第一个集合和第二个集合的元素的数量。
第二行输入n个整数,表示第一个集合中的元素,元素之间用空格隔开。
第三行输入m个整数,表示第二个集合中的元素,元素之间用空格隔开。
两个集合中的元素范围在[0,100000]区间内,集合中不存在重复元素。
输入
第一行,两个整数n,m。
第二行,n个整数,表示序列中的元素。
第三行,m个整数,表示序列中的元素。
输出
一行,从小到大输出交集,保证存在交集。
样例输入
2 3
1 3
1 2 3
样例输出
1 3
提示
无
我的答案:
main.c#include <stdio.h>
#include <stdlib.h>
//#define DEBUG1
#define DEBUG2
int main(void)
{
int x=0,y=0;
#include "debug1.h"
int m=0,n=0;
scanf("%d %d",&m,&n);
#include "debug1.h"
int a[m];
int z=0;
for(int c=0;c<m;c++){
scanf("%d%*c",&z);
if(z>0&&z<100000)a[c]=z;
}
#include "debug1.h"
int b[n];
for(int c=0;c<n;c++){
scanf("%d%*c",&z);
if(z>0&&z<100000)b[c]=z;
}
#include "debug1.h"
typedef struct number Num;
#include "debug1.h"
struct number{
Num* previous;
int value;
Num* next;
};
#include "debug1.h"
Num* first=(Num*)malloc(sizeof(Num));
Num* current=first;
#include "debug1.h"
for(int d=0;d<m;d++){
for(int e=0,f=0;e<n;e++){
if(a[d]==b[e]){
printf("%d ",a[d]);
current->value=a[d];
current->next=(Num*)malloc(sizeof(Num));
current=current->next;
current->next=NULL;
}
}
}
#include "debug1.h"
Num* last=current;
last->next=NULL;
#include "debug1.h"
int g=0;
for(current=first;current!=last;current=current->next){
if(current->value>(current->next)->value){
g=(current->next)->value;
(current->next)->value=current->value;
current->value=g;
}
#include "debug2.h"
}
#include "debug1.h"
for(current=first;;current=current->next){
printf("%d",current->value);
free(current->previous);
if(current==last)break;
}
return 0;
}
debug1.h#ifdef DEBUG1
x++;
printf("x==%d\n",x);
#endif
debug2.h#ifdef DEBUG2
y++;
printf("y==%d\n",y);
#endif
makefileall:main.exe
main.exe:main.c debug1.h debug2.h
gcc -o main.exe main.c
每次关闭DEBUG1宏运行就报错Aborted (核心已转储)
打开它就没事
编译器是msys2 软件源中的 gcc 7.4.0
操作系统 win10 64bit
谢谢
本帖最后由 superbe 于 2019-9-1 12:40 编辑
#include <stdio.h>
#include <stdlib.h>
//#define DEBUG1
#define DEBUG2
int main(void)
{
int x=0,y=0;
#include "debug1.h"
int m=0,n=0;
scanf("%d %d",&m,&n);
#include "debug1.h"
int a[m];
int z=0;
for(int c=0;c<m;c++){
scanf("%d%*c",&z);
if(z>0&&z<100000)a[c]=z;
}
#include "debug1.h"
int b[n];
for(int c=0;c<n;c++){
scanf("%d%*c",&z);
if(z>0&&z<100000)b[c]=z;
}
#include "debug1.h"
typedef struct number Num;
#include "debug1.h"
struct number{
Num* previous;
int value;
Num* next;
};
#include "debug1.h"
Num* first=(Num*)malloc(sizeof(Num));
Num* current=first;
#include "debug1.h"
for(int d=0;d<m;d++){
for(int e=0,f=0;e<n;e++){
if(a[d]==b[e]){
printf("%d ",a[d]);
current->value=a[d];
current->next=(Num*)malloc(sizeof(Num));
current->next->previous=current; //原代码缺少这一行,previous没有初始化
current=current->next;
current->next=NULL;
}
}
}
printf("\n");
#include "debug1.h"
Num* last=current->previous; //上面循环完成后,最后一个Num是多余的,所以回退一个
last->next=NULL;
#include "debug1.h"
int g=0;
for(current=first;current!=last;current=current->next){ //如果不回退,这里排序可能会将最后一个无效Num也包括在内
if(current->value>(current->next)->value){
g=(current->next)->value;
(current->next)->value=current->value;
current->value=g;
}
#include "debug2.h"
}
#include "debug1.h"
for(current=first;;current=current->next){
printf("%d ",current->value);
//free(current->previous); //原代码因为previous没有初始化,所以这里可能出问题,改成下面一行
if(current!=first) free(current->previous); //第1个Num没有previous所以判断一下
if(current==last)break;
}
free(current); //最后一个Num没有释放,单独释放一下
return 0;
}
|