哈工大数据结构与算法作业1

合集下载

哈工大数据结构大作业——迷宫老鼠

哈工大数据结构大作业——迷宫老鼠

一、问题描述一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1 表示不能通过。

现假设老鼠从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n] 出去的路径。

0 1 1 1 1 1 0 0 0 00 0 0 0 0 1 0 1 0 00 0 0 0 0 1 0 0 0 00 1 0 1 0 1 0 1 1 00 1 0 1 0 1 0 1 0 00 1 1 1 0 1 0 1 0 10 1 0 0 0 1 0 1 0 10 1 0 0 1 1 0 1 0 11 0 0 0 0 0 0 1 0 00 0 0 0 0 1 1 1 0 0二、方法思路1.关于迷宫1.1迷宫用而为动态数组实现。

maze[i,j](1≤i≤m, 1≤j≤n),maze是m行n列的迷宫,为了消除边界判断,把二维数组maze[1:m][1:n]扩大为maze[0:m+1][0:n+1],且令0行、0列、m+1行、m+1列的值为1,表示周围是围墙。

1.2起点maze[1][1]置0,终点maze[m-2][n-2]置0。

2.主导思想2.1.判断走下一步的依据是在迷宫的范围内坐标是否为空。

压栈以记录行走路线。

2.2若走到死路,则弹栈进入上一步,再次判断周围是否有可走位置。

3.具体算法3.1如果四周有路if(w[ii-1][jj]*w[ii+1][jj]*w[ii][jj-1]*w[ii][jj+1]==0),则老鼠按照下右左上的次序进行选择,如果满足空的条件,则压栈,并将走过的路线置2.if(0==w[ii+1][jj]){Push(ii,jj,Q);w[ii][jj]=2;ii++;}else if(0==w[ii][jj+1]){Push(ii,jj,Q);w[ii][jj]=2;jj++;}else if(0==w[ii][jj-1]){Push(ii,jj,Q);w[ii][jj]=2;jj--;}else{Push(ii,jj,Q);w[ii][jj]=2;ii--;3.2.若起点四周都没路,或返回至起点四周没路elseif(w[ii-1][jj]+w[ii+1][jj]+w[ii][jj-1]+w[ii][jj+1]==4),则结束程序。

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)引言概述:数据结构与算法是计算机科学中非常重要的一门课程,它涉及到如何组织和存储数据以及如何高效地解决问题。

本文将以Python语言为基础,介绍《数据结构》参考答案(A卷)的内容,主要包括数组、链表、栈、队列和树这五个部分。

一、数组1.1 数组的定义和特点- 数组是一种线性数据结构,它由一系列相同类型的元素组成。

- 数组的元素可以通过下标来访问,下标从0开始计数。

- 数组的长度是固定的,一旦创建后就不能改变。

1.2 数组的基本操作- 插入:在指定位置插入一个元素,其他元素依次后移。

- 删除:删除指定位置的元素,其他元素依次前移。

- 查找:根据下标查找指定位置的元素。

- 更新:根据下标修改指定位置的元素。

1.3 数组的应用场景- 数组常用于存储和处理一组相同类型的数据。

- 在算法中,数组可以用来表示矩阵、图等复杂的数据结构。

二、链表2.1 链表的定义和特点- 链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

- 链表的长度可以动态改变,可以根据需要插入和删除节点。

2.2 链表的基本操作- 插入:在指定位置插入一个节点,调整指针指向。

- 删除:删除指定位置的节点,调整指针指向。

- 查找:根据节点的数据查找指定节点。

- 更新:根据节点的数据修改指定节点。

2.3 链表的应用场景- 链表常用于需要频繁插入和删除操作的场景,如LRU缓存机制。

- 在算法中,链表可以用来解决一些特定的问题,如判断链表是否有环。

三、栈3.1 栈的定义和特点- 栈是一种先进后出的数据结构,它只允许在栈顶进行插入和删除操作。

- 栈可以用数组或链表实现。

3.2 栈的基本操作- 入栈:将元素插入到栈顶。

- 出栈:将栈顶元素删除并返回。

- 查看栈顶元素:返回栈顶元素,但不删除。

- 判断栈是否为空:判断栈中是否有元素。

3.3 栈的应用场景- 栈常用于表达式求值、括号匹配等场景。

哈工大2004年春季学期

哈工大2004年春季学期

哈工大2004年春季学期数据结构与算法试卷答案一.填空题(每空1分,共15分)1.某程序的时间复杂性为(3n+nlog2n+n2+8),其数量级表示为________。

2.在一个图中,所有顶点的度数之和等于所有边数的______________倍。

3.在外部排序中,可以使用________产生初始归并段。

4.在散列法查找中,解决冲突的方法有,、等。

5.对于一株具有n个结点的树,该树中所有结点的度数之和为6.Kruskal算法的时间复杂性为,它较适合无向图求最小生成树。

7.从具有n 个结点的二元查找树中查找一个元素,最坏情况下的时间复杂性为。

8.归并分类中,对于n个元素,归并的趟数是。

9.从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较个结点。

10.广义表((a),a)的表头和表尾分别是、。

11.设高度为h的二元树上只有度数为0和度数为2的结点,则此类二元树中所包含的结点数至少为。

二.选择题(每题1分,共10分)1.不带头结点的单链表head为空的判定条件是()A. head=NULLB.head->next=NULLC. head->next=headD.head!=NULL.2.在下列叙述中,不正确的是()。

A. 关键活动不按期完成就会影响整个工程的完成时间。

B. 任何一个关键活动提前完成,将使整个工程提前完成。

C. 关键路径上的关键活动若提前完成,则整个工程提前完成.D. 所有关键活动都提前完成,则整个工程将提前完成.3.一个向量第一个元素的存储地址是100,每个元素的占2个存储空间,则第五个元素的地址是( )。

A. 110B.108C.100D. 1204.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是( )。

A. edcbaB.decbaC. dceabD.abcde5.判定一个有向图是否存在回路,除了可以用拓扑排序方法外,还可以利用( )A.关键路径的方法B.求最短路径的Dijkstra方法C.宽度优先遍历算法D.深度优先遍历算法6.设哈希表长m=14,哈希函数H(key)=key%11。

《数据结构与算法》习题与答案

《数据结构与算法》习题与答案

《数据结构与算法》习题与答案(解答仅供参考)一、名词解释:1. 数据结构:数据结构是计算机存储、组织数据的方式,它不仅包括数据的逻辑结构(如线性结构、树形结构、图状结构等),还包括物理结构(如顺序存储、链式存储等)。

它是算法设计与分析的基础,对程序的效率和功能实现有直接影响。

2. 栈:栈是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out, LIFO)原则。

在栈中,允许进行的操作主要有两种:压栈(Push),将元素添加到栈顶;弹栈(Pop),将栈顶元素移除。

3. 队列:队列是一种先进先出(First In First Out, FIFO)的数据结构,允许在其一端插入元素(称为入队),而在另一端删除元素(称为出队)。

常见的实现方式有顺序队列和循环队列。

4. 二叉排序树(又称二叉查找树):二叉排序树是一种二叉树,其每个节点的左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。

这种特性使得能在O(log n)的时间复杂度内完成搜索、插入和删除操作。

5. 图:图是一种非线性数据结构,由顶点(Vertex)和边(Edge)组成,用于表示对象之间的多种关系。

根据边是否有方向,可分为有向图和无向图;根据是否存在环路,又可分为有环图和无环图。

二、填空题:1. 在一个长度为n的顺序表中,插入一个新元素平均需要移动______个元素。

答案:(n/2)2. 哈希表利用______函数来确定元素的存储位置,通过解决哈希冲突以达到快速查找的目的。

答案:哈希(Hash)3. ______是最小生成树的一种算法,采用贪心策略,每次都选择当前未加入生成树且连接两个未连通集合的最小权重边。

答案:Prim算法4. 在深度优先搜索(DFS)过程中,使用______数据结构来记录已经被访问过的顶点,防止重复访问。

答案:栈或标记数组5. 快速排序算法在最坏情况下的时间复杂度为______。

2022年哈尔滨工程大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年哈尔滨工程大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年哈尔滨工程大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、已知广义表LS=((a,b,c),(d,e,f)),用head和tail数取出LS中原子e的运算是()。

A.head(tail(LS))B.tail(head(LS))C.head(tail(head(tail(LS))))D.head(tail(tail(head(LS))))2、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。

A.60B.66C.18000D.333、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。

A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表4、下面关于串的叙述中,不正确的是()。

A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储5、在用邻接表表示图时,拓扑排序算法时间复杂度为()。

A.O(n)B.O(n+e)C.O(n*n)D.O(n*n*n)6、循环队列放在一维数组A中,end1指向队头元素,end2指向队尾元素的后一个位置。

假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。

初始时为空,下列判断队空和队满的条件中,正确的是()。

A.队空:end1==end2;队满:end1==(end2+1)mod MB.队空:end1==end2;队满:end2==(end1+1)mod (M-1)C.队空:end2==(end1+1)mod M;队满:end1==(end2+1) mod MD.队空:end1==(end2+1)mod M;队满:end2==(end1+1) mod (M-1)7、已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”,采用KMP算法进行匹配,第一次出现“失配”(s!=t)时,i=j=5,则下次开始匹配时,i和j的值分别()。

数据结构与算法作业(1)

数据结构与算法作业(1)

3. 二维数组Aij, 0<=i<=5, 2<=j<=9,问按行存储 A24和按列存储哪一个矩阵元素在相同位置?
作业 5
1. 设一棵完全二叉树,共有1001个结点,试问: (1)有多少个叶子结点; (2)有多少度为2的结点; (3)有多少结点只有非空左子树。 2. 设一棵二叉树,其中序和后序遍历为: 中序:BDCEAFHG; 后序:DECBHGFA 画出该二叉树的逻辑结构,并写出先序遍历结果。 3. 给出一组元素{17,28,36,54,30,27,94, 15,21,83,40,17},要求画出由此生成的二 叉排序树 4. 给出一组权值W={8,2,5,3,2,17,4},画 出由此生成的huffman树
作业 2
1. 已知线性表L(x1, x2,…,xn)各元素按递增有序排列,用向 量方式做存储结构。试编写算法,删除表中值分布在 c与d(c<d)之间的元素 2. 编写一算法,将向量L(x1, x2,…,xn)倒置 3. 试编写算法,求已知单链表的长度,并考虑表空情况 4. 已知一循环链表中各数值已按递增有序排列,现要求 插入一结点后,链表仍有序 5. 缩写单链表倒置算法 6. 在双向链表的值为a、b的两个结点之间插入值为x的 结点
2 4 ^
4
2
5
4 ^
7. 有A、B、C、D四个村庄要建乡村俱 乐部,应设在哪个村才能使各村到俱乐 部的路径之和最小?写出各村庄到中心 俱乐部的路径及长度。
A
15
10 6 2 4
B
3
C
8
D
作业 7
1. 画一棵对20个记录{1,2,3,…,20}进行对分查找 的判定树,并求等概率情况下的平均查找长度。 2. 设有10记录的关键字分别为: ICKES,BARBER,ELYOT,KERN,FRENCE,LOWES,BENSD, FONK,ERVIN,KNOW。构造=10/13的Hash表, 怪关键字首字母在字母表中的序号为Hash函数 值,采用随机探测解决冲突,dj=(d1+Rj) mod 13,Rj取自随机数列:3,7,1,12,10,…,统 计该表的平均查找长度ASL。 3. 100个记录的表,关键字为中国人名姓氏,给 出hash表的设计方案,要求等概情况下查找长 度≤3。

哈工大数据结构大作业——最小生成树

哈工大数据结构大作业——最小生成树

一、问题描述1.用户手动输入带全图(10个结点);2.通过Prim算法输出对应的最小生成树。

二、方法思路1.关于存储带权图我采用10*10的数组存储。

[i,j]表示第i行j列的元素,存储结点i和j之间的权值;显然,[i,j]=[j,i]。

对于两结点之间不直接相连的情况,用100这个较大权值表示。

对于数组中,[i,i]的情况,也用100表示,因为结点自身到自身的权值不做考虑。

2.关于Prim算法引入集合U和T。

U存放生成树的顶点,T存放生成树的边集。

初值U={1},T=Ø。

选择有最小权的边( u, v),u∈U, v∈(V-U),将v加入U,(u,v)加入T。

重复这一过程,直到U=V。

void Prim( G, T ){T = Ø;U = { 1 };while ( (V –U) != Ø) {设( u, v ) 是使u∈U与v∈(V-U)且权最小的边;T = T∪{ ( u, v ) } ;U = U ∪ { v };}}3.形象表示三、主要数据结构及源程序代码及其注释静态数组:数二维组C用来存储带权图;用一维数组U存储10个结点的最小生成树排序结果;用一维数组M存储第2-10个结点;用一维数组W存储M中的结点到U中结点的最小权值。

#include"stdafx.h"#include<stdio.h>#define n 10//结点数目int main(){int C[n+1][n+1];//存储带权图int e=45;//边数int i,j,m,a;int w;int U[n+1];//存储结点的最小生成树排序int M[n];//存储-10结点int W[n];//存储M中到U中的最小权值int min;int k;int t;for (i=0;i<=n;i++)//结点自身到自身的权值附{for (j=0;j<=n;j++){if(i=j){C[i][i]=100;}}}for(i=0;i<=n;i++)//第行不使用C[0][i]=C[i][0]=100;for(m=1;m<=e;m++)//存储带权图{printf("Input Vertex,Vertex,weight(如果两点不直接相连,输入权值;形式(节点一,节点二,权值)):\n");scanf("%d,%d,%d",&i,&j,&w);getchar();C[i][j]=w;C[j][i]=w;}U[1]=1;for(i=1;i<=n-1;i++)//Prim算法实现M[i]=i+1;for(i=1;i<=n-1;i++){W[i]=C[1][i+1];}for(i=1;i<=n-1;i++){min=W[1];k=1;t=1;while(min==50)//防止最小权值选成已放入U中的结点 {min=W[t+1];k=t+1;t++;}for(j=2;j<=n-1;j++)//选择权值最小结点{if((W[j]<min)&&(W[j]!=50)){min=W[j];k=j;}}U[i+1]=M[k];a=M[k];W[k]=50;//用表示M中已放到U中排序的结点for(j=1;j<=n-1;j++)//修正M中到U中最小权值{if((W[j]!=50)&&(C[j+1][a]<W[j])){W[j]=C[j+1][a];}}}for(i=1;i<=n;i++)printf("%d",U[i]); while(1);}。

哈尔滨工程大学数据结构历年试卷1参考答案

哈尔滨工程大学数据结构历年试卷1参考答案

一、选择题(每空1分,共15分)1.D2.D3.C4.D5.B6.A7.B8.B9.C 10.B11.D 12.A 13.B 14.D 15.D二、判断题(每空1分,共10分)1.×2.×3.√4.×5.×6.√7.×8.×9.×10.×三、填空题(每空1分,共10分)1.q=p->next; p->next=q->next; free(q);2.(rear-front+m)% m3.两串的长度相等且两串中对应位置的字符也相等。

4.22685.186.2K+1-17.98.6、3、4、59.6310.初始有序四、应用题(每题7分,共35分)1.字符A,B,C,D出现的次数为9,1,5,3。

其哈夫曼编码如下A:1,B:000,C:01,D:0012.先序:A B C D E F G H I J K L中序:C B E D F G A J I H K L后序:C E G FD B J I L K H A3.构造最小生成树过程如下:(下图也可选(2,4)代替(3,4),(5,6)代替(1,5))4.ASL =(1+1+1+2+1+2+1+2)/8=11/85.不变调整40之后:调整85之后:调整22五、算法设计题(每题15分,共30分)1.LinkedList Union(LinkedList la,lb)∥la,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列,本算法将两链表合并成一个按元素值递减次序排列的单链表。

{ pa=la->next; pb=lb->next;∥pa,pb分别是链表la和lb的工作指针la->next=null; ∥la作结果链表的头指针,先将结果链表初始化为空。

while(pa!=null && pb!=null) ∥当两链表均不为空时作if(pa->data<=pb->data){ r=pa->next; ∥将pa 的后继结点暂存于r。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈工大数据结构作业1
4.
/*升序创建两个含有整形数据的链表,其中Create函数中调用Insert函数实现升序排列。

再通过Combine函数将两个链表合并,用Print函数输出。

代码如下。

*/
#include "stdafx.h"
#include <iostream>
struct node {
int data ;
struct node *next ;
} ;
using namespace std;
node* Insert(node *head,node *n)
/*数据插入,升序排列*/
{
node *p1,*p2;p1=p2=head;
if(head==NULL)
{
head=n;n->next=NULL;
return head;
}
if(head->data>=n->data) //新结点插入首结点之前
{
n->next=head;head=n;
return head;
}
//在首结点之后寻找位置插入新结点
while(p2->next&&p2->data<n->data)
{p1=p2;p2=p2->next;}
if(p2->data<n->data)
{p2->next=n;n->next=NULL;}
else
{n->next=p2;p1->next=n;}
return head;
}
/*创建有序链表*/
node * Create(void)
{
node *head,*n;
int a ;
head=NULL;
cout<<"升序插入法产生链表,请输入数据(-1结束):\n";
for(cin>>a;a!=-1;cin>>a)
{
n=new node;
n->data=a;
head=Insert(head,n);}
return head;
}
void Print( node *head)
{
cout<<"链表的结点数据(升序)为:\n";
while(head)
{
cout<<head->data<<'\t';
head=head->next;
}
}
node * Combine(node *p,node *q)
{ node *hc,*pc;
node *pa,*pb;
pa=p->next;pb=q->next;
hc=pc=p;
while(pa&&pb)
{
if(pa->data<=pb->data){
pc->next=pa;pa=pa->next;pc=pc->next;
}
else {pc->next=pb;pb=pb->next;pc=pc->next;}
}
pc->next=pa?pa:pb;
return hc;
}
int main()
{
node *ha,*hb,*hc;
cout<<"链表a添加数据\n";
ha=Create();
cout<<"链表b添加数据\n";
hb=Create();
Print(ha);
Print(hb);
hc=Combine(ha,hb);
Print(hc);
return 0;
}
8.
XSXXXSSSXXSXXSXXSSSS
15.
//设置链表结点:
struct celltype
{
Elementtype element;
celltype *next;
int a; //在结点中设置一个int型a来表示链表元素总数
};
/*顺时针方向查找:即为普通单向链表的查找。

逆时针方向查找:通过顺时针转一圈来达到,代表元素总数的整型a就决定了(p=p->next)的循环次数。

*/
18.
void Locate ( node *head,elementtype x )
/*数据查找*/
{
node *p=head,*q;
int i=1;
while(p->data!=x&&p->next!=NULL)
{p=p->next;
i++;
}
if(p->data==x)
{cout<<"此数据在第"<<i<<"位\n";}
else
{
cout<<"无此数据,插在末尾\n";
q=p->next;
q->data=x;
}
}
19.
void Separate(node L,nodet L1,node L2)
{
node *L1,*L2 ;
int n=1,i=0,j=0;
node *p=L->next,*a=L1,*b=L2;
while(p)
{
if(n%2!=0) //奇数位结点录入第一个链表
{
a->next=p;
a=a->next;
n++;
i++;
p=p->next;
}
else{ //偶数位结点录入第二个链表
b->next=p;
b=b->next;
n++;
j++;
p=p->next; }
}
a->next=L1;
b->next=L2;
L1->element=i; //将长度存入各自的头结点L2->element=j;
}
22.
STRING Substr(STRING &S,int m,int n)
{
int i=1,j=0;
R=new STRING;
STRING st=R;
STRING *p=S->link;
int len=Len(S);
if(n>len||n<=0)
return NULL;
while(p&&i<=m)//p指向第m位
{
p=p->link;
i++;
}
while(p&&j<n)
{
st->link=p;
st=p;
j++;
p=p->next;
}
if(j!=n)
return NULL;
else
return R;
}。

相关文档
最新文档