面试数据结构.docx

上传人:b****6 文档编号:3016464 上传时间:2022-11-17 格式:DOCX 页数:21 大小:21.39KB
下载 相关 举报
面试数据结构.docx_第1页
第1页 / 共21页
面试数据结构.docx_第2页
第2页 / 共21页
面试数据结构.docx_第3页
第3页 / 共21页
面试数据结构.docx_第4页
第4页 / 共21页
面试数据结构.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

面试数据结构.docx

《面试数据结构.docx》由会员分享,可在线阅读,更多相关《面试数据结构.docx(21页珍藏版)》请在冰豆网上搜索。

面试数据结构.docx

面试数据结构

面试——数据结构二

排序及查找方法

 

#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

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

当前位置:首页 > 法律文书 > 调解书

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

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