数据结构实验指导书.docx
- 文档编号:8595754
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:16
- 大小:21.13KB
数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
数据结构与算法
课程简介:
本课程总学时需要64学时,其中实验课10学时,共有5个实验,每个实验为2学时,从其中的7个实验选其中的5个。
本课程的先行课为《C++程序设计》
实验一线性表及其应用
一、实验目的
1、掌握用上机调试线性表的基本方法;
2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。
二、实验环境
硬件:
PC微型计算机、256M以上内存,40G以上硬盘。
软件:
WindowsXP,VC或VS.Net
三、实验内容
线性表基本操作的实现
当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
四、实验步骤
1、本实验的程序清单如下。
下面只是根据实验指导书上的程序,各位同学要按照实际上机调试后的结果程序附上:
typedefNull0;
typedefintdatatype;
#definemaxsize1024;
typedefstruct
{datatypedata[maxsize];
intlast;
}sequenlist;
intinsert(L,x,i)
sequenlist*L;
inti;
{intj;
if((*L).last==maxsize-1)
{
printf(“overflow”);
returnNull;
}
else
if((i<1)‖(i>(*L).last+1)
{printf(“error”);
returnNull;
}
else
{for(j=(*L).last;j>=i-1;j--)
(*L).data[j+1]=(*L).data[j];
(*L).data[i-1]=x;
(*L).last=(*L).last+1;
}
return
(1);
}
intdelete(L,i)
sequenlist*L;
inti;
{intj;
if((i<1)‖(i>(*L).last+1))
{printf(“error”);
returnNull;
}
else
{for(j=i,j<=(*L).last;j++)
(*L).data[j-1]=(*L).data[j];
(*L).data--;
}
return
(1);
}
voidcreatlist()
{sequenlist*L;
intn,i,j;
printf(“请输入n个数据\n”);
scanf(“%d”,&n);
for(i=0;i {printf(“data[%d]=”,i); scanf(“%d”,(*L).data[i]); } (*L).last=n-1; printf(“\n”); } printout(L) sequenlist*L; {inti; for(i=0;i<(*L).last;i++) {printf(“data[%d]=”,i); printf(“%d”,(*L).data[i]); } } voidmain(){ sequenlist*L; charcmd; inti,t; clscr(); printf(“i,I…..插入\n”); printf(“d,D…..删除\n”); printf(“q,Q……退出\n”); do{ do { cmd=getchar(); } while((cmd! =‘d’)‖(cmd! =‘D’)‖(cmd! =‘q’)‖ (cmd! =‘Q’)‖(cmd! =‘i’)‖(cmd! =‘I’)); switch(cmd) {case‘i’,‘I’;scanf(&x); scanf(&i); insert(L,x,i); printout(L); break; case‘d’,‘D’;scanf(&i); delete(L,i); printout(L); break; } } while((cmd! =‘q’)&&(cmd! =‘Q’)); } 2、本程序运行的结果如下: 根据各位同学的实际调试数据编写。 3、结合以上程序如何进行分析和改进。 并把分析和改进的内容附上。 五、实验小结 实验过程中的体会和收获。 六、实验思考题与练习 线性表的非顺序存储结构如何实现? 链表是如何操作的? 模仿线性表的顺序存储结构的实验编写线性表的非顺序存储结构的实验报告并进行相应的实验。 实验二栈的基本操作 一、实验目的 1.掌握栈的基本操作: 2.初始化栈、判栈为空、出栈、入栈等运算。 二、实验要求 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析。 三、实验内容 利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法为: 1、定义栈的顺序存取结构 2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3、定义一个函数用来实现上面问题: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将X%R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 四、实验思考题与练习 1、如何实现队列的操作 2、利用栈实现数学表达式的转换 3、迷宫问题 选择一个以上题目进行实验,并编写实验报告 实验三、队列应用—迷宫问题 一、实验内容 n*m迷宫是一个矩形区域,(1,1)为入口(n,m)为出口,0表示该方格可通过,1表示该方格有阻碍不能通过,每次只能从一个无障碍方格向其周围8各方向的邻接任一无障碍方格移动一步,问,当迷宫有解时如何寻找一条由入口到出口的路径并返回这个序列,或者不能连通时给出无解标志。 迷宫如下表所示。 一个带边界哨的10×15迷宫 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 二、实验要求 ①提出思想 ②给出算法 ③程序设计 ④给定一个迷宫表,列出运行结果 三、实验目的 通过实验,同学掌握队列数据结构在算法中的深入应用方法,这是宽度优先的搜索过程中使用队列结构的典型应用 实验四二叉树的操作 一、实验目的 1、进一步掌握指针变量、动态变量的含义; 2、掌握二叉树的结构特征,以及各种存储结构的特点及适用范围; 3、掌握用指针类型描述、访问和处理二叉树的运算。 二、实验要求 1.认真阅读和掌握本实验的程序。 2.上机运行本程序。 3.保存和打印出程序的运行结果,并结合程序进行分析。 4.按照你二叉树的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 三、实验内容 已知以二叉链表作存储结构,试编写按层次顺序遍历二叉树的算法。 算法思想: 本算法要采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。 因为队列的特点是先进先出,从而达到按层次顺序遍历二叉树的目的。 程序实现: #defineM100 #defineNull0 typedefstructnode {intdata; stuuctnode*lchild,*rchild; }bitree; bitree*que[M]; intfront=0,rear=0; bitree*creat() {bitree*t; intx; scanf(“%d”,&x); if(x==0) t=Null; else { t=malloc(sizeof(bitree)); t→data=x; t→lchild=creat(); t→rchild=creat(); } returnt; } voidinorder(t) bitree*t; {if(t! =Null) {inorder(t→lchild); printf(“%4d”,t→data); inorder(t→rchild); } } voidenqueue(t) bitree*t; {if(front! =(rear+1)%M) {rear=(rear+1)%M; que[rear]=t; } } bitree*delqueue() { if(front==rear) returnNull; front=(front+1)%M; return(que[front]); } voidlevorder(t) bitree*t; {bitree*p; if(t! =Null) {enqueue(t); while(front! =rear) {p=delqueue(); printf(“%4d”,p→data); if(p→lchild! =Null) enqueue(p→lchild); if(p→rchild! =Null) enqueue(p→rchild);} } } main() {bitree*root; printf(“\n”); root=creat(); inorder(root); printf(“\n”); levorder(root); } 四、实验思考题与练习 1、二叉树顺序表示和相应的操作? 2、二叉树的递归算法? 3、二叉树的应用举例? 选择一个以上题目进行实验,并编写实验报告 实验五图的及其应用 一、实验目的 1、掌握图的基本存储方法; 2、掌握有关图的操作算法并用高级语言实现; 3、熟练掌握图的两种搜索路径的遍历方法。 二、实验要求 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析。 三、实验内容 假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所到达另一场所。 算法思想: 下面是R、W、Floyd求每对顶点之间最短路径算法的C语言程序,程序中矩阵A用来进行n次迭代,矩阵P用来记录路径,P[i][j]为迭代过程中当前已经求得的从顶点i到顶点j的最短路径上最后被插入的那个顶点。 算法实现: typedefstructnode {intno; floatwgt; structnode*next; }edgenode; typedefstruct {charvtx; edgenode*link; }vexnode; typedefvexnodeGraph[n]; voidFloyd(GraphG,floatA[n][n],intp[n][n]) { inti,j,k;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书