C面试题库三

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

143.枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。main(){enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;a=sun;b=mon;c=tue;printf(%d,%d,%d,a,b,c);}只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:a=sum;b=mon;是正确的。而:a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如:a=(enumweekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:a=tue;还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。main(){enumbody{a,b,c,d}month[31],j;inti;j=a;for(i=1;i=30;i++){month[i]=j;j++;if(jd)j=a;}for(i=1;i=30;i++){switch(month[i]){casea:printf(%2d%c\t,i,'a');break;caseb:printf(%2d%c\t,i,'b');break;casec:printf(%2d%c\t,i,'c');break;cased:printf(%2d%c\t,i,'d');break;default:break;}}printf(\n);}144.用折半查找法求一个数?数组a已按从小到大的顺序排列while((!sign)&&(bott=top)){mid=(bott+top)/2;if(number==a[mid]){local=mid;printf(“thelocalis%d\n”,local);printf(“thenumberis%d\n”,number);sign=true;}elseif(numbera[min])top=mid-1;elsebott=mid+1;}145.有一个字符串,将字符串从第m个字符开始全部复制到另一个新字符串?voidcopystr(char*p1,char*p2,intm){intn=0;while(nm-1){n++;p1++;}while(*p1!=’/0’){*p2=*p1;p1++;p2++;}*p2=’/0’;}146.排序问题:问题一:写出冒泡排序voidpop_sort(inta[],intN){inttmp,i,j;for(j=0;jN-1;j++)for(i=0;iN-1-j;i++)if(a[i]a[i+1]){tmp=a[i];a[i]=a[i+1];a[i+1]=tmp;}}问题一:写出选择法排序voidselect_sort(inta[],intN){inti,j,k,t;for(i=0;iN;i++){k=i;for(j=i+1;jN;j++)if(a[j]ak])k=j;tmp=a[k];a[k]=a[i];a[i]=tmp;}}*链表问题汇总*179写一函数creat,用来建立一个动态链表,各结点数据由键盘输入。structstudent{longnum;floatscore;stuent*next;};student*creat(void){student*head;student*p1=null,*p2=null;intn=0;p1=p2=newstudent;cinp1-nump1-score;head=null;while(p1-num!=0){n=n+1;if(1==n)head=p1;elsep2-next=p1;p2=p1;p1=newstudent;cinp1-mump1-score;}p2-next=NULL;return(head);}180,写一print函数,将链表中的各数据遍历输出voidprint(student*head){student*p;couttherenrecordsendl;p=head;if(head!=NULL)do{coutp-nump-scoreendl;p=p-next;}while(p!=NULL)}181.写一del函数,用来删除动态链表中,指定的结点数据void*del(student*head,longnum){student*p1,*p2;if(head==NULL){return(head);}p1=head;while(num!=p1-num&&p1-next!=NULL){p2=p1;p1=p1-next;}if(num==p1-num){if(p1==head)head=p1-next;elsep2-next=p1-next;coutdelete:numendl;n=n-1;}elsecoutcannotfindnum;return(head);}182写一函数insert,用来向动态链表插入一结点Student*insert(student*head,student*stud){student*p0,*p1,*p2;p1=head;p0=stud;if(head==NULL){head=p0;p0-next=NULL;}else{while((p0-nump1-num)&&(p1-next!=NULL)){p2=p1;p1=p1-next;}if(p0-num=p1-num){if(head==p1)head=p0;elsep2-next=p0;p0-next=p1;}else{p1-next=p0;p0-next=NULL;}}n=n+1;return(head);}183链表题:一个链表的结点结构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;returnhead;}(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;}184.利用链表实现将两个有序队列A和B合并到有序队列H中,不准增加其他空间。请提供全一点的程序以升序为例:while(a!=NULL&&b!=NULL){if(a-datab-data){h-data=a-data;a=a-next;}elseif(a-data==b-data){h-data=a-data;a=a-next;b=b-next;}else{h-data=b-data;b=b-next}h=h-next;}if(a==NULL){while(b!=NULL){h-data=b-data;h=h-next;b=b-next;}}else{while(a!=NULL){h-data=a-next;h=h-next;a=a-next;}}185单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的:1-2-3-4-5通过反转后成为5-4-3-2-1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:structlinka{intdata;linka*next;};voidreverse(linka*&head){if(head==NULL)return;linka*pre,*cur,*ne;pre=head;cur=head-next;while(cur){ne=cur-next;cur-next=pre;pre=cur;cur=ne;}head-next=NULL;head=pre;}还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。算法的源代码如下:linka*reverse(linka*p,linka*&head){if(p==NULL||p-next==NULL){head=p;returnp;}else{linka*tmp=reverse(p-next,head);tmp-next=p;returnp;}}186对如下双链表typedefstruct_node{intiData;struct_node*pPrev;struct_node*pNext;}node;a.请写出代码,将node*n插入到node*p后。b.如果多线程同时访问此链表,需要加锁,请说明以下步骤(a)申请内存给n.(b)N数据初始化。(c)插入注意加锁和解锁的时机。node*insert(node*p,node*n){if((p==NULL)||(n==NULL)){returnNULL;}if(p-pNext!=NULL){p-pNext-pPrev=n;}n-pPrev=p;n-pNext=p-pNext;p-pNext=n;returnn;}187、试创建二叉数,并写出常见的几种遍历方式?#includestdio.h#includestring.h#includestdl

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功