数据实验报告.docx
- 文档编号:25668213
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:106
- 大小:562.24KB
数据实验报告.docx
《数据实验报告.docx》由会员分享,可在线阅读,更多相关《数据实验报告.docx(106页珍藏版)》请在冰豆网上搜索。
数据实验报告
实验一:
合并线性表
班级:
计算机00姓名:
张庆华学号:
20100301012
实验日期:
2012年3月12日
一、问题描述
对采用顺序存储结构的两个线性表予以合并,结果表中应无重复元素。
2、需求分析
首先,应该建立线性表作为存储结构,这个可以用数组(静态数组或动态数组)来实现。
另外还需要考虑线性表里的存储元素的数据类型。
最后,设计合并算法,其算法基本思想可以为:
用一个数组里的元素(选存储空间大的数组)与另一个数组里的元素逐项比较,若不相同,则将该元素插入到该数组中。
3、概要设计
1、用静态分配的存储结构用数组实现建立线性表。
2、设计将两个线性表的元素一一进行比较,元素不同则进行插入的算法,写出代码。
3、定义两个数组线性表,并分别向该两个线性表中输入数据。
4、编写程序,实现两个线性表的合并。
四、详细设计
1、将两个线性表的元素一一进行比较,元素不同则进行插入的算法:
StatusMerge(ElemTypel[],ElemTypen[],ElemTypem[],ElemTypeta,
ElemTypeb){
inti=0,j=0,k=0;
do{
do{
if(n[i]==m[j])i++;
elsej++;
}while(j<=b-1);
l[k]=n[i];k++;j=0;i++;
}while(i<=a);
for(j=0;j
l[k-1]=m[j];k++;
}
returnk;
}
2、源程序代码:
#include
intMerge(charl[],charn[],charm[],inta,intb)
//将两个线性表的元素一一进行比较,元素不同则进行插入的函数
{
inti=0,j=0,k=0;
do
{
do
{
if(n[i]==m[j])
i++;
else
j++;
}while(j<=b-1);
l[k]=n[i];
k++;
j=0;
i++;
}while(i<=a);
for(j=0;j
{
l[k-1]=m[j];
k++;
}
returnk;
}
intmain()
{
chara[10],b[10],c[20],D;
inti,j,q,p;
printf("请选择要输入的线性表的元素类型:
\n");
printf("A.字符型\n");
printf("B.整型\n");
scanf("%c",&D);
if(D=='A')
{
printf("请输入第一个线性表元素的个数:
\n");
scanf("%d",&q);
for(i=0;i { getchar(); printf("请输入第一个线性表的第%d个元素: \n",i+1); scanf("%c",&a[i]); } printf("请输入第二个线性表元素的个数: \n"); scanf("%d",&p); for(i=0;i { getchar(); printf("请输入第二个线性表的第%d个元素: \n",i+1); scanf("%c",&b[i]); } j=Merge(c,a,b,q,p); printf("合并后的线性表的元素为\n"); for(i=0;i printf("a[%d]=%c",i,c[i]); } else { printf("请输入第一个线性表元素的个数: \n"); scanf("%d",&q); for(i=0;i { printf("请输入第一个线性表的第%d个元素: \n",i+1); scanf("%d",&a[i]); } printf("请输入第二个线性表元素的个数: \n"); scanf("%d",&p); for(i=0;i { printf("请输入第二个线性表的第%d个元素: \n",i+1); scanf("%d",&b[i]); } j=Merge(c,a,b,q,p); printf("合并后的线性表的元素为\n"); for(i=0;i printf("a[%d]=%d",i,c[i]); } return0; } 5、调试分析 线性表中的元素为int类型,测试数据如下: A={1,22,7,5,6}B={5,7,90,11,2,35,98} 输出结果应为: A∪B={1,22,7,5,6,90,11,2,35,98} 6、测试结构 程序运行结果如下: 7、心得体会 这次数据结构实验课使我了解到了一个小程序开发的过程,虽然规模不大,但为我以后的数据结构编程学习打下了基础。 在编程的过程中,我体会到了学习编程的辛苦,为了一个算法的实现而思考,为了一个小小的编译错误而花时间去寻找,这需要很大的毅力和耐心,而且要有良好的思维,这才使得我完成这个任务,也使我感到一分喜悦,毕竟自己完成了一个有模有样的程序。 实验二: 创建链表 班级: 计算机00姓名: 张庆华学号: 20100301012 实验日期: 2012年3月19日 1、问题描述 创建一个线性链表,元素用结点存储,必要时可增加头结点;实现其插入、 删除、查找等操作。 设有一图书目录,其每一条记录包含有书名、编号等字段,用链表实现 存储、添加,删除等,以实现目录的更新。 2、需求分析 首先,定义结点的数据类型,并动态建立单链表。 然后,需设计出该插入、删除、查找算法。 最后,用该链表实现图书目录的存储、添加、删除等。 3、概要设计 1、定义结点数据类型,并动态建立单链表。 2、设计该链表的插入、删除、查找算法,并写出伪代码。 3、编写程序,实现链表的各个操作。 4、详细设计 1、定义结点数据类型(图书目录) typedefstructLNode{ charname[10];//书名 structLNode*next;//指向下一个结点 }LNode,*Linklist; 2、链表的插入、删除算法伪代码。 //向链表中插入一个元素算法 StatusListinsert(LinklistL,inti,chare[]){ //在带头结点的单链线性表L中第i个位置之前插入元素 intj=0; Linklistp,s;p=L; while(p&&j p=p->next; ++j; } if(! p||j>i-1){ printf("没有合适的插入点! \n"); return0; } else{ s=(Linklist)malloc(sizeof(LNode)); strcpy(s->name,e); s->next=p->next; p->next=s; printf("插入成功! \n"); return0; } } //删除链表中的一个元素 StatusListDelete(Linklist&L,inti){ //在带头结点的单链线性表L中,删除第i个元素 Linklistp,q;intj=0;p=L; while(p->next&&j p=p->next; j++; } if(! (p->next)||j>i-1){ printf("您所选的删除位置不合理! \n"); return0; } else{ q=(Linklist)malloc(sizeof(LNode)); q=p->next; p->next=q->next; free(q); printf("删除成功! \n"); return0; } return0; } //查找结点 StatusListSearch(LinklistL,chare[]){ //按书名查找,并返回编号 Linklistp; intj=1; p=L->next; while(p&&strcmp(e,p->name)){ p=p->next;j++; } if(! p||strcmp(e,p->name)){ printf("您所查询的信息不存在! \n"); return0; } else printf("您所查询的书本编号为%d! \n",j); return0; } 3、程序源代码 #include #include #include typedefstructLNode{ charname[10]; structLNode*next; }LNode,*Linklist; intListinsert(LinklistL,inti,chare[]){ intj=0; Linklistp,s; p=L; while(p&&j p=p->next; ++j; } if(! p||j>i-1){ printf("没有合适的插入点! \n"); return0; } else{ s=(Linklist)malloc(sizeof(LNode)); strcpy(s->name,e); s->next=p->next; p->next=s; printf("插入成功! \n"); return0; } } intListDelete(Linklist&L,inti){ Linklistp,q; intj=0; p=L; while(p->next&&j p=p->next; j++; } if(! (p->next)||j>i-1){ printf("您所选的删除位置不合理! \n"); return0; } else{ q=(Linklist)malloc(sizeof(LNode)); q=p->next; p->next=q->next; free(q); printf("删除成功! \n"); return0; } return0; } intListSearch(LinklistL,chare[]){ Linklistp; intj=1; p=L->next; while(p&&strcmp(e,p->name)){ p=p->next; j++; } if(! p||strcmp(e,p->name)){ printf("您所查询的信息不存在! \n"); return0; } else printf("您所查询的书本编号为%d! \n",j); return0; } intmain(){ charn; LinklistL; L=(Linklist)malloc(sizeof(LNode)); L->next=NULL; do{ printf("请选择: \n"); printf("\ta.插入记录\n"); printf("\tb.查询记录\n"); printf("\tc.删除记录\n"); printf("\td.退出\n"); scanf("%c",&n); switch(n){ case'a': { printf("请输入你想在第几个结点前面插入: \n"); inti; scanf("%d",&i); printf("请输入书名: \n"); chare1[10]; scanf("%s",e1); Listinsert(L,i,e1); };break; case'b': { printf("请输入书名: \n"); chare2[10]; scanf("%s",e2); ListSearch(L,e2); };break; case'c': { printf("请输入你想删除第几个结点: \n"); inti; scanf("%d",&i); ListDelete(L,i); };break; case'd': break; default: printf("选择错误! \n"); } getchar(); }while(n! ='d'); return0; } 5、调试分析 链表中的结点包含图书名,输入下面数据进行测试: 书名编号 yuwen1 shujujiegou2 gailv3 6、测试结果 程序运行结果如下: 1、插入操作 2、 查询操作 3、 删除操作 七、心得体会 这次实验使我了解到链表的一些用法,我也发现自己的一些不足,良好的编程习惯的养成,坚定的毅力和耐心仍是我要加强的,同别人的交流也是必须的,这样才能不断使我进步。 高手们往往是在日日夜夜中磨练出来的,我也要向着更高的方向前进,这是我的梦想。 从从拿到题目到完成整个编程,从理论到实践,在这个过程中,可以学到很多很多的的东西。 实验三: 栈的应用 班级: 计算机00姓名: 张庆华学号: 20100301012 实验日期: 2012年3月26日 1、问题描述 设有一任意十进制整数,要求将其转换成二进制、八进制或者十六进制数。 2、需求分析 首先,需要构建栈,及栈的基本操作;然后,设计出将任意十进制的整数转换成其它任意进制数的算法,依照算法,结合栈"后进先出"的特点,编程实现该问题。 最后,输出该转换进制的数,但应注意该数的输出形式。 另外,输入的十进制整数可能很大,超过计算机整型数据的范围,这时需要设计另外算法,将数看成串,重新设计数的基本运算法则。 3、概要设计 1、定义栈结构体类型,并及其基本操作。 2、设计任意十进制整数转换成任意进制数的算法,写出算法伪代码。 3、编程实现。 4、详细设计 1、定义栈结构体类型,并及其基本操作: typedefstruct{ int*base;//栈底指针 int*top;//栈顶指针 intstacksize;//当前已分配的存储空间 }SqStack; //创建一个空栈s StatusInitStack(Sqstack&s); //插入元素e为新的栈顶元素 StatusPush(Sqstack&s,SElemTypee); //若栈不空,则删除s的栈顶元素,用e返回其值,并返回Ok,否子返回ERROR StatusPop(Sqstack&s,SElemType&e); 2、将任意十进制整数,要求将其转换成二进制、八进制或者十六进制数算法: voidconversion(intm){ //对于输入的任意一个非负十进制整数,打印输出其等值的八进制数 SqStacks1; InitStack(s1); intj,n; printf("请输入您所需要转换成%d进制的十进制数: \n",m); scanf("%d",&n); while(n){ Push(s1,n%m); n=n/m; } printf("您所输入的十进制数转换为%d进制数后为: ",m); while(s1.top! =s1.base){ Pop(s1,j); If(m==16&&j>9&&j<16) switch(j) { case10: printf("A");break; case11: printf("B");break; case12: printf("C");break; case13: printf("D");break; case14: printf("E");break; case15: printf("F");break; } else printf("%d",j); } } 3、程序源代码: #include #include #include #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefstruct{ int*base; int*top; intstacksize; }SqStack; intInitStack(SqStack&s){ s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(! s.base) printf("栈构造失败! \n"); else{ s.top=s.base; s.stacksize=STACK_INIT_SIZE; } return0; } intPush(SqStack&s,inte){ if(s.top-s.base>=s.stacksize) { s.base=(int*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int)); if(! s.base) printf("增加空间失败! \n"); else{ s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } } *s.top++=e; return0; } intPop(SqStack&s,int&e){ if(s.top==s.base){ printf("该栈为空! \n"); return0; } else e=*--s.top; return0; } voidconversion(intm){ SqStacks1; InitStack(s1); intj,n; printf("请输入您所需要转换成%d进制的十进制数: \n",m); scanf("%d",&n); while(n){ Push(s1,n%m); n=n/m; } printf("您所输入的十进制数转换为%d进制数后为: ",m); while(s1.top! =s1.base){ Pop(s1,j); if(m==16&&j>9&&j<16) switch(j){ case10: printf("A");break; case11: printf("B");break; case12: printf("C");break; case13: printf("D");break; case14: printf("E");break; case15: printf("F");break; } else printf("%d",j); } } intmain(){ printf("请输入您想把接下来将输入的数转换成多少进制: \n"); inti; scanf("%d",&i); conversion(i); printf("\n\n"); return0; } 5、调试分析 程序能实现超过计算机整数范围的十进制整数转换成其它进制的整数。 测试数据如下: 将768转换成二进制数(768)10=(1100000000)2 将2345转换成八进制数(2345)10=(4451)8 将8865转换成十六进制数(8865)10=(22A1)16 6、测试结果 程序运行结果: 七、心得体会 通过这次实验,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。 另外,这次实验使我知道了栈的用法,也让我明白了,在程序的编写过程中,需要全面的考虑问题。 实验四: 串的连接 班级: 计算机00姓名: 张庆华学号: 20100301012 实验日期: 2012年4月2日 1、问题描述 对随机输入的两个串,实现其连接,并能在串中查找子串、返回子串的位序。 2、需求分析 首先,需定义串的存储形式及其数据类型。 然后,根据其存储结构设计两串的链接算法和串的模式匹配算法。 最后,编程实现。 3、概要设计 1、定义串的数据类型。 2、设计串的链接算法,及串的匹配算法,并写出伪代码。 3、编程实现。 4、详细设计 1、定义串的数据类型: #defineMAXSTRLEN15 typedefunsignedcharSString[MAXSTRLEN+1]; 2、设计串的连接算法及匹配算法 StatusConcat(SString&T,SStrings1,SStrings2){ //用T返回s1和s2连接而成的新串。 若未截断,则返回TRUE,否则FALSE if(s1[0]+s2[0]<=MAXSTRLEN){//未截断 T[1..s1[0]]=s1[1..s1[0]]; T[s1[0]+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 实验 报告