一道数组题

永远的魔术1号 2012-02-08 09:10:09
有 int a[5] = {1,2,3,4,5}; int b[3] = {1,3,5};
怎样做到在数组a中查找b数组中相同的元素,并从a数组中剔除掉。
...全文
232 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2012-02-09
  • 打赏
  • 举报
回复
涮法啊涮法。
Luffy_yi 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yzx0803060320 的回复:]
因为已经排过序,下面的代码可能效率高些
#include "stdio.h"
void main()
{
int a[5] = {1,2,3,4,5};
int b[3] = {1,3,5};
int i,j,k;

while(i<5)
{
if(a[i]==b[j])
{
do{
k=i;
a[k]=a[k+1];
}……
[/Quote] 这个不会越界吗?
赵4老师 2012-02-09
  • 打赏
  • 举报
回复
仅供参考
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXLINES 1000000
#define MAXCHARS 256
char buf[MAXLINES][MAXCHARS];
char P[256]="PROG";//程序Program需要的文件列表
char L[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int c,n,L1,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG
if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
if ((fl=fopen(L,"rt"))==NULL) {
fprintf(stderr,"Can not open %s\n",L);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 1;
}
if ((fp=fopen(P,"rt"))==NULL) {
fclose(fl);
fprintf(stderr,"Can not open %s\n",P);
return 2;
}
n=0;
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fl)==NULL) break;//
hh++;
L1=strlen(ln)-1;
if ('\n'!=ln[L1]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",L,hh,MAXCHARS);
while (1) {
c=fgetc(fl);
if ('\n'==c || EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L1] || ' '==ln[L1]) {
ln[L1]=0;
L1--;
if (L1<0) break;//
} else break;//
}
if (L1>=0) {
strcpy(buf[n],ln);
n++;
if (n>=MAXLINES) {
fclose(fl);
fclose(fp);
fprintf(stderr,"%s up to %d lines",L,MAXLINES);
return 3;
}
}
}
fclose(fl);
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fp)==NULL) break;//
hh++;
L1=strlen(ln)-1;
if ('\n'!=ln[L1]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",P,hh,MAXCHARS);
while (1) {
c=fgetc(fp);
if ('\n'==c || EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L1] || ' '==ln[L1]) {
ln[L1]=0;
L1--;
if (L1<0) break;//
} else break;//
}
if (L1>=0) {
if (ignore_case) {
if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
} else {
if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
}
}
}
fclose(fp);
return 0;
}
「已注销」 2012-02-09
  • 打赏
  • 举报
回复

[Quote=引用 6 楼 hfhf2006 的回复:]
看看行不!

C/C++ code

#include "stdio.h"
void main()
{
int a[5] = {1,2,3,4,5};
int b[3] = {1,3,5};
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<3;j++)
{
if(a[i……
[/Quote]
不应该用while(k<5)来结束吧
Yaozhx 2012-02-09
  • 打赏
  • 举报
回复
i,j先赋0.[Quote=引用 8 楼 yzx0803060320 的回复:]
因为已经排过序,下面的代码可能效率高些
#include "stdio.h"
void main()
{
int a[5] = {1,2,3,4,5};
int b[3] = {1,3,5};
int i,j,k;

while(i<5)
{
if(a[i]==b[j])
{
do{
k=i;
a[k]=a[k+1];
}……
[/Quote]
Yaozhx 2012-02-09
  • 打赏
  • 举报
回复
因为已经排过序,下面的代码可能效率高些
#include "stdio.h"
void main()
{
int a[5] = {1,2,3,4,5};
int b[3] = {1,3,5};
int i,j,k;

while(i<5)
{
if(a[i]==b[j])
{
do{
k=i;
a[k]=a[k+1];
}while(k<5)
i++;
}
else if(a[i]>b[j])
j++;
else
i++;
}
程序员小迷 2012-02-09
  • 打赏
  • 举报
回复
如果要追求效率,且是排序好的两个数组,那么可以稍微优化下:
每次剔除掉一个数,数组起始指针都向后移动一个
打酱油BY 2012-02-08
  • 打赏
  • 举报
回复
看看行不!

#include "stdio.h"
void main()
{
int a[5] = {1,2,3,4,5};
int b[3] = {1,3,5};
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<3;j++)
{
if(a[i]==b[j])
do{
k=i;
a[k]=a[k+1];
}while(k<5)
}

}
sunfen0307 2012-02-08
  • 打赏
  • 举报
回复
课本有解!
IVERS0N 2012-02-08
  • 打赏
  • 举报
回复
孤独小剑 2012-02-08
  • 打赏
  • 举报
回复
楼主作业题还是自己先试着搞搞,遇到问题了再来提问。
AnYidan 2012-02-08
  • 打赏
  • 举报
回复
严蔚敏 数据结构 的例题
尘缘udbwcso 2012-02-08
  • 打赏
  • 举报
回复
用链表吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧