1、面试数据结构面试数据结构二 排序及查找方法#include #include#define N 11/*用监视哨查找*/int search(int array,int n,int k)int i;i=n-1;array0=k;while(arrayi!=k) i-;return(i);/*折半查找法*/int halfsearch(int array,int n,int k)int i,j,mid;i=1;j=n;while(i=j)mid=(i+j)/2;if(k=arraymid) return(mid);else if(karraymid) j=mid-1; else i=mid+1;
2、return(0);/*冒泡排序法*/void mpsort(int array)int i,j,a;a=0;for(i=1;iN;i+) for(j=i+1;jarrayj) a=arrayi; arrayi=arrayj; arrayj=a;/*直接插入排序*/void insertsort(int array)int i,j;for(i=2;iN;i+)array0=arrayi;j=i-1;while(array0arrayj)arrayj+1=arrayj-;arrayj+1=array0;/*建立*/void creat(int array)int i;printf(enter t
3、he array:n);for(i=1;iN;i+)scanf(%d,&arrayi);/*显示*/void print(int array) int i; printf(The numbers after sort is:n); for(i=1;iN;i+) printf(%d ,arrayi); printf(n); main()int a11,i,x,chang;/*printf(enter the arrayn);for(i=1;inext=NULL;return 1;else return 0;2插入操作Status ListInsert_L(LinkList &L,int i,El
4、emType e)p=L,j=0;while(p&jnext;+j;if(!p|ji-1) return ERROR;s=(LinkList)malloc(sizeof(LNode);s-data=e;s-next=p-next;p-next=s;return OK;/ListInsert_L3删除操作Status ListDelete_L(LinkList &L,int i,ElemType &e)p=L,j=0;while(p&jnext;+j;if(!p-next|ji-1) return ERROR;q=p-next;p-next=q-next;e=q-data;free(q);ret
5、urn OK;/ListDelete_L4取某序号元素的操作Status GetElem_L(LinkList &L,int i,ElemType &e)p=L-next,j=1;while(p&jnext;+j;if(!p|ji) return ERROR;e=p-data;return OK;/GetElem_L5归并两个单链表的算法void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)/已知单链线性表La和Lb的元素按值非递减排列/归并后得到新的单链线性表Lc,元素也按值非递减排列pa=La-next;pb=Lb-next;Lc=
6、pc=La;while(pa&pb)if(pa-datadata)pc-next=pa;pc=pa;pa=pa-next;elsepc-next=pb;pc=pb;pb=pb-next;pc-next=pa?pa:pb;free(Lb);/MergeList_L头指针与头结点的区别:头指针只相当于结点的指针域,头结点即整个线性链表的第一个结点,它的数据域可以放数据元素,也可以放线性表的长度等附加信息,也可以不存储任何信息。典型的约瑟夫环问题。原问题比你的问题要复杂一点。我以前写的程序:1.用数组。# include stdio.h# define SIZE 100main() int m,n,
7、i; int arraySIZE; printf(约瑟夫环求解,当前设置最大人数为%d.n,SIZE); printf(报数上限:n); scanf(%d,&m); printf(总人数为:n); scanf(%d,&n); for(i=0;in;i+) printf(第%d人的密码为:,i+1); scanf(%d,&array); joseph(array,m,n);int joseph(a,m,n)int a,m,n; int bSIZE; /*计录编号数组.*/ int i; /*计数器.*/ int flag=0; int code; /*删取人的号码.*/ int sum=n; /
8、*现存人数.*/ int point=0; /*当前报数人的位置.*/ int num=m; for(i=0;in;i+) /*计录数组.*/ b=i+1; while(sum!=0) /*当人数不为零时继续循环.*/ for(i=1;i=sum) /*当前报数位置超过最后一人时从第一人报起.*/ point=1; else point+; num=apoint-1; /*取密码.*/ code=bpoint-1; /*取号码.*/ for(i=point;i=sum;i+) /*删去退出的人.*/ ai-1=a; bi-1=b; sum-; /*现存总人数.*/ flag+; /*退出的人数
9、.*/ point-; printf(已退出%d人,退出的人的编号为%d.n,flag,code); 2.用循环链表# include stdio.h# include alloc.h# define LEN sizeof(struct player) struct player int num; /*编号*/ int secret; /*密码*/ struct player *next; ; int n; /*总人数*/main() int m; void create(); void delete(); struct player *head; head=(struct player *)malloc(LEN); printf(请输入第一次的密码:n); scanf(%d,&m); create(he
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1