资料来源:中国教育在线资料来源:中国教育在线)位域:有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct位域结构名{位域列表};其中位域列表的形式为:类型说明符位域名:位域长度例如:structbs{inta:8;intb:2;intc:6;};位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:structbs{inta:8;intb:2;intc:6;}data;说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:structbs{unsigneda:4unsigned:0unsignedb:4unsignedc:4}在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:structk{inta:1int:2intb:3资料来源:中国教育在线资料来源:中国教育在线:2};从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名?位域名位域允许用各种格式输出。main(){structbs{unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit;bit.a=1;bit.b=7;bit.c=15;pri47)改错:#includeintmain(void){int**p;intarr[100];p=&arr;return0;}解答:搞错了,是指针类型不同,int**p;//二级指针&arr;//得到的是指向第一维为100的数组的指针#includeintmain(void){int**p,*q;intarr[100];q=arr;p=&q;return0;}48)下面这个程序执行后会有什么错误或者效果:#defineMAX255intmain(){unsignedcharA[MAX],i;//i被定义为unsignedcharfor(i=0;i=MAX;i++)资料来源:中国教育在线资料来源:中国教育在线[i]=i;return0;}解答:死循环加数组越界访问(C/C++不进行数组越界检查)MAX=255数组A的下标范围为:0..MAX-1,这是其一..其二.当i循环到255时,循环内执行:A[255]=255;这句本身没有问题..但是返回for(i=0;i=MAX;i++)语句时,由于unsignedchar的取值范围在(0..255),i++以后i又为0了..无限循环下去。49)structname1{charstr;shortx;intnum;}structname2{charstr;intnum;shortx;}sizeof(structname1)=8,sizeof(structname2)=12在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。50)intel:A.c和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。他们都放在数据区,但是编译器对他们的命名是不同的。如果要使变量在其他模块也有意义的话,需要使用extern关键字。51)structs1{inti:8;intj:4;inta:3;doubleb;};structs2{inti:8;intj:4;doubleb;inta:3;};printf(sizeof(s1)=%d\n,sizeof(s1));资料来源:中国教育在线资料来源:中国教育在线(sizeof(s2)=%d\n,sizeof(s2));result:16,24第一个structs1{inti:8;intj:4;inta:3;doubleb;};理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于double是8字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共是16字节。第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数。40.链表题:一个链表的结点结构structNode{intdata;Node*next;};typedefstructNodeNode;(1)已知链表的头结点head,写一个函数把这个链表逆序(Intel)Node*ReverseList(Node*head)//链表逆序{if(head==NULL||head-next==NULL)returnhead;Node*p1=head;Node*p2=p1-next;Node*p3=p2-next;p1-next=NULL;while(p3!=NULL){p2-next=p1;p1=p2;p2=p3;p3=p3-next;}p2-next=p1;head=p2;returnhead;}资料来源:中国教育在线资料来源:中国教育在线(2)已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)Node*Merge(Node*head1,Node*head2){if(head1==NULL)returnhead2;if(head2==NULL)returnhead1;Node*head=NULL;Node*p1=NULL;Node*p2=NULL;if(head1-datahead2-data){head=head1;p1=head1-next;p2=head2;}else{head=head2;p2=head2-next;p1=head1;}Node*pcurrent=head;while(p1!=NULL&&p2!=NULL){if(p1-data=p2-data){pcurrent-next=p1;pcurrent=p1;p1=p1-next;}else{pcurrent-next=p2;pcurrent=p2;p2=p2-next;}}if(p1!=NULL)pcurrent-next=p1;if(p2!=NULL)pcurrent-next=p2;资料来源:中国教育在线资料来源:中国教育在线}(3)已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。(Autodesk)答案:Node*MergeRecursive(Node*head1,Node*head2){if(head1==NULL)returnhead2;if(head2==NULL)returnhead1;Node*head=NULL;if(head1-datahead2-data){head=head1;head-next=MergeRecursive(head1-next,head2);}else{head=head2;head-next=MergeRecursive(head1,head2-next);}returnhead;}41.分析一下这段程序的输出(Autodesk)classB{public:B(){coutdefaultconstructor}~B(){coutdestructed}B(inti):data(i)//B(int)worksasaconverter(int-instanceofB){coutconstructedbyparameterdata}private:intdata;资料来源:中国教育在线资料来源:中国教育在线};BPlay(Bb){returnb;}(1)results:intmain(intargc,char*argv[])constructedbyparameter5{destructedB(5)形参析构Bt1=Play(5);Bt2=Play(t1);destructedt1形参析构return0;destructedt2注意顺序!}destructedt1(2)results:intmain(intargc,char*argv[])constructedbyparameter5{destructedB(5)形参析构Bt1=Play(5);Bt2=Play(10);constructedbyparameter10return0;destructedB(10)形参析构}destructedt2注意顺序!destructedt142.写一个函数找出一个整数数组中,第二大的数(Microsoft)答案:constintMINNUMBER=-32767;intfind_sec_max(intdata[],intcount){intmaxnumber=data[0];intsec_max=MINNUMBER;for(inti=1;icount;i++){if(datamaxnumber){sec_max=maxnumber;maxnumber=data;}else{if(datasec_max)sec_max=data;}}returnsec_max;}资料来源:中国教育在线资料来源:中国教育在线写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。KMP算法效率最好,时间复杂度是O(n+m)。44.多重继承的内存分配问题:比如有classA:publicclassB,publicclassC{}那么A的内存结构大致是怎么样的?这个是compiler-dependent的,不同的实现其细节可能不同。如果不考虑有虚函数、虚继承的话就相当简单;否则的话,相当复杂。45.如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)structnode{charval;node*next