数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/26/093f6df5-a217-4a89-8582-c05aea53f974/093f6df5-a217-4a89-8582-c05aea53f9741.gif)
数据结构实验报告
数据结构实验报告
时间:
2020年08月03日编稿:
作者三
第一篇:
数据结构实验报告
河南省高等教育自学考试
实验报告册
计算机及应用专业(本科段)
《数据结构》
姓名周东伟准考证号010512201008所属地市郑州实验地点河南职业技术学院实验日期2014-3-18实验总成绩指导教师签名实验单位(实验室)意见:
主考院校审核意见:
河南科技大学自学考试办公室
第二篇:
数据结构实验报告
南京信息工程大学实验(实习)报告
实验(实习)名称数据结构实验(实习)日期2011-11-2得分指导教师周素萍
系公共治理系专业信息治理与信息系统年级10级班次1姓名常玲学号2010230700
3实验一顺序表的基本操作及C语言实现
【实验目的】
1、顺序表的基本操作及C语言实现
【实验要求】
1、用C语言建立自己的线性表结构的程序库,实现顺序表的基本操作。
2、对线性表表示的集合,集合数据由用户从键盘输入(数据类型为整型),建立相应的顺序表,且使得数据按从小到大的顺序存放,将两个集合的并的结果存储在一个新的线性表集合中,并输出。
【实验内容】
1、依据教材定义的顺序表机构,用C语言实现顺序表结构的创建、插入、删除、
查寻等操作;
2、利用上述顺序表操作实现如下程序:
建立两个顺序表表示的集合(集合中无重
复的元素),并求这样的两个集合的并。
【实验结果】
[实验数据、结果、遇到的问题及解决]
一.StatusInsertOrderList(SqList&va,ElemTypex)
{
}
二.StatusDeleteK(SqList&a,inti,intk)
{
1//在非递减的顺序表va中插入元素x并使其仍成为顺序表的算法inti;if(va.length==va.listsize)return(OVERFLOW);for(i=va.length;i>0,x}
//注意i的编号从0开始intj;if(ia.length-1||ka.length-i)returnINFEASIBLE;for(j=0;j三.//将合并逆置后的结果放在C表中,并删除B表
StatusListMergeOppose_L(LinkList&A,LinkList&B,LinkList&C)
{
LinkListpa,pb,qa,qb;pa=A;pb=B;qa=pa;qb=pb;//保存pa的前驱指针//保存pb的前驱指针pa=pa->next;pb=pb->next;A->next=NULL;C=A;while(pa&&pb){}while(pa){}qa=pa;pa=pa->next;qa->next=A->next;A->next=qa;if(pa->datadata){}else{}qb=pb;pb=pb->next;qb->next=A->next;//将当前最小结点插入A表表头A->next=qb;qa=pa;pa=pa->next;qa->next=A->next;//将当前最小结点插入A表表头A->next=qa;
}
}pb=B;free(pb);returnOK;qb=pb;pb=pb->next;qb->next=A->next;A->next=qb;
顺序表就是把线性表的元素存储在数组中,元素之间的关系直接通过相邻元素的位置来表达。
优点:
简单,数据元素的提取速度快;
缺点:
(1)静态存储,无法预知问题规模的大小,可能空间不脚,或白费存储空间;
(2)插入元素和删除元素时光复杂度高——O(n)
求两个集合的并集
该算法是求两个集合s1和s2的并集,并将结果存入s引用参数所表示的集合中带回。
首先把s1集合复制到s中,然后把s2中的每个元素依次插入到集合s中,固然重复的元素不应该被插入,最后在s中就得到了s1和s2的并集,也就是在s所对应的实际参数集合中得到并集。
第三篇:
数据结构实验报告
注意:
实验结束后提交一份实验报告电子文档
电子文档命名为“学号+姓名”,如:
E01214058宋思怡
《数据结构》实验报告
(一)
学号:
姓名:
专业年级:
实验名称:
线性表
实验日期:
2014年4月14日
实验目的:
1、熟悉线性表的定义及其顺序和链式存储结构;
2、熟练掌握线性表在顺序存储结构上实现基本操作的办法;
3、熟练掌握在各种链表结构中实现线性表基本操作的办法;
4、掌握用C/C++语言调试程序的基本办法。
实验内容:
一、编写程序实现顺序表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表L;
(2)依次在L尾部插入元素-1,21,13,24,8;
(3)输出顺序表L;
(4)输出顺序表L长度;
(5)推断顺序表L是否为空;
(6)输出顺序表L的第3个元素;
(7)输出元素24的位置;
(8)在L的第4个元素前插入元素0;
(9)输出顺序表L;
(10)删除L的第5个元素;
(11)输出顺序表L。
源代码
调试分析(给出运行结果界面)
二、编写程序实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
„„„„
„„„„
小结或讨论:
(1)实验中遇到的问题和解决办法
(2)实验中没有解决的问题
(3)体味和提高
第四篇:
数据结构实验报告
数据结构实验报告
一.题目要求
1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树举行先根、中根、和后根非递归遍历;
3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对照查寻效率,并说明在什么情况下二叉排序树效率高,为什么?
二.解决方案
对于前三个题目要求,我们用一个程序实现代码如下#include#include#include#include"Stack.h"//栈的头文件,没实用上
typedefintElemType;
//数据类型typedefintStatus;
//返回值类型//定义二叉树结构typedefstructBiTNode{ElemType
data;
structBiTNode*lChild,*rChild;//左右子树域}BiTNode,*BiTree;intInsertBST(BiTree&T,intkey){//插入二叉树函数
if(T==NULL){
T=(BiTree)malloc(sizeof(BiTNode));
T->data=key;
T->lChild=T->rChild=NULL;
return1;}elseif(keydata){InsertBST(T->lChild,key);}elseif(key>T->data){
InsertBST(T->rChild,key);}else
return0;}BiTreeCreateBST(inta[],intn){//创建二叉树函数BiTreebst=NULL;inti=0;while(i//数据域
InsertBST(bst,a[i]);
i++;}returnbst;}intDelete(BiTree&T)
{
BiTreeq,s;
}if(!
(T)->rChild){//右子树为空重接它的左子树
q=T;T=(T)->lChild;free(q);}else{
if(!
(T)->lChild){//若左子树空则重新接它的右子树
q=T;T=(T)->rChild;}else{q=T;s=(T)->lChild;while(s->rChild){
q=s;s=s->rChild;}
(T)->data=s->data;//s指向被删除结点的前驱
if(q!
=T)
q->rChild=s->lChild;
else
q->lChild=s->lChild;
free(s);}}return1;
//删除函数,在T中删除key元素intDeleteBST(BiTree&T,intkey){if(!
T)return0;else{
if(key==(T)->data)returnDelete(T);
else{
if(keydata)
returnDeleteBST(T->lChild,key);
else
returnDeleteBST(T->rChild,key);
}}}intPosttreeDepth(BiTreeT){//求深度
inthr,hl,max;if(!
T==NULL){hl=PosttreeDepth(T->lChild);hr=PosttreeDepth(T->rChild);max=hl>hr?
hl:
hr;returnmax+1;}else
return0;
}voidprinttree(BiTreeT,intnlayer){//打印二叉树if(T==NULL)return;printtree(T->rChild,nlayer+1);for(inti=0;i");}printf("%d\n",T->data);printtree(T->lChild,nlayer+1);}voidPreOrderNoRec(BiTreeroot)//先序非递归遍历{BiTreep=root;BiTreestack[50];intnum=0;while(NULL!
=p||num>0){
while(NULL!
=p)
{
printf("%d",p->data);
stack[num++]=p;
p=p->lChild;
}
num--;
p=stack[num];
p=p->rChild;}printf("\n");}voidInOrderNoRec(BiTreeroot)//中序非递归遍历{BiTreep=root;
}intnum=0;BiTreestack[50];while(NULL!
=p||num>0){while(NULL!
=p){
stack[num++]=p;
p=p->lChild;}num--;p=stack[num];printf("%d",p->data);p=p->rChild;}printf("\n");voidPostOrderNoRec(BiTreeroot)//后序非递归遍历{BiTreep=root;BiTreestack[50];intnum=0;BiTreehave_visited=NULL;
while(NULL!
=p||num>0){
while(NULL!
=p)
{
stack[num++]=p;
p=p->lChild;
}
p=stack[num-1];
if(NULL==p->rChild||have_visited==p->rChild)
{
printf("%d",p->data);
num--;
have_visited=p;
p=NULL;
}
else
{
p=p->rChild;
}}printf("\n");}
intmain(){//主函数
printf("
---------------------二叉排序树的实现-------------------");printf("\n");intlayer;inti;intnum;printf("输入节点个数:
");scanf("%d",&num);printf("依次输入这些整数(要不相等)");int*arr=(int*)malloc(num*sizeof(int));for(i=0;iscanf("%d",arr+i);}BiTreebst=CreateBST(arr,num);printf("\n");printf("二叉树创建成功!
");printf("\n");layer=PosttreeDepth(bst);printf("树状图为:
\n");printtree(bst,layer);intj;intT;intK;for(;;){loop:
printf("\n");printf("
***********************按提示输入操作符************************:
");printf("\n");printf("
1:
插入节点
2:
删除节点
3:
打印二叉树
4:
非递归遍历二叉树
5:
退出");scanf("%d",&j);
switch(j){
case1:
printf("输入要插入的节点:
");
scanf("%d",&T);
InsertBST(bst,T);
printf("插入成功!
");printf("树状图为:
\n");
printtree(bst,layer);
break;
case2:
}
printf("输入要删除的节点");scanf("%d",&K);DeleteBST(bst,K);printf("删除成功!
");printf("树状图为:
\n");printtree(bst,layer);break;case3:
layer=PosttreeDepth(bst);printtree(bst,layer);break;case4:
printf("非递归遍历二叉树");printf("先序遍历:
\n");PreOrderNoRec(bst);printf("中序遍历:
\n");InOrderNoRec(bst);
printf("后序遍历:
\n");
PostOrderNoRec(bst);
printf("树状图为:
\n");
printtree(bst,layer);
break;case5:
printf("程序执行完毕!
");
return0;}gotoloop;}return0;对于第四小问,要储存学生的三个信息,需要把上面程序修改一下,二叉树结构变为typedefintElemType;
//数据类型typedefstringSlemType;
typedefintStatus;
//返回值类型//定义二叉树结构typedefstructBiTNode{SlemTypename;ElemTypescore;ElemTypeno;
//数据域structBiTNode*lChild,*rChild;//左右子树域}BiTNode,*BiTree;参数不是key,而是另外三个
intInsertBST(BiTree&T,intno,intscore,stringname){//插入二叉树函数
if(T==NULL){
T=(BiTree)malloc(sizeof(BiTNode));
T->no=no;T->name=name;T->score=score;
T->lChild=T->rChild=NULL;
return1;}elseif(nono){InsertBST(T->lChild,no,score,name);}elseif(key>T->data){
InsertBST(T->rChild,no,score,name);}else
return0;}其他含参函数也类似即可完成50个信息存储
用数组存储50个信息,查看以往代码
#include#includeusingnamespacestd;classstudent{private:
intnum;stringname;intob1;intob2;intara;public:
voidset(inta,stringb,intc,intd);voidshow();intaverage();};voidstudent:
:
set(inta,stringb,intc,intd){num=a;name=b;ob1=c;ob2=d;ara=(c+d)/2;}voidstudent:
:
show(){coutintmain(){cout>numlock;switch(numlock){case0:
cout>i;if(i==j){cout>j;delete[j]ptr;cout>k;if(k!
=j){
coutbreak;}cout>q;cout>w;cout>e;cout>r;ptr[k].set(q,w,e,r);break;case3:
for(m=1;mfor(intn=m+1;nif(ptr[m].average()studenta;
a=ptr[m];
ptr[m]=ptr[n];
ptr[n]=a;
}}
ptr[m].show();}break;case4:
cout二叉排序树储存数据界面(储存学生信息略)
创建二叉树:
插入节点:
删除节点:
非递归遍历:
退出:
数组储存学生信息界面
分析查寻效率:
因为二叉树查寻要创建二叉树,而数组查寻只创建一个数组,二叉树的创建时光比较长,所以对于数据量较少的情况下数组的查寻效率比较高。
但当数据量增加时,二叉树的查寻优势就显现出来。
所以数据量越大的时候,二叉树的查寻效率越高。
四.总结与改进
这个实验工作量还是很大的,做了很久。
树状图形输出还是不美观,还需要改进。
一开始打算用栈实现非递归,但是依据书里面的伪代码发觉部分是在C++编译器里运行不了的(即使补充了头文件和数据的定义),所以之后参考了网上的数组非递归,发觉其功能和栈相似。
递归遍历的实现比非递归的遍历真的简单无数。
开始时只看到前三问,所以没有写到储存学生数据的代码,里面还可以用clock()函数加一个计算查寻所要数据时光的代码,让二叉树查寻与数组查寻到效率比较更加直观。
第五篇:
数据结构实验报告
数据结构实验报告
指导教师姓
名班
级学
号实
验室
黄梅根
钟志伟014070307310325S331-B
2008-11-29
单链表的插入和删除实验日志
指导教师:
黄梅根
实验时光:
2008年10月14日学院通信学院专业信息工程
班级0140703学号07310325姓名钟志伟实验室S331-B
实验题目:
单链表的插入和删除实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时光性能分析。
实验要求:
建立一个数据域定义为字符串的单链表,在链表中不同意有重复的字符串;依据输入的字符串,先寻到相应的结点,后删除之。
实验主要步骤:
1分析、理解程序。
2调试程序,并设计输入数据(如:
bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:
不同意重复字符串的插入;依据输入的字符串,寻到相应的结点并删除。
3修改程序:
增加插入结点的功能。
将建立链表的办法改为头插入法。
实验结果:
心得体味:
通过本次实验,我了基本上掌握了线性表的逻辑结构和链式存储结构,从中也发觉自己在这方面的知识掌握的还不是很扎实,下来要多看书,将基本的知识要掌握坚固。
二叉树操作实验日志
指导教师:
黄梅根
实验时光:
2008年10月28日学院通信学院专业信息工程
班级0140703学号07310325姓名钟志伟实验室S331-B实验题目:
二叉树操作
实验目的:
掌握二叉树的定义、性质及存储方式,各种遍历算法。
实验要求:
采纳二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
实验主要步骤;1.分析、理解程序。
2.添加中序和后序遍历算法.3.调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。
实验结果:
心得体味:
通过此次实验,我基本掌握了建立二叉树,并且掌握了先序、中序和后序以及按层次遍历的操作,更好的掌握了书本上的知识。
图的遍历操作实验日志
指导教师:
黄梅根
实验时光:
2008年11月11日学院通信学院专业信息工程
班级0140703学号07310325姓名钟志伟实验室S331-B实验题目:
图的遍历操作实验目的:
掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。
实验要求:
采纳邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。
实验主要步骤:
1、分析、理解程序。
2、调试程序。
设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。
实验结果:
心得体味:
通过本次实验,我掌握了有向图和无向图的一些概念,了解了DFS和BFS对图的遍历操作。
循环链表实验日志
指导教师:
黄梅根
实验时光:
2008年11月25日学院通信学院专业信息工程
班级0140703学号07310325姓名钟志伟实验室S331-B实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握循环链表的基本算法及相关的时光性能分析。
实验要求:
1.实现循环链表的建立
2.输出循环链表节点的指针序列,要求先输出自身的指针,再输出其指向的节点的指针。
如一个有五个节点的循环链表,各节点地址依次为3109,3290,3106,3595,3390,则输出应为:
3109
3290
32903106
3106