C面试题库三.docx

上传人:b****8 文档编号:29724692 上传时间:2023-07-26 格式:DOCX 页数:18 大小:18.43KB
下载 相关 举报
C面试题库三.docx_第1页
第1页 / 共18页
C面试题库三.docx_第2页
第2页 / 共18页
C面试题库三.docx_第3页
第3页 / 共18页
C面试题库三.docx_第4页
第4页 / 共18页
C面试题库三.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C面试题库三.docx

《C面试题库三.docx》由会员分享,可在线阅读,更多相关《C面试题库三.docx(18页珍藏版)》请在冰豆网上搜索。

C面试题库三.docx

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(j>d)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(number

top=mid-1;

else

bott=mid+1;

}

145.有一个字符串,将字符串从第m个字符开始全部复制到另一个新字符串?

voidcopystr(char*p1,char*p2,intm)

{

intn=0;

while(n

{

n++;

p1++;

}

while(*p1!

=’/0’)

{

*p2=*p1;

p1++;

p2++;

}

*p2=’/0’;

}

146.排序问题:

问题一:

写出冒泡排序

voidpop_sort(inta[],intN)

{inttmp,i,j;

for(j=0;j

for(i=0;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;i

{

k=i;

for(j=i+1;j

if(a[j]

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;

cin>>p1->num>>p1->score;

head=null;

while(p1->num!

=0)

{

n=n+1;

if(1==n)head=p1;

else

p2->next=p1;

p2=p1;

p1=newstudent;

cin>>p1->mum>>p1->score;

}

p2->next=NULL;

return(head);

}

180,写一print函数,将链表中的各数据遍历输出

voidprint(student*head)

{

student*p;

cout<<"there"<

p=head;

if(head!

=NULL)

do

{

cout<num<<""<score<

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;

else

p2->next=p1->next;

cout<<"delete:

"<

n=n-1;

}

else

cout<<"cannotfind"<

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->num>p1->num)&&(p1->next!

=NULL))

{

p2=p1;

p1=p1->next;

}

if(p0->num<=p1->num)

{

if(head==p1)

head=p0;

else

p2->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->datadata)

{

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->datadata)

{

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->datadata)

{

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、试创建二叉数,并写出常见的几种遍历方式?

#include"stdio.h"

#include"string.h"

#include

#defineNULL0

typedefstructBiTNode{

chardata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

BiTreeCreate(BiTreeT){

charch;

ch=getchar();

if(ch=='0')

T=NULL;

else{

if(!

(T=(BiTNode*)malloc(sizeof(BiTNode))))

printf("Error!

");

T->data=ch;

T->lchild=Create(T->lchild);

T->rchild=Create(T->rchild);

}

returnT;

}

voidPreorder(BiTreeT){

if(T){

printf("%c",T->data);

Preorder(T->lchild);

Preorder(T->rchild);

}

}//先序遍历

voidInorder(BiTreeT){

if(T){

Inorder(T->lchild);

printf("%c",T->data);

Inorder(T->rchild);

}

}//中序遍历

voidPostorder(BiTreeT){

if(T){

Postorder(T->lchild);

Postorder(T->rchild);

printf("%c",T->data);

}

}//后序遍历

188、前序遍历输入,如图所示,写出后序遍历输出结果?

 例如二叉树:

 

 

输入序列ABD..EH...CF.I..G..

输出结果为:

?

答案:

输出结果为:

DHEBIFGCA

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1