面试数据结构.docx
《面试数据结构.docx》由会员分享,可在线阅读,更多相关《面试数据结构.docx(21页珍藏版)》请在冰豆网上搜索。
![面试数据结构.docx](https://file1.bdocx.com/fileroot1/2022-11/16/cfaa584d-719f-4645-abcb-66f8e5c5fe0a/cfaa584d-719f-4645-abcb-66f8e5c5fe0a1.gif)
面试数据结构
面试——数据结构二
排序及查找方法
#include
#include
#defineN11
/*用监视哨查找*/
intsearch(intarray[],intn,intk)
{inti;
i=n-1;
array[0]=k;
while(array[i]!
=k)i--;
return(i);
}
/*折半查找法*/
inthalfsearch(intarray[],intn,intk)
{inti,j,mid;
i=1;j=n;
while(i<=j)
{mid=(i+j)/2;
if(k==array[mid])return(mid);
elseif(k elsei=mid+1;
}
return(0);
}
/*冒泡排序法*/
voidmpsort(intarray[])
{inti,j,a;
a=0;
for(i=1;i for(j=i+1;j if(array[i]>array[j])
{a=array[i];
array[i]=array[j];
array[j]=a;}
}
/*直接插入排序*/
voidinsertsort(intarray[])
{inti,j;
for(i=2;i {array[0]=array[i];
j=i-1;
while(array[0] {array[j+1]=array[j--];
array[j+1]=array[0];
}
}
}
/*建立*/
voidcreat(intarray[])
{inti;
printf("enterthearray:
\n");
for(i=1;i scanf("%d",&array[i]);
}
/*显示*/
voidprint(intarray[])
{inti;
printf("Thenumbersaftersortis:
\n");
for(i=1;i printf("%d",array[i]);
printf("\n");
}
main()
{inta[11],i,x,chang;
/*printf("enterthearray\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);*/
aga:
printf("\nchang:
1:
usewatchingmethodfinding\n 2:
usehalfmethodfinding\n 3:
usedirectnessintsertmethodsort\n 4:
usebubbleupmethodsort\n 5:
exit\n");
scanf("%d",&chang);
switch(chang)
{case1:
{creat(a);
printf("Pleaseintthesearchnumber:
\n");
scanf("%d",&x);
printf("Thenumberstationis:
%d\n",search(a,N,x));
gotoaga;
}
case2:
{creat(a);
insertsort(a);
print(a);
printf("Pleaseintthesearchnumber:
\n");
scanf("%d",&x);
printf("Thenumberstationis:
%d\n",halfsearch(a,N,x));
gotoaga;
}
case3:
{creat(a);
insertsort(a);
print(a);
gotoaga;
}
case4:
{creat(a);
mpsort(a);
print(a);
gotoaga;
}
case5:
{printf("exit!
\n");break;}
default:
{printf("Error!
\n");gotoaga;}
}
}
二、线性链表的存储实现
structLNODE{
ElemTypedata;
structLNODE*next;
};
typedefstructLNODELNode;
typedefstructLNODE*LinkList;
1初始化操作
StatusInit_L(LinkListL){
if(L=(LinkList*)malloc(sizeof(LNode)))
{L->next=NULL;return1;}
elsereturn0;
}
2插入操作
StatusListInsert_L(LinkList&L,inti,ElemTypee){
p=L,j=0;
while(p&&jnext;++j;}
if(!
p||j>i-1)returnERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
returnOK;
}//ListInsert_L
3删除操作
StatusListDelete_L(LinkList&L,inti,ElemType&e){
p=L,j=0;
while(p&&jnext;++j;}
if(!
p->next||j>i-1)returnERROR;
q=p->next;p->next=q->next;
e=q->data;free(q);
returnOK;
}//ListDelete_L
4取某序号元素的操作
StatusGetElem_L(LinkList&L,inti,ElemType&e){
p=L->next,j=1;
while(p&&jnext;++j;}
if(!
p||j>i)returnERROR;
e=p->data;
returnOK;
}//GetElem_L
5归并两个单链表的算法
voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc){
//已知单链线性表La和Lb的元素按值非递减排列
//归并后得到新的单链线性表Lc,元素也按值非递减排列
pa=La->next;pb=Lb->next;
Lc=pc=La;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;pc=pa;pa=pa->next;
}else{pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=pa?
pa:
pb;
free(Lb);
}//MergeList_L
头指针与头结点的区别:
头指针只相当于结点的指针域,头结点即整个线性链表的第一个结点,它的数据域可以放数据元素,也可以放线性表的长度等附加信息,也可以不存储任何信息。
典型的约瑟夫环问题。
原问题比你的问题要复杂一点。
我以前写的程序:
1.用数组。
#include"stdio.h"
#defineSIZE100
main()
{
intm,n,i;
intarray[SIZE];
printf("约瑟夫环求解,当前设置最大人数为%d.\n",SIZE);
printf("报数上限:
\n");
scanf("%d",&m);
printf("总人数为:
\n");
scanf("%d",&n);
for(i=0;i {
printf("第%d人的密码为:
",i+1);
scanf("%d",&array);
}
joseph(array,m,n);
}
intjoseph(a,m,n)
inta[],m,n;
{
intb[SIZE]; /*计录编号数组.*/
inti; /*计数器.*/
intflag=0;
intcode; /*删取人的号码.*/
intsum=n; /*现存人数.*/
intpoint=0; /*当前报数人的位置.*/
intnum=m;
for(i=0;i {
b=i+1;
}
while(sum!
=0) /*当人数不为零时继续循环.*/
{
for(i=1;i<=num;i++) /*进行报数.*/
{
if(point>=sum) /*当前报数位置超过最后一人时从第一人报起.*/
{point=1;}
elsepoint++;
}
num=a[point-1]; /*取密码.*/
code=b[point-1]; /*取号码.*/
for(i=point;i<=sum;i++)/*删去退出的人.*/
{
a[i-1]=a;
b[i-1]=b;
}
sum--; /*现存总人数.*/
flag++; /*退出的人数.*/
point--;
printf("已退出%d人,退出的人的编号为%d.\n",flag,code);
}
}
2.用循环链表
#include"stdio.h"
#include"alloc.h"
#defineLENsizeof(structplayer)
structplayer
{
intnum; /*编号*/
intsecret; /*密码*/
structplayer*next;
};
intn; /*总人数*/
main()
{
intm;
voidcreate();
voiddelete();
structplayer*head;
head=(structplayer*)malloc(LEN);
printf("请输入第一次的密码:
\n");
scanf("%d",&m);
create(he