串数据结构实验报告修改版.docx
《串数据结构实验报告修改版.docx》由会员分享,可在线阅读,更多相关《串数据结构实验报告修改版.docx(11页珍藏版)》请在冰豆网上搜索。
串数据结构实验报告修改版
第一篇:
串-数据结构实验报告
【源程序】:
#include#include#includevoidchoose(char*s,inti,intm,char*t);
//i位置截取m个字符函数voidmain()//主函数{char*s,*t;inti,sl,m;
s=(char*)malloc(100*sizeof(char));
t=(char*)malloc(100*sizeof(char));
printf("\n输入主字符串s=?
");gets(s);printf("\ns=%s\n",s);
printf("\n输入位置i=?
");scanf("%d",&i);printf("\ni=%d\n",i);
printf("\n输入字符个数m=?
");scanf("%d",&m);printf("\nm=%d\n",m);
sl=strlen(s);
if(i>sl)printf("i位置出错\n");
elseif(i+m>sl+1)printf("m位置出错\n");
else
{
choose(s,i,m,t);
printf("\n子串为t=%s\n",t);
}}//end_mainvoidchoose(char*s,inti,intm,char*t){intn;intj=0;for(n=i;n
三.实验结论及分析
串的存储结构包含有顺序存储结构和链式存储结构。
在串的顺序存储结构中,表示串的长度通常有两种方法:
一种方法是设置一个串的长度参数,其优点在于便于在算法中用长度参数控制循环过程;另一种方法是在串值得末尾添加结束标记,此种方法的优点在于便于系统自动实现。
在串的存储过程中,串值用双引号引起来,系统将自动在串值得末尾添加结束标记‘\0’字符,这样,字符串数组名给出了串在内存中的开始地址,串值末尾的结束标记‘\0’字符标记了串在内存中的结束位置。
在本次试验中源程序、以及试验三中,当字符位置在原字符串的最后位置时,为实现字符串的结尾,在字符串最后添加一个’\0’。
在实习一中,gets(),scantf()两个函数的不同在于,gets()通过键盘接受字符时,直到遇到换行符结束,而scanf()结束标志可以是‘空格键‘、’Tab‘键、或者换行符,这在运行截图中有体现,输入的字符串是abcdefghjklmn,其中将abc替换为%%%,而输出时是%%%defghj。
四、实验总结
本次试验之后,学会了串函数的相关调用以及串的相应操作。
第二篇:
数据结构实验报告
注意:
实验结束后提交一份实验报告电子文档
电子文档命名为“学号+姓名”,如:
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)体会和提高
第三篇:
数据结构实验报告
南京信息工程大学实验(实习)报告
实验(实习)名称数据结构实验(实习)日期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所对应的实际参数集合中得到并集。
第四篇:
数据结构实验报告
数据结构实验报告
第一次实验
学号:
20141060106
姓名:
叶佳伟
一、实验目的
1、复习变量、数据类型、语句、函数;
2、掌握函数的参数和值;
3、了解递归。
二、实验内容
1、(必做题)采用函数统计学生成绩:
输入学生的成绩,计算并输出这些学生的最低分、最高分、平均分。
2、(必做题)采用递归和非递归方法计算k阶裴波那契序列的第n项的值,序列定义如下:
f0=0,f1=0,…,fk-2=0,fk-1=1,fn=fn-1+fn-2+…+fn-k(n>=k)要求:
输入k(1
3、(选做题)采用递归和非递归方法求解汉诺塔问题,问题描述如下:
有三根柱子A、B、C,在柱子A上从下向上有n个从大到小的圆盘,在柱子B和C上没有圆盘,现需将柱子A上的所有圆盘移到柱子C上,可以借助柱子B,要求每次只能移动一个圆盘,每根柱子上的圆盘只能大的在下,小的在上。
要求:
输入n,输出移动步骤。
三、算法描述
(采用自然语言描述)
1.先输入各个成绩,然后再逐一比较,筛选出最低分和最高分。
在筛选的过程中使用累加把各个人的总成绩算出来,最后再除以总人数。
2.
四、详细设计
(画出程序流程图)1.
五、程序代码
(给出必要注释)1.#includefloatave(intscore[],intk){inti;floats=0.0,ave;for(i=0;i
1}intmax(intscore[],intk){inti,max;max=score[0];for(i=0;imax)max=score[i];returnmax;}intmin(intscore[],intk){inti,min;min=score[0];for(i=0;i
2.#includeintf(intn){intk;if(n
2elsereturn(2*f(n-1)-f(n-k-1));}voidmain(){intk,n,fn=0;printf("请输入k和n的值:
[k(11){fn=(n);printf("f%d=%d\n",n,fn);break;}}2.2#include
六、测试和结果
(给出测试用例以及测试结果)
1.
2.
七、用户手册
(告诉用户如何使用程序)1.使用MicrcosoftVisualC++。
2.使用MicrcosoftVisualC++。
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;i
scanf("%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(){cout
intmain(){cout>numlock;switch(numlock){case0:
cout>i;if(i==j){cout>j;delete[j]ptr;cout>k;if(k!
=j){
cout
break;}cout>q;cout>w;cout>e;cout>r;ptr[k].set(q,w,e,r);break;case3:
for(m=1;m
for(intn=m+1;n
if(ptr[m].average()
studenta;
a=ptr[m];
ptr[m]=ptr[n];
ptr[n]=a;
}}
ptr[m].show();}break;case4:
cout
二叉排序树储存数据界面(储存学生信息略)
创建二叉树:
插入节点:
删除节点:
非递归遍历:
退出:
数组储存学生信息界面
分析查找效率:
因为二叉树查找要创建二叉树,而数组查找只创建一个数组,二叉树的创建时间比较长,所以对于数据量较少的情况下数组的查找效率比较高。
但当数据量增加时,二叉树的查找优势就显现出来。
所以数据量越大的时候,二叉树的查找效率越高。
四.总结与改进
这个实验工作量还是很大的,做了很久。
树状图形输出还是不美观,还需要改进。
一开始打算用栈实现非递归,但是根据书里面的伪代码发现部分是在C++编译器里运行不了的(即使补充了头文件和数据的定义),所以之后参考了网上的数组非递归,发现其功能和栈相似。
递归遍历的实现比非递归的遍历真的简单很多。
开始时只看到前三问,所以没有写到储存学生数据的代码,里面还可以用clock()函数加一个计算查找所要数据时间的代码,让二叉树查找与数组查找到效率比较更加直观。