太原理工大学数据结构试验.docx

上传人:b****6 文档编号:4399747 上传时间:2022-12-01 格式:DOCX 页数:18 大小:99.23KB
下载 相关 举报
太原理工大学数据结构试验.docx_第1页
第1页 / 共18页
太原理工大学数据结构试验.docx_第2页
第2页 / 共18页
太原理工大学数据结构试验.docx_第3页
第3页 / 共18页
太原理工大学数据结构试验.docx_第4页
第4页 / 共18页
太原理工大学数据结构试验.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

太原理工大学数据结构试验.docx

《太原理工大学数据结构试验.docx》由会员分享,可在线阅读,更多相关《太原理工大学数据结构试验.docx(18页珍藏版)》请在冰豆网上搜索。

太原理工大学数据结构试验.docx

太原理工大学数据结构试验

本科实验报告

 

课程名称:

数据结构

实验项目:

线性结构,树形结构,图的应用,查找,排序

实验地点:

行远楼A102

专业班级:

软件1334学号:

学生姓名:

指导教师:

杨崇艳

2014年12月14日

实验一:

线性结构

一、实验目的和要求

本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,提高分析和解决问题的能力。

要求仔细阅读并理解下列例题,上机通过,并观察其结果,然后独立完成后面的实习题。

二、存储结构和算法思想

[存储结构]

采用链式存储结构

[算法的基本思想]

建立链表:

当读入字符不是结束符时,给结点分配存储空间,写数据域,将新结点插到表尾;插入字符:

根据读入的字符在链表中找插入位置,将新结点插入到该位置之前;删除字符:

根据读入的删除字符在链表中找到被删结点后,将其从链表中删除;链表逆转:

从链表的第一个结点开始对所有结点处理,将每个结点的前驱变为它的后继;打印链表:

从链表的第一个结点开始,依次打印各个结点的数据域。

三、主要仪器设备

惠普242G1型笔记本电脑

四、操作方法与实验步骤

[实习题源代码]

#include"stdio.h"

#include"malloc.h"

#include"conio.h"

typedefstructnode{

chara;

structnode*link;

}node,*nodelink;

voidreadlink(nodelinkhead){

nodelinkp,q;

charc;

p=head;

printf("请输入顺序表中的递增有序元素:

");

scanf_s("%c",&c);

if(c=='\n')printf("顺序表为空\n\n");

while(c!

='\n'){

q=(nodelink)malloc(sizeof(node));

q->a=c;

p->link=q;

p=q;

scanf_s("%c",&c);

}

p->link=0;

}//构造顺序表

intadd(nodelinkhead){

nodelinkp;

p=head;

if(p->link==0)return0;

while(p->link!

=0){

if(p->a>p->link->a){

printf("输入有误请重新输入\n\n");

return0;

}

p=p->link;

}

return1;

}//判断输入元素是否递增

voidinsert(nodelinkhead,charx){

nodelinkp,q,m;

inti=0;

p=head;

q=(nodelink)malloc(sizeof(node));

q->a=x;

m=p;

while(p->link!

=0){

if(p->a>=x){

q->link=m->link;

m->link=q;

i=1;

break;

}

m=p;

p=p->link;

}

if(i==0){

p->link=q;

q->link=0;

}

}//插入元素

voidmain(){

nodelinkhead;

nodelinkp;

charx,z;

head=(nodelink)malloc(sizeof(node));

head->link=0;

readlink(head);

while(add(head)==0)

readlink(head);

printf("您输入的顺序表为:

");

for(p=head->link;p!

=0;p=p->link)

printf("%c",p->a);

printf("\n请输入您要插入的字符:

");

x=getchar();

insert(head,x);

printf("插入%c后的顺序表为:

",x);

for(p=head->link;p!

=0;p=p->link)

printf("%c",p->a);

printf("\n\n");

scanf_s("%c",&z);

printf("\n\n\n");

main();

}

五、实验结果与分析

[实习题运行结果截图]

6、讨论、心得

顺序存储结构是在内存中开辟一个连续的空间用来存储数据,因此对于内存的需求和苛刻,必须是连续的空间.在数据查找(特别是不按照规律排列的数据),时间复杂度教少.效率高.

链式存储结构是采取连表指针来指示数据的存储位置,这就可以是在内存中随意的存储,没有必须连续储存空间的要求,对于内存的要求相对教容易.但是要是是从小到大顺序排列的数据,链式存储结构的时间复杂度教小,效率高.但是要是不规则排布的数据一般时间复杂度较高,效率更低

 

实验二:

树形结构

一、实验目的和要求

熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程技术中的应用

编写递归算法,计算二叉树中叶子结点的数目。

二、存储结构和算法思想

[存储结构]

采用二叉链表存储。

[算法的基本思想]

采用递归方法建立和遍历二叉树。

首先建立二叉树的根结点,然后建立其左右子树,直到空子树为止。

后序遍历二叉树时,先遍历左子树,后遍历右子树,最后访问根结点。

三、主要仪器设备

惠普242G1型笔记本电脑

四、操作方法与实验步骤

[实习题源代码]

#include

#include

structBiTree{

chardata;

structBiTree*lchild;

structBiTree*rchild;

};

structBiTree*CreatBiTree(){

charx;

structBiTree*p;

scanf("%c",&x);

if(x!

='.'){

p=(structBiTree*)malloc(sizeof(structBiTree));

p->data=x;

p->lchild=CreatBiTree();

p->rchild=CreatBiTree();

}

else

p=NULL;

returnp;

}

intLeafNum(structBiTree*T){

if(!

T)

return0;

else

if(!

T->lchild&&!

T->rchild)

return1;

else

returnLeafNum(T->lchild)+LeafNum(T->rchild);

}

intmain(){

intnum;

structBiTree*T;

printf("请按先序序列输入二叉树\n");

T=CreatBiTree();

while(T==NULL){

printf("empoty,again:

\n");

T=CreatBiTree();

}

num=LeafNum(T);

printf("\n二叉树叶子结点为:

%d\n",num);

printf("\n\n\n\n");

main();

return0;

}

五、实验结果与分析

[实习题运行结果截图]

6、讨论、心得

树型结构是一类最重要的非线性,可以体现分支结构和层次结构

实验三:

图的应用

一、实验目的和要求

熟悉图的存储结构,掌握有关算法的实现,了解图在计算机科学及其他工程技术中的应用。

采用邻接表存储结构,编写一个求无向图的连通分量个数的算法。

二、存储结构和算法思想

[存储结构]

图采用邻接矩阵的方式存储。

[算法的基本思想]

采用广度优先搜索的方法,从顶点A开始,依次访问与A邻接的顶点VA1,VA2,...,VAK,访问遍之后,若没有访问B,则继续访问与VA1邻接的顶点VA11,VA12,...,VA1M,再访问与VA2邻接顶点...,如此下去,直至找到B,最先到达B点的路径,一定是边数最少的路径。

实现时采用队列记录被访问过的顶点。

每次访问与队头顶点相邻接的顶点,然后将队头顶点从队列中删去。

若队空,则说明到不存在通路。

在访问顶点过程中,每次把当前顶点的序号作为与其邻接的未访问的顶点的前驱顶点记录下来,以便输出时回溯。

三、主要仪器设备

惠普242G1型笔记本电脑

四、操作方法与实验步骤

[实习题源代码]

#include

#include

#include

intn;

structVNode{

intposition;

structVNode*next;

};

structArcNode{

intmark;

structVNode*first;

};

voidDFS(structArcNode*v,structArcNode*w){

structVNode*L;

w->mark=1;

L=w->first;

while(L!

=NULL){

if((v+(L->position))->mark==0){

DFS(v,(v+L->position));

}

L=L->next;

}

}

intmain(){

inti,j,k;

intnum=0;

structArcNode*p;

structVNode*temp;

structVNode*flag;

printf("该无向图有多少个顶点:

\n");

scanf("%d",&n);

while(n<1){

printf("你输入的值不合理,请重新输入:

\n");

scanf("%d",&n);

}

p=(structArcNode*)malloc(n*sizeof(structArcNode));

for(i=0;i

printf("请输入以V%d为弧尾的所有弧,并以-1结束输入\n",i+1);

scanf("%d",&k);

if(k==-1){

p[i].mark=0;

p[i].first=NULL;

}

else{

temp=(structVNode*)malloc(sizeof(structVNode));

temp->position=k;

temp->next=NULL;

p[i].first=temp;

p[i].mark=0;

flag=temp;

scanf("%d",&k);

while(k!

=-1){

temp=(structVNode*)malloc(sizeof(structVNode));

temp->position=k;

temp->next=NULL;

flag->next=temp;

flag=temp;

scanf("%d",&k);

}

}

}

i=0;

while(p[i].mark==0){

DFS(p,(p+i));

num++;

i=0;

while(p[i].mark!

=0&&i

i++;

}

}

printf("此图的连通分量个数为:

%d\n",num);

system("pause");

return0;

}

五、实验结果与分析

[实习题运行结果截图]

6、讨论、心得

对图结构和矩阵之间的概念和关系还不是很了解,在写程序是出现了很多错误,我自己对输出图结构这方面还不是很了解,通过慢慢摸索,写出了程序,有很大的成就感。

实验四:

查找

一、实验目的和要求

通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。

2、存储结构和算法思想

存储结构]

有序表采用顺序方式存储。

[算法的基本思想]

首先用待查找记录与查找区间中间位置记录比较,若相等则查找成功,返回该记录在表中的位置数,若小于中间位置记录,则修改区间上界为中间位置减1,若大于中间位置记录,则修改区间下界为中间位置加1,在新的区间内继续查找。

当查找区间下界大于上界,则该记录不存在。

三、主要仪器设备

惠普242G1型笔记本电脑

四、操作方法与实验步骤

[实习题源代码]

#include

#include

#include

structBiTree{

intdata;

structBiTree*lchild;

structBiTree*rchild;

};

structBiTree*CreatBiTree(){

intx;

structBiTree*p;

scanf("%d",&x);

if(x!

=0){

p=(structBiTree*)malloc

(sizeof(structBiTree));

p->data=x;

p->lchild=CreatBiTree();

p->rchild=CreatBiTree();

}

else

p=NULL;

returnp;

}

voidSearchBST(structBiTree*T,intk){

if(!

T){

printf("你查找的数据不存在!

\n");

}

elseif(T->data==k){

printf("你查找的数据存在!

\n");

}

elseif(kdata){

SearchBST(T->lchild,k);

}

else{

SearchBST(T->rchild,k);

}

}

intmain(){

intkey;

chartemp;

structBiTree*T;

printf("请按先序序列输入排序二叉树\n");

T=CreatBiTree();

while(T==NULL){

printf("你输入的对叉树为空,请重新输入:

\n");

temp=getchar();

T=CreatBiTree();

}

printf("请输入你要查找的数据:

\n");

scanf("%d",&key);

SearchBST(T,key);

system("pause");

main();

return0;

}

五、实验结果与分析

[实习题运行结果截图]

7、讨论、心得

通过这次实验,我对查找方法有了更多的熟悉,对问题有了更深刻的认识。

实验五:

排序

一、实验目的和要求

通过本次实验,掌握线性表的排序方法,并分析时间复杂度。

二、存储结构和算法思想

存储结构]

待排序记录顺序存储。

[算法的基本思想]

快速排序算法每次任取一个记录的关键字为标准,将其余记录分为两组,将所有关键字小于或等于标准的记录都放在它的位置之前,将所有关键字大于标准的记录都放在它的位置之后。

对这两组再进行快速排序,直到完全有序。

每递归1次,递归深度加1。

三、主要仪器设备

惠普242G1型笔记本电脑

四、操作方法与实验步骤

[实习题源代码]

#defineNULL0

#include

#include

#include

typedefstructnode{

intx;

structnode*next;

}NODE;

voidread(NODE*head,intn){

intx;

NODE*p;

if(n==0)

return0;

p=(NODE*)malloc(sizeof(NODE));

head->next=p;

scanf("%d",&x);

p->x=x;

read(p,n-1);

}

voidwrite(NODE*head,intn){

NODE*p;

if(n==0)

return;

p=head->next;

printf("%d",p->x);

write(p,n-1);

}

voidpx(NODE*head,intn){

intmin;

inti,s=0;

NODE*p;

NODE*r;

NODE*t;

p=head->next;

r=head->next;

t=head;

min=p->x;

for(i=0;i

if(min>p->x){

min=p->x;

r=p;

s=i;

}

p=p->next;

}

for(i=0;i

t=t->next;

t->next=r->next;

r->next=head->next;

head->next=r;

px(head->next,n-1);

}

voidmain(){

intn;

NODE*head;

head=(NODE*)malloc(sizeof(NODE));

printf("输入个数n:

");

scanf("%d",&n);

printf("输入%d个数据:

\n",n);

read(head,n);

printf("您输入的数据为:

\n");

write(head,n);

printf("\n排序后的数据为:

\n");

px(head,n);

write(head,n);

getchar();

}

五、实验结果与分析

[实习题运行结果截图]

6、讨论、心得

时间复杂度 比较:

排序方法                最好情况               最坏情况            平均情况             稳定性       

      

冒泡排序                  O(n)                     O(n2)                O(n2)                   稳定

快速排序                  O(nlogn)              O(n2)                 O(nlogn)           不稳定

简单选择排序                                                                  O(n2)                 不稳定

堆排序                                                  O(nlogn)                                       不稳定

直接插入排序           O(n)                     O(n2)               O(n2)                   稳定

希尔排序                                                                         O(n1.3)              不稳定

归并排序                   O(nlogn)              O(nlogn)            O(nlogn)            稳定

基数排序                                                                         O(d(r+n))             稳定

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1