logo资料库

C.C++笔试面试必备宝典.doc

第1页 / 共234页
第2页 / 共234页
第3页 / 共234页
第4页 / 共234页
第5页 / 共234页
第6页 / 共234页
第7页 / 共234页
第8页 / 共234页
资料共234页,剩余部分请下载后查看
C++笔试题
1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?
2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第
3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)
4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)
5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用C/
6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列, 2、3、5、13...是Fab
7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么
,你喜欢使用哪个,为什么?
9.变量的声明和定义有什么区别?
12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法
13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Recta
14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编
15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的
16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。
17.分别实现itoa和atoi.
18.Consider the following code:
19.int w=1,x=2,y=3,z=4;
20.说出结果 ???
21.有双向循环链表结点:(华为面试题)
22.
23.1)字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
24.Assignment 2: Picture Processing
25.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换!!
26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的
27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为
28.找错:
29.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符
30.编写一个函数将一条字符串分成两部分,将前半部分按ASCII码升序排序,后半部分不变,(如果字符
31.找错
32. 找错
33. 写出程序运行结果
34. int func(int a)
<>
25.完成下列程序
26 完成程序,实现对数组的降序排序
27 费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你
28 下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
29. A class B network on the internet has a subnet
31. For a class what would happen if we call a cla
32. “new”in c++ is a:
33. Which of the following information is not cont
34. What’s the number of comparisons in the worst
35. Time complexity of n algorithm T(n), where n i
36. The number of 1’s in the binary representation
37.设计函数 int atoi(char *s)。
38.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是
39.解释局部变量、全局变量和静态变量的含义。
40.解释堆和栈的区别。
41.论述含参数的宏与函数的优缺点。
42. 以下三条输出语句分别输出什么?[C易]
43. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]
44. 以下代码中的两个sizeof用法有问题吗?[C易]
45. 以下代码有什么问题?[C难]
46. 以下代码有什么问题?[C++易]
47. 以下代码有什么问题?[C++易]
48. 以下代码中的输出语句输出0吗,为什么?[C++易]
49. C++中的空类,默认产生哪些类成员函数?[C++易]
50. 以下两条输出语句分别输出什么?[C++难]
51. 以下反向遍历array数组的方法有什么错误?[STL易]
52. 以下代码有什么问题?[STL易]
53. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
54 线程与进程的区别
55:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?
56:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?
57:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
58:请问C++的类和C里面的struct有什么区别?
59:请讲一讲析构函数和虚函数的用法和作用?
60:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
61:一些寄存器的题目,主要是寻址和内存管理等一些知识。
几道题目及自做答案
北电
普天C++笔试题
微软
微软亚洲
微创笔试题目(微创,微软在中国的合资公司)
Intel笔试面试题目
  智力题
笔试题目
实验室笔试题
IBM
IBM笔试题目
智力题
社会招聘笔试题
宝洁公司(P&G)面试题目
飞利浦笔试试题
 阿尔卡特(中国)的面试题目
Google
 戴尔
意法半导体软件试题
Sony笔试题
 华为笔试题
华为
华为全套完整试题
(慧通)
华为面试题:
大唐电信
大唐面试试题
网通笔试题
东信笔试题目
中软融鑫笔试题
Delphi笔试题目
EE笔试试题
软件笔试题
Hongkong Bank笔试题
A.T. Keaney笔试题
Shell company笔试题
KPMG笔试题
香港电信笔试题
LORAL的笔试题
维尔VERITAS软件笔试题
百威啤酒(武汉公司)
星巴克
凹凸电子软件笔试题
友立资讯笔试题目
Avant! 微电子EE笔试题
德勤笔试题
扬智(科技)笔试题目
 高通笔试题
威盛笔试试题
2003 EE笔试题目
2003 Graphic笔试题目
汉王笔试题
北京信威通信
中国国际金融有限公司CICC笔试题
国泰君安笔试题
广东北电面试题目
广州本田笔试题
明基面试问题
网易
 广州日报
下面有些题也不错,可以参考.
联想笔试题
普天C++笔试题
Sony笔试题
微软亚洲技术中心的面试题!!!
1.进程和线程的差别。
2.测试方法
2.Heap与stack的差别
3.Windows下的内存是如何管理的?
4.介绍.Net和.Net的安全性。
6.C/C++编译器中虚表是如何完成的?
7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。
8.谈谈IA32下的分页机制
9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?
10.在IA32中一共有多少种办法从用户态跳到内核态?
11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?
12.如何截取键盘的响应,让所有的‘a’变成‘b’?
13.Apartment在COM中有什么用?为什么要引入?
14.存储过程是什么?有什么用?有什么优点?
15.Template有什么特点?什么时候用?
16.谈谈Windows DNA结构的特点和优点。
17.网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?
MSRA Interview Written Exam(December 2003,Time:2.5
1写出下列算法的时间复杂度。
2写出下列程序在X86上的运行结果。
3写出下列程序的运行结果。
4写出下列程序所有可能的运行结果。
5考察了一个CharPrev()函数的作用。
6对 16 Bits colors的处理,要求:
7一个链表的操作,注意代码的健壮和安全性。要求:
8一个给定的数值由左边开始升位到右边第N位,如 0010<<1 == 0100 或者 0001 0
附加题(只有在完成以上题目后,才获准回答)
汉略曾考的测试题目
16道C语言面试题例子
群硕笔试:
基础题:
autodesk笔试
C语言面试题大汇总
思科
慧通:
/*雅虎笔试题(字符串操作)
华为3COM
moto:
表示已有答案 表示没有处理 表示答案不确定 C++笔试题 1.多态类中的虚函数表是 Compile-Time,还是 Run-Time 时建立的? 答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐 藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键. 2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符, 以此类推。 //实现对一个文本文件内容的反向显示。 #include #include void main ( ) { char c; FILE *fp; if ((fp=fopen("test.txt","r")) == NULL) //以读方式打开文本文件 { printf ("Cannot open file.\n"); exit(1); } fseek( fp, 0L, 2 ); //定位文件尾。注意此时并不是定位到文件的最后一字符, //而是在定位文件最后一个字符之后的位置 while ((fseek(fp, -1L, 1))!=-1) // 相对当前位置退后一个字节 { c=fgetc(fp); putchar (c); //如果定位成功,读取当前字符并显示 /* 读取字符成功,文件指针会自动移到下一字符位置 */ if (c=='\n') /* 若读入是\n 字符 */ fseek(fp, -2L,1); /* 由于 DOS 在文本文件中要存回车 0x0d 和换 */ /* 行 0x0a 两个字符,故要向前移动两个字节 */ else fseek (fp, -1L, 1); /* 文件指针向前移动一个字节,使文 */ } /* 件指针定位在刚刚读出的那个字符 */ fclose (fp); /* 操作结束关闭文件 */ } 3.main 主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题) 答案:可以,可以用_onexit 注册一个函数,它会在 main 之后执行; 如果你需要加入一段在 main 退出后执行的代码,可以使用 atexit()函数,注册一个函数。 (*function")(void)); fn2( void ), fn3( void ), fn4( void ); executed first.\n" ); atexit(void 语法: #include int #include #include void ), fn1( int main( ) { void void atexit( atexit( atexit( atexit( printf( fn1 fn2 fn3 fn4 "This ); ); ); ); is } void { } void fn1() printf( "next.\n" ); fn2() 1
{ } void { } void { } printf( "executed " ); fn3() printf( "is " ); fn4() printf( "This " ); is is executed executed first. next. 结果: This This 4.一个父类写了一个 virtual 函数,如果子类覆盖它的函数不加 virtual ,也能实现多态? 在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题) 答案:只要基类在定义成员函数时已经声明了 virtue 关键字,在派生类实现的时候覆盖该函数时,virtue 关键字可加可不加,不影响多 态的实现。子类的空间里有父类的所有变量(static 除外)。 5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用 C/C++语言写一函数完成 该算法,给出复杂度 从对一个字符开始,假设其为最长的串的第一个,向后查找下一个与它相同的字符,确定单循环的长度,再验证是 否是连续出现的(类似于循环节),如后面不重复,则向后取一个字符,重复开始判断,当取得一个循环节并且后 面重复时,记录其总长度,向后开继续判断,如找到更长的,则输出最长的,否则,把第一个结果输出 。 6.对序列 1、1、2、3、5、8、13。。。。 是 Fab..数列, 2、3、5、13...是 Fab..质数数列,因为他们与自己前面 的 Fab...数列都互质,给出 k,返回比 k 小的 Fab..质数 #include #include #include using namespace void findFib(int k) { }//end for 2 if (found) { found = false; break; }//end if std; vector fib1; vector fib2; fib1.push_back(1); fib1.push_back(1); fib1.push_back(2); fib2.push_back(2); bool found = false; int len = fib1.size(); int f = 0; while (fib1[len - 1] < k) { f = fib1[len - 2] + fib1[len - 1]; fib1.push_back(f); len ++; } for (int i = 2;i < fib1.size()-1;i++) { found = true; for (int j = 0; j< fib2.size();j++) { if (fib1[i] % fib2[j] == 0) { fib2.push_back(fib1[i]); } }//end for 1 for (i = 0;i < fib2.size();i++) { printf("%d ",fib2[i]); } printf("\n"); } void main() { int k; printf("input k\n"); scanf("%d",&k); while (k >2) { findFib(k); printf("input k\n"); scanf("%d",&k); } } 2
7.101 个硬币 100 真、1 假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。 硬币分成三堆,俩堆 50 个,和另外一个 1,称俩堆 50 个,如果重量相等。 则说明假币是那单独的一个, 随便取一个真币和这个假币做比较,即可得出哪个硬币更重 如果重量不相等,说明剩下那个硬币是真的,然后俩堆 50 个里面有一个必然是假的,同时天平不平衡。 用一个真币跟这俩堆比较显然得不出结果。 另外一个思路,如果分出假币在哪一堆,又由于假币只有一个,则可以得出是假币重还是真币重,所以可以任取一 堆,分成俩份 25 个,称一次,如果重量相等,那么假币在另外一堆,否则假币在原先的 50 个一堆里,然后再结合 先前一次称的时候俩堆 50 个币的轻重大小即可得知是假币重还是真币重 8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么区别 ,你喜欢使用哪个,为什么? 答案:这些函数的区别在于 实现功能 以及 操作对象 不同。 1.strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。 2.sprintf 函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的 数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定 %s 格 式符,也可实现字符串拷贝功能。 3.memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块 这一功能。内存块由其首 地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间 或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起 始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意 义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。 对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同: strcpy 无疑是最合适的选择:效率高且调用方便。 snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。    memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的 话(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函 数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没 有什么大的差别。 对于非字符串类型的数据的复制来说,strcpy 和 snprintf 一般就无能为力了,可是对 memcpy 却没有什么影响。 但是,对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或 兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。memcpy 的长处是用来实现(通常是内部 实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。 9.变量的声明和定义有什么区别? 声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义 是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都 要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于 函数,编译器会生成代码,这些代码最终也要占用一定的内存。 在 C 和 C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为 ODR,单一定义 规则)。。。 定义也可以是声明,如果有 int x;,之前编译器未发现标识符 x,编译器则把这一标识符看成是定义并立即为它 分配存储空间。 。。。。。 对“变量声明”的解释向来模糊且自相矛盾。。。 函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出 这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如 int a;但这产生了一个矛盾,这 段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于 C 和 C++需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是 extern,它表示变量是 在文件以外定义的,或在文件后面定义的。 在变量定义前加 extern 表示声明一个变量但不定义它,如: extern extern 也可用于函数声明,如: extern length,int func1(int width); a; int int 3
但由于没有函数体,编译器必把它当成声明而非定义,extern 对于函数来说是多余的、可选的。C 语言的设计者并 不要求函数声明使用 extern,这可能有些令人遗憾,如果函数声明也要求用 extern,那么形式上与变量声明更加一 致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用 extern 的原因)。。。 10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质: #include #include int main(void) { char a[30]; char *b = (char *)malloc(20 * sizeof(char)); //30 printf("%d\n", sizeof(a)); printf("%d\n", sizeof(b)); //4 //1 printf("%d\n", sizeof(a[3])); //4 printf("%d\n", sizeof(b+3)); printf("%d\n", sizeof(*(b+4))); //1 return 0 ; } sizeof 就是要求一种数据(类型)所占内存的字节数. 对于 4.1 中的 s 和 p sizeof(s)应为 6, 而 sizeof(p)应为一个"指针"的大小. 12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。 a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。 第一种 unsigned TestAsOne0(char log) int i; int unsigned for(i=0; { int i<8; num=0, i++) val; val = log >> i; val &= 0x01; if(val) //移位 //与 1 相与 num++; } return num; { } { } 第二种 unsigned int TestAsOne1(char log) num=0, val; i; int int unsigned while(log) { log &= (log -1); num++; } return num; b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。 int Invert(char *str) { int num=0; while(*str!='\0') { int digital=*str-‘0’; num=num*10+digital; str=str+1; } return num; } 4
c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。 void { IntToCharChange(int num, char* pval) char int int int strval[100]; j; i, val0 = 0; val1 = 0; //取余 //取整 //数字—字符 / i++) val0 = num; for(i=0; i<100; { val1 = val0 % 10; val0 = val0 10; strval[i] = val1 + ‘0’; if(val0 < 10) { i++; strval[i] = val0 + ‘0’; break; } } for(j=0; { pval[j] = strval[i-j]; } pval[j] = '\0'; j<=i; j++) //倒置 } void { int int d)请编写一个 C 函数,该函数将一个字符串逆序。 AntitoneValue(char* father, char* child) i; char source[100]; j = 0; //放入 source,[j]为长度 while(father[j]) { source[j] = father[j]; j++; if(j > 99) { return; } } source[j] = '\0'; i
//不能用 strlen,求得长度 stringlen, //因为题目要求请勿直接调用 ANSI C 函数库中的函数实现。 while(*q!=’\0’) { Stringlen++; q++; } while( i< Stringlen ) { len++; i++; j++; } else { if(*(p+i)==*(p+j)&&j< Stringlen) { //统计子串长度 //统计最大子串长度 if(len>maxlen) { maxlen=len+1; len=0; } else { len=0; } i++; j++; } } return maxlen; } 给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件 13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形 (Square),圆形 (Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标 准输出上打印信息的方式做为示意)。 a)请用面向对象的方法对以上应用进行设计,编写可能需要的类 b)请给出实现以上应用功能的示例性代码,从某处获取图形信息, 并且进行计算和绘制 c)如果你的 Square 继承自 Rectangle,请给出理由,如果不是,请给出理由,并且请比较两种方式的优劣 d)请问你所编写的类,在如下代码中会有何表现,请解释 void test_rectangle_area(Rectangle& r) { r.set_width(10); r.set_height(15); assert(r.area() == 150); } 14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针 p,并且假设这个节点不是尾节点,试编程实 现删除此节点 参考:将下一个节点的内容复制到本节点上,然后删除下一个节点; 15.写一个程序,把一个 100 以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积, 提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度) /*------------------------------------------------- 分解质因数的算法 2005-03-13 RainFly -------------------------------------------------*/ #include #include #include int main() 6
{ int i=2,N; cout<<"请输入一个整数:"; cin>>N; bool fcontinue = false; bool found = false; while(1) { //永远循环 int t = (int) sqrt(N); printf("sqrt(%d) = %d\n",N,t); for (;i<= sqrt(N);i++) { printf("i= %d,sqrt(%d) = %d \n\n",i,N,t); if(N % i == 0) //i 肯定是质数,N 肯定不是质数 { //如果找到一个质数,则可以继续分解 fcontinue = true; printf("发现一个质数,继续分解\n"); found = true; //至少发现一个质数 printf("在本次中,至少发现一个质数\n"); cout< sqrt(N)) { printf("for loop is finished\n"); } if(fcontinue) { printf("跳过后面的部分,开始下一次分解\n"); fcontinue = false; continue; } if(found) { printf("在前面中,发现质数 ,在此输出\n"); cout< #include int main(int argc, char *argv[]) { int i = 1; char buf[4]; 7
strcpy(buf, "AAAA"); printf("%d\n", i); return 0; } a) When compiled and executed on x86, why does this program usually not output what the programmer intended? 在 x86 上为什么不能得到预期结果 b) Name several ways in which the security problem that causes this program not to output what the programmer intended can be prevented WITHOUT changing the code. 参考:第一个问题: 32 位情况: x86 下,栈方向向上生长.在 main 的栈中,先分配 i 空间(4byte),然后分配 4 个字节的 buf(地址在 i 的上面,比 i 小).strcpy 越界,用 0 把 buf 开始的第 4(0 开始)个字节覆盖掉了.而 x86 是 LSB 排列顺序,所以真好覆盖了 i 的内个数字 1.所以显示出数字 0. 16 位情况同样分析即可. 第 2 问? 19.int w=1,x=2,y=3,z=4; m=(w main() { 说出结果 FILE *fp; int i,a[4]={1,2,3,4},b; fp=fopen("data.dat","wb");//这里帮忙解释一下 for(i=0;i<4;i++) fwrite(&a[i],sizeof(int),1,fp);//这里也帮忙看一下 fclose(fp); fp=fopen("data.dat","rb"); fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里 fread(&b,sizeof(int),1,fp);//这里还有也看一下 fclose(fp); printf("b=%d\n",b); } 21.有双向循环链表结点:(华为面试题) typedef struct node { int date; struct node *front,*next; }_Node; 有两个双向循环链表 A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中 date 值相同的结点删除 参考算法: 1.取出 A 的一个元素 d 2.收集 B 中有相同元素 d 的结点到垃圾箱,并从 B 里删除 3.收集 A 中有相同元素 d 的结点到垃圾箱,并从 A 里删除 4.删除垃圾箱中的所有元素 5.A 链的指针指向下一个 6.重复 1~5,直到 A 链循环到头了 注意的是第 3 步,在 2 步执行后垃圾箱不为空时才执行。 上述算法还可以做一点点优化: cB,分别记录当前 A 中和 B 中的元素个数 1.加入两个变量 cA, 每次从较长者中取出一个元素来,先从较小者中找起 若没有,则不必在较长者中浪费时间了 #include ? struct NODE { 8
分享到:
收藏