数据结构算法题模拟.docx
- 文档编号:30306721
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:20
- 大小:18.81KB
数据结构算法题模拟.docx
《数据结构算法题模拟.docx》由会员分享,可在线阅读,更多相关《数据结构算法题模拟.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构算法题模拟
数据结构算法题模拟
⑴将数组中数值为0的元素置于数组的前半部分,非0元素置于数组的后半部分。
要求保证非0元素的稳定性。
⑵已知二叉树的中序序列和一种特殊序列,该特殊序列为奇数层为“根左右”规则遍历,
偶数层为“根右左”规则遍历。
试构建出该二叉树。
⑶查找共n个元素的循环双链表上第i(0≤i<n)个元素的值。
⑷编写用邻接表存储的图上,求从vi到vj节点的最短路径;并打印出所搜索的路径。
『注』
①本模拟题与高校自主命题的数据结构卷算法题目部分命题思路相似。
有需要的人可试做练习;
②详细算法在下一页。
☆★☆★☆代★码☆详★解☆★☆★☆
〖注〗黑绿色加粗部分为主题,灰色部分可以不写。
⑴『思路点评』很多人看到这道题目首先想到的是快速排序的定位算法部分(多为partition、pivot、split等函数命名)。
但这道题目要求非“0”元素的部分具有稳定性。
因此,要从稳定性(和归位性)的算法角度出发,如‘插入排序’、‘冒泡排序’,这些排序的时间复杂度在特殊的情况下为ο(n)。
详细算法如下∶
#include
#include
voidzeroBefore(int*a,intn)/*函数功能:
元素"0"置前*/
{
inti=n,p=-1;/*模仿插入排序及冒泡排序。
p为非0元素的一端。
*/
while(--i>=0)
{
if(a[i]==0)
{
if(p==-1)
{
p=i;/*确定非0元素的插入位置。
*/
}
}
else
{
if(p!
=-1)
{
a[p--]=a[i];/*非0元素插入底端*/
a[i]=0;/*元素0进行冒泡向上(左)移动。
*/
}
}
}
}
#defineN10
intmain(void)
{
inta[N]={0,3,0,0,2,0,4,5,0,8};
inti;
zeroBefore(a,N);
printf("数据排序之后:
");
for(i=0;i printf("%d",a[i]); printf("\n"); system("pause"); returnEXIT_SUCCESS; } ⑵『思路点评』这道题不同于其他二叉树的构建题目。 如‘先序—中序’遍历、‘后序—中序’遍历,可以用递归方法。 然而,该题目只能用非递归算法。 主要思路是根据二叉排序树的插入过程,与二叉排序树不同的是比较两个元素分别于中序遍历字符串的下标位置。 根据下标位置的大小确定待插入元素于当前元素的左右子树。 复杂度为ο(n*log2(n))。 详细算法如下∶ #include #include #include #include #include typedefstructBiNode/*二叉链表定义*/ { chardata;/*数据域*/ structBiNode*left,*right;/*左、右子树*/ }BiNode; typedefstructBiTree/*二叉树*/ { BiNode*root;/*根节点*/ }BiTree; BiNode*new_BiNode(chardata)/*动态申请新节点*/ { BiNode*p=(BiNode*)malloc(sizeof(BiNode)); p->data=data; p->left=NULL; p->right=NULL; returnp; } intindexOf(char*str,chardata)/*查找元素在字符串的位置*/ { inti=0; while(str[i]! ='\0') { if(str[i]==data) { returni; } i++; } return-1; } voidmkBiTree(BiTree*t,char*spOrd,char*inOrd)/*函数: 根据中序序列和特殊序列构建二叉树*/ { unsignedintlen=strlen(spOrd); BiNode*p; inti,j,k; if(len==0||len! =strlen(inOrd)) { printf("字符串长度错误! \n");getch(); exit (1); } t->root=new_BiNode(spOrd[0]); for(i=1;i { p=t->root; while(p! =NULL)/*二叉树插入节点*/ { j=indexOf(inOrd,spOrd[i]); k=indexOf(inOrd,p->data); if(j==-1||k==-1) { printf("字符串元素不相应存在! \n");getch(); exit (1); } if(j { if(p->left==NULL) { p->left=new_BiNode(spOrd[i]); p=NULL; } else { p=p->left; } } elseif(j>k) { if(p->right==NULL) { p->right=new_BiNode(spOrd[i]); p=NULL; } else { p=p->right; } } else { printf("字符串元素重复! \n");getch(); exit (1); } } } } #defineN5 voidpreOrder(BiTree*t) { BiNode*p=t->root; BiNode*s[N]; inth=0; while(p! =NULL||h>0) { if(p==NULL) { p=s[--h]; } else { printf("%c",p->data); if(p->right! =NULL) { s[h++]=p->right; } p=p->left; } } printf("\n"); } intmain(void) { BiTreet; mkBiTree(&t,"ABCDEFGHIJKLMNO","HDIBJEKALFMCNGO"); printf("测试二叉树形态: \n" "A\n" "/\\\n" "BC\n" "/\\/\\\n" "DEFG\n" "/|/||\\|\\\n" "HIJKLMNO\n"); printf("\n先序遍历: "); preOrder(&t); system("pause"); returnEXIT_SUCCESS; } ⑶『思路点评』这道题的关键在于为提高搜索时间效率,须对搜索的下标进行比较。 如果大于循环双链表的长度的一半,则逆序搜索;否则顺序搜索。 复杂度为ο(n/2)。 详细算法如下∶ #include #include #include #include typedefstructDNode { intdata; structDNode*last,*next; }DNode; typedefstructDList { DNode*head; unsignedintlength; }DList; intgetDataById(DList*L,intid) { inti; DNode*p=L->head; if(id<0||id>=L->length) { printf("下标越界! \n");getch(); exit (1); } if(id */ { i=-1; while(i { p=p->next; i++; } printf("(搜索次数: %i)",i+1); } else { i=L->length; while(i>id) { p=p->last; i--; } printf("(搜索次数: %i)",L->length-i); } returnp->data; } DNode*new_DNode(intdata) { DNode*p=(DNode*)malloc(sizeof(DNode)); p->data=data; p->last=NULL; p->next=NULL; returnp; } voidmkDList(DList*L,intn) { inti; DNode*p=new_DNode(0); L->head=p; L->length=n; for(i=0;i { p->next=new_DNode(rand()%20); p->next->last=p; p=p->next; } p->next=L->head; L->head->last=p; } voidprintDList(DList*L) { DNode*p=L->head->next; while(p! =L->head) { printf("%d",p->data); p=p->next; } printf("\n"); } #defineN10 intmain(void) { inti; DListL; srand((unsigned)time(NULL)); mkDList(&L,N); printf("双链表元素: "); printDList(&L); for(i=0;i { printf("第%i个元素: %d。 \n",i,getDataById(&L,i)); } system("pause"); returnEXIT_SUCCESS; } ⑷『思路点评』第一部分: 实现邻接表存储图的迪克斯特拉算法。 详细算法如下∶ #include #include #include typedefstructGNode { intid,weight; structGNode*next; }GNode; typedefstruct { charinfo; GNode*first; }Vertex; typedefstruct { Vertex*list; intnumV; }ALGraph; #defineV9 #defineN16 #defineINF999 voidshortestPath(ALGraph*g,intvi,intvj) { intvis[V],dist[V],path[V]; inti,d,w,n=g->numV,min,mind; GNode*p; for(i=0;i { vis[i]=0; dist[i]=INF; path[i]=-1; } dist[vj]=0; while(n-->0) { for(mind=INF,i=0;i { if(! vis[i]&&dist[i] { min=i; mind=dist[i]; } } if(mind==INF) { break; } vis[min]=1; for(p=g->list[min].first;p! =NULL;p=p->next) { i=p->id; d=p->weight; if(vis[i])continue; w=mind+d; if(w { dist[i]=w; path[i]=min; } } } 『注』题目第二部分: 打印搜索而得的路径。 printf("最短路径: "); w=vi; while(w! =-1) { printf("%c",g->list[w].info); w=path[w]; printf("%s",(w==-1)? "\n": "→"); } } voidmkGraph(ALGraph*g,intnumV,intarcs[N][3]) { inti,l,n,t,w; Vertex*v; GNode*p; g->numV=numV; g->list=(Vertex*)malloc(sizeof(Vertex)*numV); for(i=0;i { v=&(g->list[i]); v->info='A'+i; v->first=NULL; } for(i=0,l=-1;i { n=arcs[i][0]; t=arcs[i][1]; w=arcs[i][2]; v=&(g->list[n]); if(n! =l) { l=n; if(v->first==NULL) { v->first=(GNode*)malloc(sizeof(GNode)); p=v->first; p->id=t; p->weight=w; p->next=NULL; } else { p=v->first; p->id=t; p->weight=w; } } else { p->next=(GNode*)malloc(sizeof(GNode)); p=p->next; p->id=t; p->weight=w; p->next=NULL; } } } voidprintGraphList(ALGraph*g) { inti; GNode*p; for(i=0;i { printf("节点%c: ",g->list[i].info); p=g->list[i].first; while(p! =NULL) { printf("(%c,%d)",'A'+p->id,p->weight); p=p->next; printf("%s",p? "→": "。 "); } printf("\n"); } } intmain(void) { ALGraphg; intarcs[N][3]= { /*111ABC 001deF 111GHI*/ {0,1,10}, {1,0,10}, {1,2,10}, {1,5,14}, {2,1,10}, {2,5,10}, {5,1,14}, {5,2,10}, {5,7,14}, {5,8,10}, {6,7,10}, {7,5,14}, {7,6,10}, {7,8,10}, {8,5,10}, {8,7,10} }; mkGraph(&g,V,arcs); printGraphList(&g); shortestPath(&g,0,6); system("pause"); returnEXIT_SUCCESS; } 『编者按』 ①所有算法题目如果涉及复杂的数据结构,例如C语言,宜先写结构体定义(如typedefstruct{…}…;)然后在写函数; ②函数如果出现复杂的调用,按照一定的顺序定义。 在其他语言中通用的函数名称如果相同则可仅写出定义; ③在书写时,养成自己的函数定义、变量定义习惯(注意大小写),避免出现结构体的成员名称不一。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 模拟