数据结构方面的笔试题.docx
- 文档编号:8172833
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:15
- 大小:20.32KB
数据结构方面的笔试题.docx
《数据结构方面的笔试题.docx》由会员分享,可在线阅读,更多相关《数据结构方面的笔试题.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构方面的笔试题
1.打开注册表编辑器定位到:
HKEY_LOCAL_MACHINE|SOFTWARE|Microsoft|Windows|CurrentVersion|Uninstall,并在Uninstall中建立一个名为KB923980的子键。
(如果已经存在则无需建立)
2.修改KB923980子键的“默认”值,将其值设置为:
ThisKeyisrequiredtoSTOPWindowsUpdatefrompromptingforaninstall。
然后关闭注册表编辑器并重新启动Windows。
3.重新启动Windows后,再次打开注册表编辑器,定位到:
HKEY_LOCAL_MACHINE|SOFTWARE|Microsoft|Updates|WindowsXP|SPX(其中SPX的X是数字,如果你
的系统是WindowsXPSP2,则X是3;如果是WindowsXPSP1,则X是2),把这个注册表项中的KB923980子键删除。
然后关闭注册表编辑器并重新启动Windows。
典型的约瑟夫环问题。
原问题比你的问题要复杂一点。
我以前写的程序:
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[i]); } 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]=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[i]; b[i-1]=b[i]; } 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(head); delete(head,m); } voidcreate(structplayer*head) { structplayer*p1,*p2,*p; p1=p2=head; printf("请输入编号,密码,当编号为零时输入结束.\n"); printf("总人数为: \n"); scanf("%d",&n); do { p=p2; p2=p1; printf("编号: "); scanf("%d",&p2->num); printf("密码: "); scanf("%d",&p2->secret); p1=(structplayer*)malloc(LEN); p2->next=p1; }while(p2->num! =0); p->next=head; free(p1); } voiddelete(structplayer*head,intm) { inti; structplayer*p,*q; intsum; p=head; sum=m; while(n! =0) { for(i=1;i {q=p; p=p->next; } printf("%d,",p->num); sum=p->secret; q->next=p->next; p=p->next; n=n-1; } } 题目: 有n个人围成一圈,顺序排号。 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 1.程序分析: 2.程序源代码: #definenmax50 main() { inti,k,m,n,num[nmax],*p; printf("pleaseinputthetotalofnumbers: "); scanf("%d",&n); p=num; for(i=0;i *(p+i)=i+1; i=0; k=0; m=0; while(m { if(*(p+i)! =0)k++; if(k==3) {*(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++; printf("%disleft\n",*p); } 我写了一个带头结点的单链表逆置程序,程序的执行结果没什么问题,只是要高手指点一下我写的代码有没有哪里不规范的地方? /**************************************************************** * 文件名: nz.c (nz就是逆置! ) * 文件描述: 带头结点的单链表逆置 * 创建人: 沁园枫 * 创建时间: 2006年2月2日 ****************************************************************/ #include "stdio.h" typedefintElemType typedef struct node /*单链表结点*/ { ElemType data; /*数据域*/ struct node *next; /*指针域*/ }slink; void main() /*主函数*/ { slink *creatslink(); /*声明xjlb(新建链表)函数*/ slink *inverse(slink *); /*声明nzlb(逆置链表)函数*/ slink *h,*p; h=creatslink(); /*调用xjlb(新建链表)函数*/ p=h; while(p->next! =NULL)/*输出新建单链表后的各元素*/ { printf("%d",p->next->data); p=p->next; } printf("\n"); h=inverse(h); /*调用nzlb(逆置链表)函数*/ while(h->next! =NULL)/*输出逆置后的单链表各元素*/ { printf("%d",h->next->data); h=h->next; } getch(); /*调用getch函数,不知道什么意思的自己查查! */ } slink *creatslink() /*新建链表函数*/ { slink *h,*l,*a; int i; h=(slink *)malloc(sizeof(slink)); /*创建头结点*/ h->next=NULL; a=h; for(i=0;i<5;i++) { l=(slink *)malloc(sizeof(slink)); l->data=i; a->next=l; a=a->next; } a->next=NULL; return h; } slink *inverse(slink *h) /*逆置链表函数*/ { slink *p,*q; p=h->next; h->next=NULL; while(p! =NULL) { q=p; p=p->next; q->next=h->next; h->next=q; } return h; } 单链表逆置算法 单链表逆置算法 structnode { intnum; structnode*next; } structnode*reverse(structnode*head) //head链表头结点 { structnode*p,*temp1,*temp2; if(head==NULL____①____)returnhead;//||head->next==NULL p=head->next;head->next=NULL; while(____②____)//p! =NULL或p { temp1=head; ____③____;//head=p; temp2=p; p=p->next; ____④____;//temp2->next=temp1;或head->next=temp1; }//Matchwhilestatenment returnhead;//返回逆置后的链表的头结点 } structnode { intnum; structnode*next; } structnode*reverse(structnode*head) //head链表头结点 { structnode*p,*temp1,*temp2; if(head==NULL||head->next==NULL)returnhead; p=head->next;head->next=NULL; while(p! =NULL或p) { temp1=head; head=p; temp2=p; p=p->next; temp2->next=temp1;或head->next=temp1; }//Matchwhilestatenment returnhead;//返回逆置后的链表的头结点 } 最大子列和n的阶乘中有多少个010进制to2进制单链表逆置判断链表中是否有环文件中有多少行 #ifndefMYLIST_H #defineMYLIST_H #include structlistnode { intvalue; listnode*next; listnode(intnum): value(num),next(NULL) { } }; classMylist { public: Mylist(); ~Mylist(); voidInsert(intvalue); std: : stringGetEntireList(); voidReverse(); private: listnode*head; }; #endif //---------------------------------------------------------------- #include"Mylist.h" usingnamespacestd; Mylist: : Mylist() { head=NULL; } Mylist: : ~Mylist() { if(head! =NULL) { listnode*temp=head; while(head! =NULL) { temp=head->next; deletehead; head=temp; } } } voidMylist: : Insert(intvalue) { if(head==NULL) { head=newlistnode(0); } listnode*curnode=newlistnode(value); listnode*temp=head; while( temp->next! =NULL) { temp=temp->next; } temp->next=curnode; } stringMylist: : GetEntireList() { stringstr=""; listnode*temp=head->next; while(temp! =NULL) { str+=temp->value+'0' ; str+=''; temp=temp->next; } returnstr; } voidMylist: : Reverse() { if(head==NULL||head->next==NULL) { return; } listnode*end=head; while(end->next! =NULL) { end=end->next; } listnode*curnode=head->next; while(curnode! =end) { //将curnode从链表中删除 head->next=curnode->next; //将curnode插入到end后面 curnode->next=end->next; end->next=curnode; curnode=head->next; } } //判断链表中是否存在着环 boolMylist: : HasaCycle() { listnode*itr1=NULL; listnode*itr2=NULL; //如果链表为空则返回false if(head==NULL||head! =NULL&&(head->next==NULL) ) { returnfalse; } itr1=head->next; itr2=itr1->next; if(itr2==NULL) { returnfalse; } //如果head-〉next指向了head,或者itr1-〉head指向了itr1,或者itr1-〉next指向了head,有环 if(itr1==head||itr2==itr1||itr2==head) { returntrue; } //head->itr1->itr2->* while(itr1! =NULL&&itr2! =NULL&&itr2->next! =NULL ) { if(itr1==itr2||itr2->next==itr1) { returntrue; } itr1=itr1->next; itr2=itr2->next->next; } returnfalse; } } //================================ //test。 cpp #include #include #include #include #include #include"Mylist.h" usingnamespacestd; //================================================== //获得data。 txt文件中有多少行 int GetTotalLineCount() { ifstreamifs; ifs.open("data.txt",ios: : in); intcount =1; //stringp; // while(getline(ifs,p)){++count;} charch; while(ifs.get(ch)) { if(ch=='\n') { ++count; } } ifs.close(); returncount; } //================================================================ //计算正整数num的阶乘中有多少个0 constintFIVE=5; //得到不大于num的5的最大次方,如num=5时返回1,26时返回2 intLowerNearestPow(intnum) { intpowoffive=1; while(pow(FIVE,powoffive)<=num) { ++powoffive; } returnpowoffive; } //考虑25,125,625等的情况 intGetZerosofXFactorial(intnum) { intlowernearestpow=LowerNearestPow(num); intzerocount=0; while( lowernearestpow>0) { zerocount+=num/pow(FIVE, lowernearestpow); --lowernearestpow; } returnzerocount; } //========================================================================= //将10进制正整数num转化为2进制数 constintTWO=2; string DecimalToBin(unsignedintnum) { if(num==0) { return"0"; } stringbinform=""; while(num>0) { binform.insert(binform.begin(), num%TWO+'0'); num/=TWO; } returnbinform; } //========================
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 方面 笔试