数据结构全部上机实验及答案.docx
- 文档编号:24218802
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:141
- 大小:946.69KB
数据结构全部上机实验及答案.docx
《数据结构全部上机实验及答案.docx》由会员分享,可在线阅读,更多相关《数据结构全部上机实验及答案.docx(141页珍藏版)》请在冰豆网上搜索。
数据结构全部上机实验及答案
淮海工学院
数据结构实验指导书
计算机软件教研室
实验1线性表的抽象数据类型的实现
实验目的
1)掌握线性表的顺序存储结构和链式存储结构;
2)熟练掌握顺序表和链表基本算法的实现;
3)掌握利用线性表数据结构解决实际问题的方法和基本技巧;
4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果);
5)按时提交实验报告。
实验环境
计算机、C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
一、顺序表的基本操作实现实验
要求:
数据元素类型ElemType取整型int。
按照顺序存储结构实现如下算法(各算法边界条件和返回结果适当给出):
1)创建任意整数线性表(即线性表的元素值随机在键盘上输入),长度限定在25之内;
2)打印(遍历)该线性表(依次打印出表中元素值);
3)在线性表中查找第i个元素,并返回其值;
4)在线性表中第i个元素之前插入一已知元素;
5)在线性表中删除第i个元素;
6)求线性表中所有元素值(整数)之和;
二、链表(带头结点)基本操作实验
要求:
数据元素类型ElemType取字符型char。
按照动态单循环链表结构实现如下算法(各算法边界条件适当给出):
1)创建任意字符型有序(递增排序)单循环链表(即链表的字符元素随机在键盘上输入),长度限定在15之内;
2)打印(遍历)该链表(依次打印出表中元素值);
3)在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
4)在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
5)在链表中按照有序方式插入一已知字符元素;
6)在线性表中删除第i个结点;
7)计算链表的长度。
实验步骤
一、顺序表的源程序
#include
#include
#include
intlist[25];inti,n,a,sum=0,k,l;
inteleminsert;
/*------------------创建函数--------------*/
voidinitlist()
{
printf("Pleaseinputthetotaloftheelems:
");
scanf("%d",&n);
if(n>25||n<1){printf("ERROE!
");return;}
printf("Pleaseinputtheelems:
...\n");
for(i=0;i {scanf("%d",&list[i]); } return; } /*------------------打印函数--------------*/ voidPrint(intlist[],intn) { intj; for(j=0;j printf("%d\t",list[j]); printf("\n"); return; } /*------------------查找函数------------*/ intSearch(intlist[],intn,intm) { if(m<1||m>n){printf("ERROR! \n");return;} elseprintf("Theelemis%dat%dplace\n",list[m-1],m); return; } /*----------------插入函数------------*/ voidInsert(intlist[],intn,intm,intelem) { intj; if(m<1||m>n){printf("ERROR! \n");return;} for(j=n-1;j>=m-1;i--) {list[j+1]=list[j];} list[m-1]=elem; n=n+1; printf("Thenewlistare: "); Print(list,n); return; } /*---------------删除函数-----------*/ voidDelete(intlist[],intn,intm) { intq;intj; if(m<1||m>n) {printf("ERROR! \n");return;} j=list[m-1]; for(q=m-1;q<=n;q++) {list[q]=list[q+1];} printf("Thenewlistare: "); Print(list,n-1); free(j); return; } /*-------------求和函数------------*/ voidSum(intlist[],intn,intsum) { intj; for(j=0;j {sum=sum+list[j];} printf("Thesumis: %d",sum); return; } voidmenu() { intj; /*------------菜单函数------------*/ menulab: printf("**********************MENU******************\n\n"); printf("Createanewintlist: ...................press1\n\n"); printf("Printthewholelist: ....................press2\n\n"); printf("Searchbyorder: ........................press3\n\n"); printf("Inserttheelemintheplacei: ...........press4\n\n"); printf("Deletetheelembyorder: ................press6\n\n"); printf("Sumalleleminthelist: ................press7\n\n"); printf("exittheprograme: .......................press0\n\n"); printf("**********************END*******************\n\n"); printf("Pleasechoosethenumberfrom(0~7)....."); checklabel: scanf("%1d",&j);getchar(); if(j<0||j>7) {printf("Error! Pleasechooseagain......"); gotochecklabel; } printf("\n\tYouchoosethenumber%d\n",j); printf("\n\tPressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ switch(j) { case1: /*创建任意整数线性表*/ initlist(); clrscr();/*clearscreen*/ gotomenulab; case2: /*打印(遍历)该线性表*/ printf("Theoriginallistis: "); Print(list,n); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case3: /*在线性表中查找第i个元素,并返回其值*/ printf("InputwhichLNodeyouwanttoSearch(Inputnumber): "); scanf("%d",&a); getchar(); Search(l,n,a); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case4: /*在线性表中第i个元素之前插入一已知元素*/ printf("Pleaseinputtheelem'splacewhereyouwanttoinsert"); scanf("%d",&k); printf("Inputtheelemwhichyouwanttoinsert: "); scanf("%d",&eleminsert); Insert(list,n,k,eleminsert); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case5: /*在线性表中删除第i个元素*/ printf("Pleaseinputtheelemyouwanttodelete: "); scanf("%d",&l); n=n+1; Delete(list,n,l); n=n-1; printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case6: /*求线性表中所有元素值(整数)之和*/ Sum(list,n,sum); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case0: /*退出程序*/ printf("Pressanykeytocontinue....."); getchar(); exit(0); }} voidmain() { voidmenu(); menu(); } 二、链表(带头结点)的源程序 #include #include structLNode{ charelem; structLNode*next; }*l,*p,*new; inti,a,k,n;charc,s; /*----------------创建函数-------------*/ voidintilist(void) { l=(structLNode*)malloc(sizeof(structLNode)); l->next=NULL; clrscr(); printf("Inputthetotaloftheelems: ....."); scanf("%d",&n); getchar(); if(n>15) printf("Error! "); for(i=n;i>0;i--) { new=(structLNode*)malloc(sizeof(structLNode)); new->next=l->next;l->next=new; } p=l; while(p->next! =NULL)p=p->next; p->next=l; printf("Inputelems: .......\n"); p=l->next; for(i=1;i<=n;i++) { scanf("%c",&p->elem);getchar(); p=p->next; } return; } /*----------------排序函数-------------*/ voidSequence(structLNode*l,intn) { inti;charswap,*e,*f; for(i=1;i<=n-1;i++) {p=l->next; while(p->next! =l) {if(p->elem>p->next->elem){e=&p->elem; f=&p->next->elem;swap=*e;*e=*f;*f=swap;} p=p->next;} } return; } /*----------------打印函数-------------*/ voidPrint(structLNode*l,intn) { inti; p=l->next; for(i=1;i<=n;i++) { printf("%c\t",p->elem); p=p->next; } printf("\n"); return; } /*----------------查找函数-------------*/ voidLocate(structLNode*l,intn,intm) { inti; if(m>n){printf("FALSE! \t");return;} else{p=l; for(i=1;i<=m;i++) {p=p->next;} printf("Theelemis: %c\n",p->elem); } return; } /*------已知字母匹配首结点查找函数------*/ voidLocateLNode(structLNode*l,intn,charm) { inti; p=l; for(i=1;i<=n;i++) {p=p->next;if(p->elem==m){printf("TRUE! \n");return;}} if(i>n)printf("FALSE! \n"); return; } /*----------------插入函数-------------*/ voidInsert(structLNode*l,intn,charm) { new=(structLNode*)malloc(sizeof(structLNode)); new->next=l->next; l->next=new; new->elem=m; n=n+1; Sequence(l,n); Print(l,n); return; } /*----------------删除函数-------------*/ voidDelete(structLNode*l,intn,intm) { inti; p=l; for(i=1;i {p=p->next;} p->next=p->next->next; n=n-1; printf("Thenewlistis: "); Print(l,n); return;} /*----------------求表长函数-------------*/ voidLength(intn) { inti;intlength=0; for(i=1;i<=n+1;i++) {length=length+sizeof(structLNode);} printf("Thelengthofthelistis: %d",length); return; } /*----------------菜单函数-------------*/ voidmenu() { intj; menulab: printf("**********************MENU******************\n\n"); printf("Createthenewlist: ..................press1\n\n"); printf("Sequencethelist: ...................press2\n\n"); printf("SearchtheLnodebyorder: ............press3\n\n"); printf("SearchtheLnodebyelem: .............press4\n\n"); printf("Inserttheelem: ......................press5\n\n"); printf("Deletetheelembyorder: .............press6\n\n"); printf("Returnthelengthofthelist: ........press7\n\n"); printf("exittheprograme: ....................press0\n\n"); printf("**********************END*******************\n\n"); printf("Pleasechoosethenumberfrom(0~7)....."); checklabel: scanf("%1d",&j);getchar(); if(j<0||j>7) {printf("Error! Pleasechooseagain......"); gotochecklabel; } printf("\n\tYouchoosethenumber%d\n",j); printf("\n\tPressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ switch(j) { case1: /*创建链表并输入元素*/ intilist(); clrscr();/*clearscreen*/ gotomenulab; case2: /*排序并打印链表*/ Sequence(l,n); printf("Theorignallistis: \n"); Print(l,n); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case3: /*查找第i个元素*/ printf("InputwhichLNodeyouwanttolocate(Inputnumber): "); scanf("%d",&a);getchar(); Locate(l,n,a); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case4: /*查找与已知字符相同的第一个结点*/ printf("Inputtheelemyouwanttosearch"); scanf("%c",&c);getchar(); LocateLNode(l,n,c); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case5: /*插入已知字符的结点*/ printf("Inputtheelemyouwanttoinsert: "); scanf("%c",&s);getchar(); Insert(l,n,s); n=n+1; printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case6: /*删除第i个结点*/ printf("Inputwhichoneyouwanttodelete: "); scanf("%d",&k); if(k<1||k>n)printf("ERROR! "); else{Delete(l,n,k);} n=n-1; getchar(); clrscr();/*clearscreen*/ gotomenulab; case7: /*计算链表长度*/ Length(n); printf("Pressanykeytocontinue....."); getchar(); clrscr();/*clearscreen*/ gotomenulab; case0: /*退出链表程序*/ printf("Pressanykeytocontinue....."); getchar(); exit(0); }} /*------------------主函数---------------*/ main() { voidmenu(void); menu(); } 测试数据与实验结果(可以抓图粘贴) 一、顺序表程序抓图及其简要说明 菜单选项如下图所示: 该菜单由八个函数组成,实现八项功能。 关于顺序表的函数的具体执行情况请参照链表说明和抓图。 两程序执行情况基本类似。 二、链表(带头结点)程序抓图及其简要说明 菜单函数如下图所示: 该菜单包含了程序的八项基本操作,实现了创建、排序、查找、以及删除等功能。 具体执行过程如下。 选择菜单1,创建一个链表。 如上图所示的操作,其余也是一样例如,当选择“2”时如下图: 当执行1时如下图: 创建链表完成,按任意键返回到菜单。 当执行2时如下图: 链表排序成功,将排好的链表打印出来,按任意键返回到菜单。 当执行3时如下图: 按排序位置查找节点,并打印出查得元素,按任意键返回到菜单。 当执行4时如下图: 按元素查找与之相同的节点,返回TURE或FALSE,按任意键返回到菜单。 当执行5时如下图: 插入元素,自动排序,打印出新链表元素,按任意键返回到菜单。 当执行6时如下图: 删除一元素,打印出要删除的元素,按任意键返回到菜单。 当执行7时如下图: 打印出链表长度,按任意键返回到菜单。 当执行0时: 退出程序,按任意键返回到菜单。 (图略) 实验2栈和队列的算法实现 实验2栈和队列的算法实现 实验目的 1)掌握栈与队列的数据类型描述及特点; 2)熟练掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示与基本操作算法实现; 4)掌握栈
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 全部 上机 实验 答案